Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Можно ли в MySQL написать триггер для проверки вводимых данных?
Чтобы защититься от инжектирования.
Неактивен
Эм. Не могу себе представить, как можно написать на SQL что-то, что будет защищать
от SQL-injection. Это ж проблема более высокого уровня, до SQL доезжают уже хорошо
обработанные инжектированные строчки. Я не прав?
А вообще, конечно, чтобы избавиться от инжектирования, лучше применять голову. Она
одна способна решить все проблемы. В том числе и с инжектированием
Неактивен
Протупил я конечно сильно
Неактивен
Создать правило или check который стирает апострофы, проценты и названия некоторых функций при получении текста.
Так можно создать триггер в DBMS MySQL?
Неактивен
При получении какого текста?
Триггер срабатывает при выполнении запроса, а инъекция на стадии формирования запроса.
Посмотрите статью http://webew.ru/articles/2078.webew
Неактивен
Например триггер срабатывает до команды INSERT при этом проверяется содержится ли ',%,( в вставляемых данных, если вставляются то Raiserror и rollback tran
Есть в MySQL триггеры или нет?
Неактивен
Триггеры в MySQL есть http://dev.mysql.com/doc/refman/5.0/en/triggers.html
Но, во-первых, " The trigger cannot use statements that explicitly or implicitly begin or end a transaction such as START TRANSACTION, COMMIT, or ROLLBACK."
Во-вторых, приведенный вами пример не имеет никакого отношения к инъекциям. Действительно, с помощью триггеров можно проверять вносимые значения и в определенных случаях изменять их, но... Приведите пример хоть одной инъекции от которой вы сможите защититься с помощью триггера.
Неактивен
1 В MS SQL сервере может. Могу привести цитату из оналайн учебника
2 Имеет
Неактивен
http://www.intuit.ru/department/databas … /14/3.html
Во временную таблицу попадают данные которые потом вставляются в постоянную таблицу. Пишем триггер который при каждом INSERT проверяет в цикле есть ли "%" в поле Comment
В 2 часа ночи писать триггер для объяснения ломает
Что-то вроде:
CREATE TRIGGER trTrigger1
ON tTable1 FOR INSERT
AS
DECLARE @i INT, @varcharComment VARCHAR(255), @varcharLetter VARCHAR(1)
@i=0;
SELECT @varcharComment=Comment FROM inserted
WHILE @i<LEN(@varcharComment)
BEGIN
@i=@i+1;
@varcharLetter=SUBSTR(@varcharComment,@i,1);
IF @varcharLetter="%" THEN
BEGIN RAISERROR("Недопустимый символ, возможна попытка инжектирования",16,10);
ROLLBACK TRAN;
END
END
Отредактированно vlad275 (26.10.2009 02:09:44)
Неактивен
vlad275 написал:
1 В MS SQL сервере может. Могу привести цитату из оналайн учебника
Я верю, но ведь мы говорим о MySQL
Неактивен
vlad275 написал:
http://www.intuit.ru/department/database/sql/class/free/14/3.html
Во временную таблицу попадают данные которые потом вставляются в постоянную таблицу. Пишем триггер который при каждом INSERT проверяет в цикле есть ли "%" в поле Comment
Это конечно сделать можно, но в чем инъекция заключается?
Неактивен
И что делать в таком случае на MySQL?
Неактивен
vlad275 написал:
И что делать в таком случае на MySQL?
Если вы имеет в виду возможность отмены вставки в случае если нас не устраивают какие-то условия, то пишите хранимую процедуру, которая просто не будет осуществлять в данном случае вставку. И это правильный путь. А осуществлять INSERT, а потом проверку нужен ли он и возможно отмену...
Давайте так. Рассмотрим следующий случай:
<?php
....
$sql = "INSERT INTO tTable1 (comment) VALUES('".$_POST['comment']."');"
$result = mysql_query($sql) or die(mysql_error());
.....
?>
Я был столь невнимателен, что оставил возможность совершения инъекции. Предположим, что вы злоумышленник. Приведите пример того, что вы напишите в поле комментарий, а я докажу, что триггер в этом случае не поможет.
Неактивен
comment=nocomments+UNION+UPDATE+jos_users+SET+password=21232f297a57a5a7438
94a0e4a801fc3+WHERE+id=62
Неактивен
В результате в базу придет запрос
Неактивен
А если ввести эту строку в поле INT?
Неактивен
Вставить строку в целочисленное поле не удастся
По-моему, или онлайн-учебник врёт, или Вы его читаете неправильно: я не верю,
что можно написать на уровне базы данных что-то, что может защитить от инъекций.
Приведите пример MSSQL, который справляется с этой задачей?
Неактивен
Ограничение проверочное (CHECK) и правила
Данное ограничение используется для проверки допустимости данных, вводимых в конкретный столбец таблицы, т.е. ограничение CHECK обеспечивает еще один уровень защиты данных.
Ограничения целостности CHECK задают диапазон возможных значений для столбца или столбцов. В основе ограничений целостности CHECK лежит использование логических выражений.
Допускается применение нескольких ограничений CHECK к одному и тому же столбцу. В этом случае они будут применимы в той последовательности, в которой происходило их создание. Возможно применение одного и того же ограничения к разным столбцам и использование в логических выражениях значений других столбцов. Указание параметра NOT FOR REPLICATION предписывает не выполнять проверочных действий, если они выполняются подсистемой репликации.
Проверочные ограничения могут быть реализованы и с помощью правил. Правило представляет собой самостоятельный объект базы данных, который связывается со столбцом таблицы или пользовательским типом данных. Причем одно и то же правило может быть одновременно связано с несколькими столбцами и пользовательскими типами данных, что является неоспоримым преимуществом. Однако существенный недостаток заключается в том, что с каждым столбцом или типом данных может быть связано только одно правило. Разрешается комбинирование ограничений целостности CHECK с правилами. В этом случае выполняется проверка соответствия вводимого значения как ограничениям целостности, так и правилам.
Правило может быть создано командой:
CREATE RULE имя_правила AS выражение
Чтобы связать правило с тем или иным столбцом какой-либо таблицы, необходимо использовать системную хранимую процедуру:
sp_bindrule [@rulename=] 'rule' [@objname=] 'object_name' [,[@futureonly=['futureonly_flag']
Чтобы отменить правила, следует выполнить следующую процедуру:
sp_unbindrule [@objname=] 'object_name' [,[@futureonly=['futureonly_flag']
Удаление правила производится командой
DROP RULE {имя_правила} [,...n].
http://www.intuit.ru/department/database/sql/class/free/9/sql_9.html
Отредактированно vlad275 (26.10.2009 11:56:34)
Неактивен
CREATE TABLE Товар (КодТовара INT IDENTITY(1,1) PRIMARY KEY, Название VARCHAR(50) NOT NULL UNIQUE, Цена MONEY NOT NULL, Тип VARCHAR(50) NOT NULL, Сорт VARCHAR(50) NOT NULL CHECK(сорт in('первый','второй','третий')), Город VARCHAR(50) NOT NULL, Остаток INT CHECK(остаток>=0))
Неактивен
И как это соотносится с инъекциями?
Ну, чтобы не быть голословным, например, с такой:
SELECT * FROM Товар; DELETE FROM Товар
Неактивен
Выше я привел ограничение(Check) обеспечивающее еще один уровень защиты данных
Неактивен
Ну, в MySQL можете использовать вместо этого страшного чека — типизированные данные
CREATE TABLE tbl (
fieldname ENUM ('первый','второй','третий')
);
Кроме этих трех значений записать не удастся. Как дополнительный бонус — значения пишутся
не как строки, а как число, что экономит место.
Ну и к инъекциям это не имеет никакого отношения.
Неактивен
Страниц: 1