Сбросить и очистить параметры $ _GET - PullRequest
0 голосов
/ 08 февраля 2019

Таким образом, я знаю, что данные должны быть обработаны, когда они выводятся или отображаются, а НЕ когда они принимаются или сохраняются.Это то, что я делаю сейчас:

echo htmlspecialchars($name, ENT_QUOTES);

Мой вопрос: если я собираюсь получить параметры $ _GET и проверить их в базе данных, должен ли я все еще дезинфицировать и сбежать?Например:

$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();

Так нужно htmlspecialchars или мне просто нужно сделать $name = $_GET['name']?

Спасибо.

Ответы [ 4 ]

0 голосов
/ 08 февраля 2019

Итак, нужны ли htmlspecialchars или я должен просто сделать $ name = $ _GET ['name']?

Нет, это не нужно.

Сохранить вводданные как есть , не зависит от среды вывода.Он не должен быть подготовлен для безопасного встраивания HTML.

Что если завтра вам понадобятся эти данные в формате JSON для какого-либо API, PDF или настольного приложения?

0 голосов
/ 08 февраля 2019

Не используйте htmlspecialchars().bind() выполняет все экранирование и цитирование, которые вам необходимы.

В PHP имеется запутанный массив символов escape -

  • urlencode - при создании значения для URL.
  • htmlentities, htmlspecialcharacters - для <input>, <textarea>, <a> - экранирует только "&<>
  • nl2br (или <pre>) - для работы с окончаниями строки
  • mysql_real_escape_string - не использовать подпрограммы mysql*.
  • mysqli_real_escape_string - при экранировании в подпрограммах mysqli* - по крайней мере '"\
  • добавляет косые черты - почти так же хорошо, как и выше
  • hex, base64_encode - возможные ключи для работы с нетекстом

Что обычно лучше всего подходит при сохранении текста в таблице MySQL, достаточно экранировать только строкупройти мимо парсера.Этот выход исчезает, когда происходит обработка.Оставьте акцентированные символы и т. Д. В покое.

  • апостроф и двойные кавычки - они указывают на конец строки, поэтому вам нужно как-то их избежать.
  • обратная косая черта - традициябеглец.Но что, если вам нужен обратный слеш?

В PDO и mysqli PHP есть способы «связывания», которые сделают всю работу за вас.Если вместо этого вы используете «интерполяцию» PHP, такую ​​как

$sql = "SELECT * FROM t WHERE x = {$_GET['x']}";

, вы не получите экранирования и не получите защиту от SQL-инъекций. Не пишите код таким образом, если вы как-то уже не проверили аргументы.

Для HTML вам нужен другой набор escape-символов.Подумайте о <.Это вводит тег.Так как вы отображаете «меньше, чем»?Для этого вам понадобится html-сущность: &lt;.Это приводит к тому, что & становится проблематичным;следовательно &amp;.

0 голосов
/ 08 февраля 2019

Вы по-прежнему должны проверять входные данные в целях обеспечения целостности данных, например: убедитесь, что входные данные более или менее соответствуют ожидаемым для стабильности вашего приложения.Однако, поскольку вы используете подготовленные операторы, у вас нет острой необходимости «дезинфицировать» [или «испортить»] ваши данные, поскольку они более жестко инкапсулируются драйвером базы данных.

htmlspecialchars()делает данные безопасными для включения в HTML-документ и должен использоваться только при выводе данных в HTML-документ.Выполнение этого перед вставкой в ​​базу данных более или менее загрязняет ваши данные для использования во всем, отличном , чем HTML-документ.

0 голосов
/ 08 февраля 2019

PDO делает это даже проще, чем вы:

$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute([ 'name' => $_GET['name'] ]);

Вот и все.Готово.

Важно, чтобы вы не избегали вещей при использовании значений заполнителей, особенно при сопоставлении.htmlspecialchars является только релевантным в контексте HTML, кроме того, это наносит ущерб.Если вы показываете данные в JSON, в электронном письме или где-либо еще, используйте этот контекст и этот контекст только для * .

Если у кого-то есть имя, например «A & W», то при поискевы будете манипулировать вводом и на самом деле будете искать «A & W», что не соответствует их имени.Они получат ноль совпадений, а затем спросят вас, что не так с вашим сайтом.

only вещь, которую вы должны сделать с входными данными, - обрезать любые символы, которые могут помешать работе.поиск соответствия, например, начальные и конечные пробелы, которые кто-то мог случайно ввести .

...