htmlspecialchars () - Как и когда использовать и избегать многократного использования - PullRequest
5 голосов
/ 02 июня 2010

Я строю интранет PHP для моего босса. Простой клиент, заказ, система котировок. Ему будет отказано в доступе из Интернета, и им будут пользоваться только 3 человека. Я не так озабочен безопасностью, как проверкой. Javascript отключен на всех машинах.

У меня проблема в следующем:

  1. Сотрудник вводит действительные данные в форму, содержащую любое из следующих :;[]"' и т. Д.
  2. Форма $ _POSTS помещает эти данные на страницу validationAndProcessing.php и определяет, вводил ли сотрудник данные в поля или нет. Если они этого не сделали, они перенаправляются обратно на страницу ввода данных, а пропущенное поле выделяется красным.
  3. htmlspecialchars () применяется ко всем данным, которые повторно заполняются в форму из того, что они вводили ранее.
  4. Форма затем повторно отправляется на страницу validationAndProcessing.php, если успешные данные вводятся в базу данных и сотрудник отображается на странице данных.

Мой вопрос такой:

Если сотрудник повторно не вводит данные на шаге 1, он будет продолжать перемещаться между шагами 1 и 4 каждый раз, когда к данным применяется htmlspecialchars ().

So that:- &
becomes:- &
becomes:- &
becomes:- &

и т.д ..

Как я могу остановить многократное применение htmlspecialchars () к уже очищенным данным?

Спасибо, Адам

Ответы [ 3 ]

5 голосов
/ 02 июня 2010

Проверьте страницу руководства на htmlspecialchars :

string htmlspecialchars (строка $ string [, int $ quote_style = ENT_COMPAT [, строка $ charset [, bool $ double_encode = true ]]])

параметр $double_encode должен быть тем, что вы ищете.

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

4 голосов
/ 02 июня 2010

Вы должны использовать только htmlspecialchars в выводе HTML, и нигде больше.

<input name="var" value="<?php echo htmlspecialchars($var)?>">

Если бы $var содержал, скажем, амперсанд, то в HTML он вывел бы закодированное значение:

<input name="var" value="this&amp;that">

Однако пользователь будет видеть только this&that в своем поле ввода, и после отправки $_GET['var'] будет this&that, а не закодированной версией.

Что касается PHP, единственное, что вы можете сделать, - это удалить косую черту, если включены магические кавычки:

if (get_magic_quotes_gpc())
    $var = stripslashes($_POST['var']);
else
    $var = $_POST['var'];

Оттуда вы должны хранить необработанные данные в базе данных, а не HTML-кодированные версии. Чтобы избежать внедрения SQL, используйте mysql_real_escape_string, если вы используете обычные функции mysql, или вместо этого используйте PDO .

0 голосов
/ 02 июня 2010
So that:- &
becomes:- &amp;
becomes:- &amp;amp;
becomes:- &amp;amp;amp;

Вы просто не правы. Просто попробуйте и посмотрите

<form>
<input name="a" value="<?=htmlspecialchars($_GET["a"])?>">
<input type=submit>
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...