2012-12-28 25 views
12

POSTで配列を送信する最も安全な方法はどれですか?PHP、POST経由で配列を渡す

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

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

+0

クライアントとサーバーの間で構造化データを頻繁に送信している場合は、JSONに直列化してください。 –

+1

POST経由で配列を渡すことについては、本質的に安全ではないと思いますか?それは単なるデータです。 –

+1

私は通常、 'json_encode()'のものを好きです。その後、json_decode()をtrueに設定して、それを取り戻します。 – phpisuber01

答えて

6

なぜあなたはすでにサーバー(PHP)側に投稿していれば投稿して送っていますか?

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

これはすべてあなたがの本当にがしたいことに依存します。

+1

セッションと投稿のデータは、異なるデータに使用する2つの非常に異なるものです。 *単にセッション変数に配列を保存すると言うと、それらの違いは無視されます。それは正しいかもしれません、または間違っているかもしれません。提供された質問から、私たちは単に教えていただけません... – ircmaxell

+0

私は驚くばかりです。その事実に私の答えを編集してください – Neal

+0

私もそのことを考えましたが、$ _SESSION変数をクリアするのを忘れた場合やそれを防ぐ何かが起きた場合、それは問題になります – user1722791

19

編集あなたは、セキュリティについて尋ねている場合は、下の編集で私の補遺を参照してください

PHPは、この特定の目的のために提供さserialize機能を持っています。配列に渡すと、その文字列表現が返されます。配列に戻したい場合は、unserialize関数を使用します。

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

これは、データをデータベースに保存するためにレイジーコーダによってよく使用されます。お勧めはしませんが、すばやく/汚れた解決策として機能します。

補遺

私はあなたがいない「安全」、確実にデータを送信する方法を探していた印象の下にありました。どのようにデータを渡しても、ユーザーシステムを経由している場合は、まったく信頼できません。一般的には、サーバのどこかに格納してください。&信憑性(クッキー、セッション、パスワードなど)を使用してそれを調べます。

12

あなたはセッション中にそれを置くことができます:

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文字程度になるためです。

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

+2

SESSIONは入力タイプにデータを格納するよりも安全です。そのため、SESSIONはサーバー側であり、ユーザーはそれを変更できません。あなたと同意@laxonline –

+0

私はここで一つの質問があります。フォームに何千もの入力がある場合、同じことが機能するでしょうか? – anujeet

5

ユーザーはフォームを変更でき、クロスサイトスクリプティング(XSS)から保護する必要があります。ユーザーが入力にHTMLを入力したとき

XSS

XSSです。たとえば、ユーザーがこの値を送信した場合はどうなりますか?:

" /><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

フォーム修正

私はあなたのサイトにあった場合、私はHTMLを修正するChromeの開発ツールやFirebugのを使用することができますがあなたのページのあなたのフォームが何をしているかに応じて、これは悪意を持って使用される可能性があります。

たとえば、配列に余分な値を追加したり、配列に属していない値を追加したりできます。これがファイルシステムマネージャーだった場合は、存在しないファイルや機密情報を含むファイルを追加することができます(例:myfile.jpg../index.phpまたは../db-connect.phpに置き換えます)。

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

+0

これはフォーム上でのみ動作しますか? – user1722791

+0

すべてのユーザ入力に 'htmlspecialchars()'を適用する必要があります。 StackOverflowはあなたのユーザ名に似たものでしょう:いたるところに書かれているので、悪意のあるHTMLであってはいけません。ユーザーは、見ているHTMLを変更できます。私はGoogleのオリンピックの試合でハイスコアを偽るためにこれをしました:https://sphotos-b.xx.fbcdn.net/hphotos-ash4/418275_485985401412972_1427008375_n.jpgフォームには、ユーザーが送り返す入力が含まれているので特殊ですサーバー。あなたが送信する各入力をチェックして、それが意味をなさないことを確認するか、人々があなたのサイトをハックする必要があります。 – Chris

+0

ありがとう、私はこれを常に心に留めようとします。 – user1722791

6

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

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

関連する問題