SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.10.2009 21:27:30

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Можно ли в MySQL написать триггер для проверки вводимых данных?

Можно ли в MySQL написать триггер для проверки вводимых данных?
Чтобы защититься от инжектирования.

Неактивен

 

#2 25.10.2009 22:52:29

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Эм. Не могу себе представить, как можно написать на SQL что-то, что будет защищать
от SQL-injection. Это ж проблема более высокого уровня, до SQL доезжают уже хорошо
обработанные инжектированные строчки. Я не прав?

А вообще, конечно, чтобы избавиться от инжектирования, лучше применять голову. Она
одна способна решить все проблемы. В том числе и с инжектированием wink

Неактивен

 

#3 25.10.2009 23:27:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Протупил я конечно сильно roll

Неактивен

 

#4 26.10.2009 00:13:12

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Создать правило или check который стирает апострофы, проценты и названия некоторых функций при получении текста.
Так можно создать триггер в DBMS MySQL?

Неактивен

 

#5 26.10.2009 00:34:33

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

При получении какого текста?
Триггер срабатывает при выполнении запроса, а инъекция на стадии формирования запроса.

Посмотрите статью  http://webew.ru/articles/2078.webew

Неактивен

 

#6 26.10.2009 00:44:01

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Например триггер срабатывает до команды INSERT при этом проверяется содержится ли ',%,( в вставляемых данных, если вставляются то Raiserror и rollback tran

Есть в MySQL триггеры или нет?

Неактивен

 

#7 26.10.2009 01:25:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Можно ли в 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."

Во-вторых, приведенный вами пример не имеет никакого отношения к инъекциям.  Действительно, с помощью триггеров можно проверять вносимые значения и в определенных случаях изменять их, но... Приведите пример хоть одной инъекции от которой вы сможите защититься с помощью триггера.

Неактивен

 

#8 26.10.2009 01:50:12

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

1 В MS SQL сервере может. Могу привести цитату из оналайн учебника

2 Имеет

Неактивен

 

#9 26.10.2009 01:58:17

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

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)

Неактивен

 

#10 26.10.2009 02:08:06

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

vlad275 написал:

1 В MS SQL сервере может. Могу привести цитату из оналайн учебника

Я верю, но ведь мы говорим о MySQL wink

Неактивен

 

#11 26.10.2009 02:09:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

vlad275 написал:

http://www.intuit.ru/department/database/sql/class/free/14/3.html
Во временную таблицу попадают данные которые потом вставляются в постоянную таблицу. Пишем триггер который при каждом INSERT проверяет в цикле есть ли "%" в поле Comment

Это конечно сделать можно, но в чем инъекция заключается?

Неактивен

 

#12 26.10.2009 02:10:18

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

И что делать в таком случае на MySQL?

Неактивен

 

#13 26.10.2009 03:11:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

vlad275 написал:

И что делать в таком случае на MySQL?

Если вы имеет в виду возможность отмены вставки в случае если нас не устраивают какие-то условия, то пишите хранимую процедуру, которая просто не будет осуществлять в данном случае вставку. И это правильный путь. А осуществлять INSERT, а потом проверку нужен ли он и возможно отмену...


Давайте так. Рассмотрим следующий случай:
<?php
....
$sql = "INSERT INTO tTable1 (comment) VALUES('".$_POST['comment']."');"
$result = mysql_query($sql) or die(mysql_error());
.....
?>
Я был столь невнимателен, что оставил возможность совершения инъекции. Предположим, что вы злоумышленник. Приведите пример того, что вы напишите в поле комментарий, а я докажу, что триггер в этом случае не поможет.

Неактивен

 

#14 26.10.2009 09:30:36

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

comment=nocomments+UNION+UPDATE+jos_users+SET+password=21232f297a57a5a7438

94a0e4a801fc3+WHERE+id=62

Неактивен

 

#15 26.10.2009 10:48:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

В результате в базу придет запрос

INSERT INTO tTable1 (comment) VALUES('comment=nocomments+UNION+UPDATE+jos_users+SET+password=21232f297a57a5a743894a0e4a801fc3+WHERE+id=62')

который отлично выполнится без всяких инъекций. В поле cooment таблицы tTable1 будет записано значение 'comment=nocomments+UNION+UPDATE+jos_users+SET+password=21232f297a57a5a743894a0e4a801fc3+WHERE+id=62'

Пример инъекции отсутствует wink

P.S. Рекомендую всё-таки прочитать статью  http://webew.ru/articles/2078.webew
Возможно после этого вы сразу со мной согласитесь.

Неактивен

 

#16 26.10.2009 11:17:07

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

А если ввести эту строку в поле INT?

Неактивен

 

#17 26.10.2009 11:47:24

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Вставить строку в целочисленное поле не удастся wink

По-моему, или онлайн-учебник врёт, или Вы его читаете неправильно: я не верю,
что можно написать на уровне базы данных что-то, что может защитить от инъекций.
Приведите пример MSSQL, который справляется с этой задачей?

Неактивен

 

#18 26.10.2009 11:54:44

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Ограничение проверочное (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)

Неактивен

 

#19 26.10.2009 11:55:56

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Код:

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))

Неактивен

 

#20 26.10.2009 12:06:01

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

И как это соотносится с инъекциями?

Ну, чтобы не быть голословным, например, с такой:
SELECT * FROM Товар; DELETE FROM Товар

Неактивен

 

#21 26.10.2009 12:13:34

vlad275
Завсегдатай
Зарегистрирован: 08.10.2009
Сообщений: 25

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Выше я привел ограничение(Check)  обеспечивающее еще один уровень защиты данных

Неактивен

 

#22 26.10.2009 12:22:20

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Можно ли в MySQL написать триггер для проверки вводимых данных?

Ну, в MySQL можете использовать вместо этого страшного чека — типизированные данные
CREATE TABLE tbl (
   fieldname ENUM ('первый','второй','третий')
);

Кроме этих трех значений записать не удастся. Как дополнительный бонус — значения пишутся
не как строки, а как число, что экономит место.

Ну и к инъекциям это не имеет никакого отношения.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson