web-dev-qa-db-ja.com

PHP、POSTを介して配列を渡す

POSTを介して配列を送信する最も安全な方法はどれですか?

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

またはimplode()を使用して単一の変数を作成し、変数を渡してからexplode()を使用して値を新しい配列に戻しますか?

19
user1722791

Editセキュリティについて質問している場合は、一番下の付録を参照してくださいEdit

PHPには、この特定の目的のために提供される serialize 関数があります。配列を渡すと、文字列表現が得られます。配列に戻す場合は、 nserialize 関数を使用するだけです。

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

これは、データをデータベースに保存するために、怠zyなコーダーがよく使用します。推奨されませんが、クイック/ダーティソリューションとして機能します。

補遺

「安全に」ではなく、確実にデータを送信する方法を探しているという印象を受けました。どのようにデータを渡しても、それがユーザーシステムを通過する場合は、まったく信頼できません。一般に、サーバー上のどこかに保存し、資格情報(Cookie、セッション、パスワードなど)を使用して検索する必要があります。

26
MrGlass

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

名前タグは配列として機能します。

14
seamus

セッションに入れることができます:

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文字のサイズ制限があるためです。

可能な限りセッションを使用します。

14
laxonline

考慮すべきことが2つあります。ユーザーはフォームを変更でき、クロスサイトスクリプティング(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_に置き換えます)。

つまり、入力を意味のあるものにするために、後で入力を常にチェックし、フォームでは安全な入力のみを使用する必要があります。ファイルID(数字)は安全です。数字が存在するかどうかを確認し、データベースからファイル名を抽出できるためです(データベースに検証済みの入力が含まれていることを前提としています)。 FileNameは、上記の理由により安全ではありません。ファイル名を再検証する必要があります。そうしないと、ファイル名を変更できます。

6
Chris

サーバー(PHP)側に既にあるのに、なぜポストを通して送信するのですか?

配列をs $_SESSION変数を使用すると、フォームが送信されたときに使用できるようになります。これにより、クライアントはソースを編集して変数を変更できなくなるため、より安全になります。

それはすべてあなたが本当に何をしたいかに依存します。

6
Neal