Подтвердить что ты не робот

PHP, передать массив через POST

Каков наиболее безопасный способ отправки массива через POST?

foreach ($id as $array)
{
<input type="hidden" name="prova[]" value="<?php echo $array; ?>"/>
}
<input type="submit" name="submit"/>

или используя implode() для создания единственной переменной, передайте переменную, а затем используйте explode(), чтобы вернуть значения в новый массив?

4b9b3361

Ответ 1

Изменить. Если вы спрашиваете о безопасности, см. мое добавление внизу Изменить

PHP имеет функцию serialize, предусмотренную для этой конкретной цели. Передайте ему массив, и он предоставит вам строковое представление. Если вы хотите преобразовать его обратно в массив, вы просто используете функцию unserialize.

$data = array('one'=>1, 'two'=>2, 'three'=>33);
$dataString = serialize($data);
//send elsewhere
$data = unserialize($dataString);

Это часто используется ленивыми кодонами для сохранения данных в базе данных. Не рекомендуется, но работает как быстрое/грязное решение.

Добавление

У меня создалось впечатление, что вы искали способ надежно передавать данные, а не "надежно". Независимо от того, как вы передаете данные, если она проходит через систему пользователей, вы не можете доверять ей вообще. Как правило, вы должны хранить его где-то на сервере и использовать учетные данные (cookie, session, password и т.д.), Чтобы просмотреть его.

Ответ 2

Вы можете поместить его в сеанс:

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 символов.

Я буду использовать сессии, где это возможно.

Ответ 3

Почему вы отправляете его через сообщение, если у вас уже есть его на стороне сервера (PHP)?

Почему бы просто не сохранить массив в переменной s $_SESSION, чтобы вы могли использовать его, когда форма отправляется, что может сделать ее более "защищенной", так как клиент не может изменить переменные, отредактировав исходный код.

Все зависит от того, что вы действительно хотите сделать.

Ответ 4

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'),
)
?>

Тег имени может работать как массив.

Ответ 5

Есть две вещи, которые следует учитывать: пользователи могут изменять формы, и вам необходимо обеспечить защиту от 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() для защиты вашего ввода. Это кодирует символы, такие как <, в &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).

Короче говоря, вам всегда нужно проверять свои входы позже, чтобы убедиться, что они имеют смысл и используют только безопасные входы в формы. Идентификатор файла (номер) является безопасным, поскольку вы можете проверить, существует ли этот номер, а затем извлечь имя файла из базы данных (это предполагает, что ваша база данных содержит подтвержденный ввод). Имя файла небезопасно по причинам, описанным выше. Вы должны либо повторно подтвердить имя файла, либо я могу изменить его на что-либо.