Если честно, я думаю, что автор этих функций либо не знает, что такое инъекции XSS и SQL, либо что именно делает используемая функция.
Просто назвать две странности:
Более того: Как правило, функции, защищающие XSS против повторного использования, не подходят для защиты от SQL-инъекций и наоборот. Потому что каждый язык и контекст имеют свои специальные символы, о которых нужно позаботиться.
Мой совет - узнать, почему и как возможно внедрение кода и как от него защититься. Изучите языки, с которыми вы работаете, особенно специальные символы и как их избежать.
Редактировать Вот некоторый (возможно, странный) пример: представьте, что вы позволяете своим пользователям вводить какое-то значение, которое следует использовать в качестве сегмента пути в URI, который вы используете в некотором коде JavaScript в onclick
значение атрибута. Итак, языковой контекст выглядит так:
И чтобы было веселее: вы сохраняете это входное значение в базе данных.
Теперь, чтобы правильно сохранить это входное значение в вашей базе данных, вам просто нужно использовать правильную кодировку для контекста, который вы собираетесь вставить, это значение в язык вашей базы данных (т.е. SQL); остальное не имеет значения (пока). Поскольку вы хотите вставить его в объявление строки SQL, контекстные специальные символы - это символы, которые позволяют вам изменить этот контекст. Что касается строковых объявлений, то это (особенно) символы "
, '
и \
, которые необходимо экранировать. Но, как уже говорилось, подготовленные заявления делают все, что работает для вас, поэтому используйте их.
Теперь, когда у вас есть значение в вашей базе данных, мы хотим вывести их правильно. Здесь мы переходим от самого внутреннего к внешнему контексту и применяем правильную кодировку в каждом контексте:
- Для контекста URI-сегмента нам нужно экранировать (как минимум) все те символы, которые позволяют нам изменить этот контекст; в этом случае
/
(оставить текущий сегмент пути), ?
и #
(оба оставить контекст пути URI). Для этого мы можем использовать rawurlencode
.
- Для контекста JavaScript string нам нужно позаботиться о
"
, '
и \
. Для этого мы можем использовать 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 имеет ссылки на символы, такие как "
. И не использование только одной из этих функций позволит нарушить контекст.