Какой самый безопасный способ отправки массива через POST
?
foreach ($id as $array) { <input type="hidden" name="prova[]" value="<?php echo $array; ?>"/> } <input type="submit" name="submit"/>
или с помощью implode()
чтобы создать одну переменную, передать переменную, а затем использовать explode()
чтобы вернуть значения в новый массив?
Редактировать Если вы спрашиваете о безопасности, см. Мое добавление внизу Править
PHP имеет функцию сериализации, предусмотренную для этой конкретной цели. Передайте ему массив, и он предоставит вам строковое представление. Когда вы хотите преобразовать его обратно в массив, вы просто используете функцию unserialize .
$data = array('one'=>1, 'two'=>2, 'three'=>33); $dataString = serialize($data); //send elsewhere $data = unserialize($dataString);
Это часто используется ленивыми кодировщиками для сохранения данных в базе данных. Не рекомендуется, но работает как быстрое / грязное решение.
добавление
У меня создалось впечатление, что вы искали способ надежно передавать данные, а не «надежно». Независимо от того, как вы передаете данные, если она проходит через систему пользователей, вы не можете доверять ей вообще. Как правило, вы должны хранить его где-то на сервере и использовать учетные данные (cookie, session, password и т. Д.), Чтобы просмотреть его.
Вы можете поместить его в сеанс:
session_start(); $_SESSION['array_name'] = $array_name;
Или, если вы хотите отправить его через форму, вы можете сериализовать его:
<input type='hidden' name='input_name' value="<?php echo htmlentities(serialize($array_name)); ?>" /> $passed_array = unserialize($_POST['input_name']);
Обратите внимание, что для работы с сериализованными массивами вам необходимо использовать POST как метод передачи формы, так как GET имеет ограничение на размер около 1024 символов.
Я буду использовать сессии, где это возможно.
Почему вы отправляете его через сообщение, если у вас уже есть его на стороне сервера (PHP)?
Почему бы просто не сохранить массив в переменной s $_SESSION
чтобы вы могли использовать его, когда форма отправляется, что может сделать ее более «защищенной», так как клиент не может изменить переменные, отредактировав исходный код.
Все зависит от того, что вы действительно хотите сделать.
http://php.net/manual/en/reserved.variables.post.php
На первый комментарий отвечает это.
<form ....> <input name="person[0][first_name]" value="john" /> <input name="person[0][last_name]" value="smith" /> ... <input name="person[1][first_name]" value="jane" /> <input name="person[1][last_name]" value="jones" /> </form> <?php var_dump($_POST['person']); array ( 0 => array('first_name'=>'john','last_name'=>'smith'), 1 => array('first_name'=>'jane','last_name'=>'jones'), ) ?>
Тег имени может работать как массив.
Есть две вещи, которые следует учитывать: пользователи могут изменять формы, и вам необходимо обеспечить защиту от Cross Site Scripting (XSS).
XSS
XSS – это когда пользователь вводит HTML в свой ввод. Например, что, если пользователь представил это значение ?:
" /><script type="text/javascript" src="http://example.com/malice.js"></script><input value="
Это будет записано в вашу форму следующим образом:
<input type="hidden" name="prova[]" value="" /><script type="text/javascript" src="http://example.com/malice.js"></script><input value=""/>
Лучшим способом защиты от этого является использование htmlspecialchars()
для защиты вашего ввода. Это кодирует символы, такие как <
в <
, Например:
<input type="hidden" name="prova[]" value="<?php echo htmlspecialchars($array); ?>"/>
Подробнее о XSS вы можете прочитать здесь: https://www.owasp.org/index.php/XSS
Модификация формы
Если бы я был на вашем сайте, я мог бы использовать инструменты разработчика Chrome или Firebug для изменения HTML-страницы вашей страницы. В зависимости от того, что делает ваша форма, это можно использовать злонамеренно.
Например, я могу добавить дополнительные значения в ваш массив или значения, которые не входят в массив. Если это был менеджер файловой системы, я мог бы добавлять файлы, которые не существуют, или файлы, содержащие конфиденциальную информацию (например: replace myfile.jpg
с ../index.php
или ../db-connect.php
).
Короче говоря, вам всегда нужно проверять свои входы позже, чтобы убедиться, что они имеют смысл и используют только безопасные входы в формы. Идентификатор файла (номер) является безопасным, поскольку вы можете проверить, существует ли этот номер, а затем извлечь имя файла из базы данных (это предполагает, что ваша база данных содержит подтвержденный ввод). Имя файла небезопасно по причинам, описанным выше. Вы должны либо повторно подтвердить имя файла, либо я могу изменить его на что угодно.