Является ли цикл foreach на $ _GET хорошим способом применения htmlspecialchars? - PullRequest
1 голос
/ 22 сентября 2011

Мне интересно, есть ли существенный недостаток в использовании следующего кода:

if(isset($_GET)){
foreach($_GET as $v){
    $v = htmlspecialchars($v);
}
}

Я понимаю, что, вероятно, нет необходимости использовать htmlspecialchars для каждой переменной. Кто-нибудь знает, если это полезно,

UPDATE:

Поскольку я не думаю, что мой вышеприведенный код будет работать, я обновляю его с помощью кода, который я использую (несмотря на отрицательность к предложениям). :)

if(isset($_GET)){
foreach($_GET as $k=>$v){
    $_GET[$k] = htmlspecialchars($v);
}
}

Ответы [ 4 ]

5 голосов
/ 22 сентября 2011

Это полностью зависит от того, что вы хотите сделать.

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

Короче говоря, храните ваши данные в необработанном виде и избегайте их специально дляего целевое использование , когда вы используете его:

  • для вывода HTML, используйте htmlentities().
  • для имен команд оболочки, используйте escapeshellcmd().
  • для аргументов оболочки используйте escapeshellarg().
  • для построения строки GET URL, используйте urlencode() для значений параметров.
  • для запросов к базе данных, используйте соответствующий escape-код базы данныхмеханизм (или подготовленные заявления).

Это рассуждение применяется рекурсивно.Так что, если вы хотите написать ссылку на GET URL для вывода HTML, это будет примерно так:

echo "<a href=" . htmlentities("$url?q=" . urlencode($var)) . ">click</a>";

Было бы ужасно, если бы в этот момент вам пришлось бы помнить, если$var уже ранее сбежал, и как.

3 голосов
/ 22 сентября 2011

Экранирование не требуется и, возможно, вредно для данных. Не делай этого.

Применять htmlspecialchars() только к данным, которые вы собираетесь выводить на HTML-странице - в идеале, непосредственно перед или непосредственно при выводе.

1 голос
/ 22 сентября 2011

То, как вы это делаете, не сработает. Вам нужно сделать $v ссылку, и она ломается для всего, что требует рекурсии (например, $_GET['array'][0]).

if(isset($_GET)) {
  foreach($_GET as &$v) {
    $v = htmlspecialchars($v);
  }
}
1 голос
/ 22 сентября 2011

Это не повлияет на числа, но может иметь неприятные последствия для строковых параметров, которые не предназначены для помещения в код HTML.

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

...