2011-11-28 3 views
1

Предположим, у меня есть веб-приложение, которое вводит пользователя и сохраняет его в базе данных. Предположим далее, что нет уязвимостей в системе безопасности - он правильно избегает ввода пользователя, использует параметры привязки, что угодно.Исключение/дезинфекция данных, полученных из базы данных

Должны ли данные, полученные из базы данных, обрабатываться с подозрением (т. Е. Как потенциально зараженные/вредоносные)?


Пример (не уверен в результате, потому что я боюсь попробовать). Это база данных:

create table mytable (id int primary key, name varchar(50)); 

create table othertable (name varchar(50), xyz int, 
    ... `name` is an fk ...); 

insert into mytable (id, name) values(1, '"abc"; drop table mytable;'); 

insert into othertable (name, xyz) values('"abc"; drop table mytable;', 45475); 

Тогда я запускаю этот псевдо-код (возможно, из PHP, например):

# run query 'select * from mytable where id = 1'; 

# put the `name` in $name 

# run query 'select * from othertable where name = $name' 
# $name is not escaped, no other precautions taken 

ответ

0

Уязвимость происходит в точке, где вы подставим $name. Всегда избегайте замещения.

1

Вы ДОЛЖНЫ снова уйти. Все экранирование - это «SQL, это не ориентированная на команду», это часть данных ». Поэтому, если вы выйдете из «одного», SQL сохранит «\» один и «выводит ...» «один». Это означает, что вам нужно избегать снова и снова.

Еще лучше, вместо использования обычных функций mysql_, использовать подготовленные операторы из mysqli_ или PDO. Я продвигаю свои собственные программные подходы, потому что они устраняют необходимость ускользания. (Основная идея заключается в том, что вместо отправки строки запроса, которая должна быть проанализирована с данными «на месте», вы отправляете строку запроса с заполнителями и затем указываете SQL «помните тот запрос, который я дал вам раньше?» Используйте значения X , Y и Z. В результате значения никогда не имеют возможности повредить обработку фактического запроса)

Смежные вопросы