Очистка данных пользователя в ДОБИРАЕТСЯ PHP

Как насчет страницы задержки, где пользователь должен ожидать задержки, которую показывают в изображении?

Вы только делаете упорядочивание от страницы, которую они получают к тому, если они нажимают в течение достаточно короткого периода времени указанного в изображении, возможно, изображение могло делать обратный отсчет в анимированном gif или очень маленьком JavaScript или высвечивать таймер.

, Если они переходят к странице деталей вне ограничения по времени, они видят дорогой объект, как обсуждено в предыдущих ответах.

30
задан Léo Léopold Hertz 준영 21 August 2009 в 22:46
поделиться

4 ответа

Как вы очищаете данные в $ _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']));

Затем, когда в вашем имени пользователя был знак "&", он загадочным образом превратился бы в '& amp;' в вашей базе данных, и если бы в вашем имени пользователя был апостроф, он превратился бы в два апострофа на странице. Тогда, когда у вас есть форма с этими символами, легко закончить двойным экранированием вещей, когда они редактируются, поэтому так много плохих PHP CMS заканчиваются сломанными названиями статей, такими как «Новые книги от O \\\\ \\\\\\\\\\\\\\\ 'Reilly ».

Естественно, вспоминать pg_escape_string или mysql_real_escape_string и htmlspecialchars каждый раз, когда вы отправляете переменную, немного утомительно, поэтому все хотят сделать это (неправильно) в одном месте в начале скрипта. Для вывода HTML вы можете, по крайней мере, сэкономить на вводе, определив функцию с коротким именем, которое выполняет echo (htmlspecialchars (...)).

Для SQL лучше использовать параметризованные запросы. Для Postgres существует pg_query_params . Или, действительно, подготовленные заявления, как вы упомянули (хотя я лично считаю их менее управляемыми). В любом случае вы можете забыть о «дезинфекции» или экранировании для SQL, но вы все равно должны избегать, если вы встраиваете другие типы строк, включая HTML.

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

(*: as Во всяком случае, общий подход к решению проблем с инъекциями. Естественно, существуют специфичные для домена проверки, которые стоит выполнить в определенных полях, и есть полезные задачи очистки, которые вы можете выполнить, например, удалить все управляющие символы из отправленных значений. Но это не то, что большинство PHP-кодеров подразумевают под очисткой.)

78
ответ дан 27 November 2019 в 23:12
поделиться

Вы должны дезинфицировать все запросы, а не только POST как GET.

Вы можете использовать функцию htmlentities () , функцию preg_replace () с регулярным выражением или фильтровать по исполнению:

<?
$id = (int)$_GET['id'];
?>

[]'s

3
ответ дан 27 November 2019 в 23:12
поделиться

Если вы прочитаете трассировку, она точно скажет вам, что происходит:

    if value is not None and not value.has_key():
AttributeError: 'unicode' object has no attribute 'has_key'

Здесь говорится об используемой вами переменной value не не имеют атрибута has_key . И он говорит вам, что ваша переменная value не является словарем, поскольку, похоже, вы ожидаете ... вместо этого это объект Unicode, который по сути является строкой.

magic_quotes_gpc не рекомендуется, вам следует дезинфицировать данные, которыми вы манипулируете, в зависимости от использования этих данных.
2
ответ дан 27 November 2019 в 23:12
поделиться

Если вы говорите о дезинфекции вывода, я бы рекомендовал хранить контент в вашей базе данных в его полной, неэкранированной форме, а затем экранировать его ( htmlspecialchars или что-то в этом роде), когда вы выводите данные эхом, поэтому у вас будет больше возможностей для вывода. См. этот вопрос для обсуждения очистки / экранирования содержимого базы данных.

С точки зрения хранения в postgres, используйте pg_escape_string для каждой переменной в запросе, чтобы избежать кавычек и вообще защитить от внедрения SQL.

Изменить:

Мои обычные шаги для сохранения данных в базе данных и последующего их извлечения:

  1. Вызов функции экранирования данных базы данных (pg_escape_string, mysql_escape_string и т. д.), чтобы избежать каждого входящая переменная $ _GET, используемая в вашем запросе. Обратите внимание, что использование этих функций вместо добавления косых черт приводит к отсутствию лишних косых черт в тексте при сохранении в базе данных.

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

5
ответ дан 27 November 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: