Какой самый безопасный способ отправить массив через POST
?
foreach ($id as $array)
{
<input type="hidden" name="prova[]" value="<?php echo $array; ?>"/>
}
<input type="submit" name="submit"/>
или используя implode ()
для создания одной переменной, передайте переменную и затем используйте explode ()
, чтобы вернуть значения в новый массив?
Редактировать Если вы спрашиваете о безопасности, см. Мое приложение внизу Редактировать
PHP имеет функцию serialize, предоставленную для этой конкретной цели. Передайте ему массив, и он даст вам строковое представление. Когда вы хотите преобразовать его обратно в массив, вы просто используете функцию unserialize.
$data = array('one'=>1, 'two'=>2, 'three'=>33);
$dataString = serialize($data);
//send elsewhere
$data = unserialize($dataString);
Это часто используется ленивыми программистами для сохранения данных в базе данных. Не рекомендуется, но работает как быстрое / грязное решение.
Приложение
У меня сложилось впечатление, что вы искали способ отправлять данные надежно, а не «безопасно». Независимо от того, как вы передаете данные, если они проходят через систему пользователей, вы не можете доверять им вообще. Как правило, вы должны хранить его где-нибудь на сервере & используйте учетные данные (cookie, сеанс, пароль и т. д.), чтобы найти их.
Вы можете поместить это в сессию:
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 символов.
Я бы использовал сеансы везде, где это возможно.
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'),
)
?>
Тег имени может работать как массив.
Есть две вещи, которые нужно учитывать: пользователи могут изменять формы, и вам необходимо защититься от кросс-сайтового скриптинга (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 ()
для защиты вашего ввода. Это кодирует символы, такие как <
в & lt;
. Например:
<input type="hidden" name="prova[]" value="<?php echo htmlspecialchars($array); ?>"/>
Вы можете прочитать больше о XSS здесь: https://www.owasp.org/index.php/XSS
Модификация формы
Если бы я был на вашем сайте, я мог бы использовать инструменты разработчика Chrome или Firebug для изменения HTML вашей страницы. В зависимости от того, что делает ваша форма, это может быть использовано злонамеренно.
Я мог бы, например, добавить дополнительные значения в ваш массив или значения, которые не принадлежат массиву. Если бы это был менеджер файловой системы, я мог бы добавить файлы, которые не существуют, или файлы, которые содержат конфиденциальную информацию (например,.: заменить myfile.jpg
на ../index.php
или../db-connect.php
).
Короче говоря, вам всегда нужно проверять свои входы позже, чтобы убедиться, что они имеют смысл, и использовать только безопасные входы в формах. Идентификатор файла (номер) безопасен, поскольку вы можете проверить, существует ли номер, а затем извлечь имя файла из базы данных (это предполагает, что ваша база данных содержит проверенный ввод). Файл Имя небезопасен по причинам, описанным выше. Вы должны либо повторно подтвердить имя файла, либо я могу изменить его на что угодно.
Почему вы отправляете его через сообщение, если оно у вас уже есть на стороне сервера (PHP)?
Почему бы просто не сохранить массив в переменной s $ _SESSION
, чтобы вы могли использовать его при отправке формы, что может сделать его более «безопасным», поскольку тогда клиент не сможет изменить переменные, отредактировав источник.
Все зависит от того, что вы действительно хотите сделать.