Ответ 1
Как вы дезинфицируете данные в $_GET-переменных с помощью PHP?
Вы не дезактивируете данные в $_GET. Это общий подход в PHP-скриптах, но он полностью неправильный *.
Все ваши переменные должны оставаться в текстовой форме до момента, когда вы вставляете их в другой тип строки. Существует не одна форма экранирования или "санитария", которая может охватывать все возможные типы строк, в которые вы могли бы вставлять ваши значения.
Итак, если вы встраиваете строку в SQL-запрос, вам нужно выйти из нее на выходе:
$sql= "SELECT * FROM accounts WHERE username='".pg_escape_string($_GET['username'])."'";
И если вы выплевываете строку в HTML, вам нужно ее избежать:
Cannot log in as <?php echo(htmlspecialchars($_GET['username'], ENT_QUOTES)) ?>.
Если вы сделали оба этих шага экранирования в массиве $_GET в начале, как рекомендовано людьми, которые не знают, что они делают:
$_GET['username']= htmlspecialchars(pg_escape_string($_GET['username']));
Затем, когда у вас был "& в вашем имени пользователя, таинственно превратится в '& в вашей базе данных, и если у вас был апостроф в вашем имени пользователя, он превратился бы в два апострофа на странице. Тогда, когда у вас есть форма с этими символами, в этом случае легко закончить двойное экранирование, когда они редактируются, поэтому многие плохие PHP CMS заканчиваются сломанными заголовками статей, такими как" Новые книги из O \\\\ \\\\\\\\\\\\\\\ 'Reilly".
Естественно, помня о pg_escape_string или mysql_real_escape_string и htmlspecialchars каждый раз, когда вы отправляете переменную, это немного утомительно, поэтому каждый хочет сделать это (неправильно) в одном месте в начале script. Для вывода HTML вы можете, по крайней мере, сохранить некоторую типизацию, указав функцию с коротким именем, которое выполняет эхо (htmlspecialchars (...)).
Для SQL вам лучше использовать параметризованные запросы. Для Postgres pg_query_params. Или действительно, подготовленные заявления, как вы упомянули (хотя я лично считаю их менее управляемыми). В любом случае вы можете забыть о "дезинфекции или утечке для SQL", но вы все равно должны избегать, если вы вставляете другие типы строк, включая HTML.
strip_tags() не является хорошим способом обработки ввода для отображения HTML. Раньше у него были проблемы с безопасностью, поскольку анализаторы браузеров на самом деле намного сложнее в интерпретации того, что может быть тегом, чем вы могли бы подумать. htmlspecialchars() почти всегда правильная вещь для использования вместо этого, так что, если кто-то набирает меньше, чем знак, они на самом деле получают буквальный знак меньше, чем знак, и не обнаруживают, что их текст таинственно исчезает.
(*: как общий подход к решению проблем с инъекциями, в любом случае. Естественно, существуют определенные для домена проверки, которые стоит делать на определенных полях, и есть полезные задачи очистки, которые вы можете сделать, например, удаление всех управляющих символов из представленных значений. Но это не то, что большинство программистов PHP подразумевает под дезинфекцией.)