0

連想配列を作成し、それを隠し値として新しい PHP ページに渡すページがあります。foreach ループが反復処理を待機していますが、ページが操作対象の値が配列であることを認識していないかのように、「無効な引数」エラーが発生します (単に「配列」を示す「印刷」にもかかわらず)。これは本質的に私が持っているものです:

//Hidden input to be passed to the next page
print "<input type=\"hidden\" name=\"price_list\" value=\"$item_list\">


//Code on the second page for the foreach loop
extract($_POST);
foreach($price_list as $name=>$price) {
...
}

しかし、「警告: 17 行目の /home/cut/mg299/public_html/PHP/invoice.php の foreach() に無効な引数が指定されました」というメッセージが表示されるだけです。前のページで反復できるため、配列は正常に機能し、他の値はこの 2 番目のページに正しく解析されます。

この配列値を「再初期化」する必要がありますか?

4

3 に答える 3

3

とを使用serialize()base64_encode()ます。

print '<input type="hidden" name="price_list" value="' . base64_encode(serialize($item_list)) . '">'

および: unserialize()_base64_decode()

//Code on the second page for the foreach loop

$price_list = unserialize(base64_decode($_POST['price_list']));
foreach($price_list as $name=>$price) {
...
}

serialize()配列を文字列に変換します。base64_encode()この文字列をエンコードして、HTTP 経由で安全に送信できるようにします。それがなくても機能するかもしれませんが、安全側にいる方が良いでしょう. さらに、配列が少し難読化されます。

アップデート:

実際、文字列を含む配列をシリアル化すると、array('foo', 'bar')たとえばa:2:{i:0;s:3:"foo";i:1;s:3:"bar";}.
これを正しく挿入するに'value="' . serialized_value . '"'は、エンコードする必要があります。そうしないと、結果が二重引用符で混乱します"

value="a:2:{i:0;s:3:"foo";i:1;s:3:"bar";}"

更新 2: Tom はセキュリティに関して適切な指摘を行いました。$_POST['price_list']指定した値が に含まれていることを確認できません。攻撃者によって改ざんされる可能性があります。
データが有効であることを確認するために、ある種の秘密鍵を先頭に追加できます。

$secret_key = base64_encode('secret');

$value = $secret_key . base64_encode(serialize($item_list))

以降:

$value = $_POST['price_list'];
if(!substr($value,0,strlen($secret_key)) === $secret_key) {
    echo "Attempted attack!!";
    exit();
}
$price_list = unserialize(base64_decode(substr($value, strlen($secret_key)));
foreach($price_list as $name=>$price) {
...
}

もちろん、これはさらに改善することができますが、正しい考えを与えるはずです.

于 2010-03-24T16:40:38.067 に答える
2

配列にprintが「Array」を出力するだけの場合、それが非表示フィールドに書き込まれる方法だと思います。ソースを表示してみて、それが実際にブラウザにどのようにレンダリングされるかを確認してください。そうである場合は、アレイをシリアル化および逆シリアル化するための何らかの方法が必要になります。

于 2010-03-24T16:36:42.923 に答える
1

'

あなたが試すかもしれません:

foreach ($item_list as $item)
{
    $value = base64_encode($item);
    echo "<input type='hidden' name='price_list[]' value='$value'>";
}
于 2010-03-24T16:54:41.317 に答える