0

Доброй ночи.

Помогите, пожалуйста.

Никак не могу понять как правильно очищается массив с помощью htmlentities сущностей.

Пример кода:


$x = ['hello'=> '<script>', 
     'world'=>'<?php echo Hello?>'];

foreach ($x as $v) {

$clean=htmlentities($v);

}

print_r($clean);

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

Вот пример с 3-мя ключами, который выводит только последнее значение, а первые два - нет.

$x = ['hello'=> '<script>', 
      'world'=>'<?php echo Hello?>', 
      'ayco'=>'<style>'];

foreach ($x as $v) {

$clean=htmlentities($v);

}

print_r($clean);

В чем была не права?

Liza
  • 77
  • массивы не "очищают" с помощью htmlentities. вообще никогда. но в общем случае, для того чтобы обработка элемента не пропала, его надо записать обратно в массив – Ипатьев Dec 13 '20 at 18:55
  • @Ипатьев Спасибо за совет. А как тогда очищать данные правильно, если их около 20 штук в массиве?? Неужели каждую отдельно взятую переменную прописывать?? – Liza Dec 13 '20 at 19:03
  • Никак не очищать. Во-первых Htmlentities ничего не "очищает". Во-вторых, применять эту функцию надо при выводе. А там и проблемы такой не будет – Ипатьев Dec 13 '20 at 19:07
  • @Ипатьев переформулирую вопрос. Как обрабатывать данные чтобы при получении их от пользователей в форме они представли в безопасном виде и записались в базу данных, чтобы не было – Liza Dec 13 '20 at 19:09
  • 1
    Для начала надо подумать, какое вообще отношение может иметь функция с названием HTMLentities к SQL инъекциям. Вот просто на минутку задуматься. А про скрипты я писал выше - это делается при выводе. – Ипатьев Dec 13 '20 at 19:12
  • @Ипатьев PHP создан чтобы управлять значениями переменных и массивов, все что вводит пользователь в основном в нашем случае - это текс и цифры, иные символы, которые нужно обработать. Просто напишите как эти данные обезопасить, с помощью каких функций, дальше я сама найду. – Liza Dec 13 '20 at 19:19
  • Как защититься от SQL инъекции я только что отвечал, https://ru.stackoverflow.com/questions/1218184/%d0%9a%d0%b0%d0%ba-%d0%b7%d0%b0%d1%89%d0%b8%d1%82%d0%b8%d1%82%d1%8c-%d1%84%d0%be%d1%80%d0%bc%d1%83-%d0%be%d1%82-sql-%d0%b8%d0%bd%d1%8a%d0%b5%d0%ba%d1%86%d0%b8%d0%b8 – Ипатьев Dec 13 '20 at 19:22
  • А про скрипты, я уже два раза сказал, htmlspecialchars при выводе. – Ипатьев Dec 13 '20 at 19:23

1 Answers1

0

Вы не изменяете исходный массив, а создаёте новую переменную, которая перезаписывается при каждой итерации foreach, а выводится один раз после всех итераций, то есть выводится последнее её значение.

Чтобы изменить исходный массив, нужно на него ссылаться при помощи «&» (Присваивание по ссылке):

$array = [
    'hello' => '<script>', 
    'world' => '<?php echo Hello?>', 
    'ayco' => '<style>'
];

foreach ($array as &$linked_value) {

$linked_value = htmlentities($linked_value);

}

print_r($array);

Или использовать ключи:

$array = [
    'hello' => '<script>', 
    'world' => '<?php echo Hello?>', 
    'ayco' => '<style>'
];

foreach ($array as $key => $value) {

$array[$key] = htmlentities($value);

}

print_r($array);

Если вы пытаетесь предотвратить инъекции, вам не поможет htmlentities — почитайте ответы на вопрос «Грамотная защита от SQL-Injection»

Michael
  • 157
  • вот прямо двойственные чувства. безукоризненно грамотный ответ - но во ответ на совершенно бессмысленный вопрос, и как результат - показывающий как выполнить бессмысленную и вредную работу. – Ипатьев Dec 14 '20 at 07:33