Экранирование / очистка данных, извлеченных из базы данных - PullRequest
1 голос
/ 28 ноября 2011

Допустим, у меня есть веб-приложение, которое получает данные от пользователя и сохраняет их в базе данных.Предположим далее, что уязвимостей в системе безопасности нет - он правильно экранирует пользовательский ввод, использует параметры привязки и т. Д.

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


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

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

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

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

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

0 голосов
/ 28 ноября 2011

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

...