Если честно, я думаю, что автор этой функции не имеет ни малейшего представления о том, какие инъекции XSS и SQL или что именно делает используемая функция.
Просто назвать две странности:
Кроме того: функции, защищающие снова XSS, не подходят для защиты повторных SQL-инъекций и наоборот. Потому что у каждого языка и контекста есть свои специальные символы, о которых нужно позаботиться.
Мой совет - узнать, почему и как вводится инъекция кода, и как защитить его. Изучайте языки, с которыми работаете, особенно специальные персонажи и способы их устранения.
Редактировать Вот некоторые (вероятно, странно) пример: Представьте, что вы позволяют пользователям вводить некоторое значение, которое должно использоваться в качестве сегмента пути в URI, который вы используете в некотором коде JavaScript в значении в onclick
атрибута , Таким образом, контекст языка выглядит следующим образом:
- значение атрибута HTML строка
И чтобы сделать его более увлекательным : Вы сохраняете это входное значение в объявлении atabase.
Теперь, чтобы правильно сохранить это входное значение в вашей базе данных, вам просто нужно использовать правильную кодировку для контекста, который вы собираетесь вставить это значение на свой язык базы данных (т. Е. SQL); остальное не имеет значения (пока). Поскольку вы хотите вставить его в объявление строки SQL, контекстные специальные символы - это символы, которые позволяют вам изменять этот контекст. Что касается описаний строк, эти символы являются (особенно) , '
и \
символами, которые должны быть экранированы. Но, как уже было сказано, подготовленные заявления делают все, что сработает для вас, поэтому используйте их.
Теперь, когда у вас есть значение в вашей базе данных, мы хотим их правильно выводить. Здесь мы исходим из сокровенных к внешнему контексту и применить правильную кодировку в каждом контексте:
- Для URI сегмента пути контекста, мы должны бежать (по крайней мере) все те символы, которые позволяют нам изменить этот контекст ; в этом случае
/
(оставить текущий сегмент пути), ?
и #
(оба из них оставляют контекст URI-пути). Для этого мы можем использовать rawurlencode
.
- Для Строка JavaScript контексте нам необходимо позаботиться о
"
, '
и \
. Для этого мы можем использовать json_encode
(если имеется).
- Для значения атрибута HTML мы должны заботиться о
&
, "
, '
и <
. Для этого мы можем использовать htmlspecialchars
.
Теперь все вместе:
'… onclick="'.htmlspecialchars('window.open("http://example.com/'.json_encode(rawurlencode($row['user-input'])).'")').'" …'
Теперь, если $row['user-input']
является "bar/baz"
выход:
… onclick="window.open("http://example.com/"%22bar%2Fbaz%22"")" …
Но используя все эти функции в этих условиях не слишком много.Поскольку контексты могут иметь похожие специальные символы, они имеют разные escape-последовательности. URI имеет так называемую процентную кодировку, JavaScript имеет escape-последовательности, такие как \"
, а HTML имеет ссылки на символы, такие как "
. И не использование только одной из этих функций позволит нарушить контекст.
Из какой книги? – Gumbo
Изучение PHP MySQL и Javascript – jpjp
@jpjp: ... и я подумал, что О'Рейли просто для искушенных авторов. – Gumbo