Почему нельзя использовать htmlspecialchars в цикле foreach с массивом? - PullRequest
0 голосов
/ 07 июня 2018

Я работаю над некоторыми вопросами безопасности, и php дает мне странное поведение.Не могли бы вы помочь мне выяснить, что происходит?:)

Итак, у меня есть массив входных данных, например,

$first_name = "<script>alert();</script>";
$middle_name = 'Robert';
$last_name = 'Smith';
$username = 'testusername1';
$email = "testemail@mail.com";
$password = 'banana1';

, и я проверяю их на XSS, используя htmlspecialchars, вот так.

$first_name = htmlspecialchars($first_name, ENT_QUOTES, 'UTF-8');

Это прекрасно работает, чтобы остановить выполнение сценария в $ first_name.

Однако вставьте этот код в цикл foreach, и предупреждение javascript будет запущено.

Вот мой текущий цикл foreach (не работает должным образом)

$strings = 
array($first_name,$middle_name,$last_name,$username,$email,$password);

foreach($strings as $string) {
    $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}

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

Спасибо за помощь.

Андрей

Ответы [ 5 ]

0 голосов
/ 07 июня 2018

foreach работает с копией массива, изменения не сохраняются.

// your array
$strings = array(
    'first_name'    => $firstname,
    'middle_name'   => $middle_name,
    'last_name'     => $last_name,
    'user_name'     => $username,
    'email'         => $email,
    'password'      => $password
);

// filtered: the array which contains your escaped data.
$filtered = array_map(function($string) { 
                  return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); 
            }, $strings);

// to access your filtered data:
// $filtered['first_name'] contains the filtered first name
// $filtered['middle_name'] contains the filtered middle name
// and so on ...
0 голосов
/ 07 июня 2018

в foreach есть проблема, возможно, функция htmlspecialchars будет работать правильно.пожалуйста, проверьте следующую статью.

https://stackoverflow.com/questions/10057671/how-does-php-foreach-actually-work
0 голосов
/ 07 июня 2018

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

foreach($strings as $index=>$string) {
    $strings[$index] = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
0 голосов
/ 07 июня 2018

Вы можете использовать следующий метод без ссылок:

foreach($strings as $key => $string) {
    $strings[$key] = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
0 голосов
/ 07 июня 2018

Похоже, вы пытаетесь создать цикл foreach по ссылке. Вам нужно &, чтобы изменения в данных foreach сохранялись вне этого цикла ...

foreach($strings as $string) {

Должно быть:

foreach($strings as &$string) {

Как любезно указано @CBroe, мы должны использовать unset для освобождения переменной, используемой в цикле foreach ... Поэтому ваше полное решение будетстать:

$strings = 
array($first_name,$middle_name,$last_name,$username,$email,$password);

foreach($strings as &$string) {
    $string = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}     

unset($string);
...