2011-03-17 2 views
0

私はこのような何か使用したので、私は考えていた。..より強固になりフォームセキュリティ&PHP?

<input type="hidden" name="ids" value="1, 3, 5" /> 
<input type="hidden" name="cost" value="350" /> 

をしかし、私は誰かがちょうど「3」と言うと$ 3.00それを支払うためのコストを変更することができ、考えていた(SP )オプションは、ページをロードするときにセッションにこれらの値を設定する必要があります。

<? 
unset($_SESSION['baskettotal']); 
unset($_SESSION['basketids']); 
$_SESSION['baskettotal'] = $grand; 
$_SESSION['basketids'] = implode(", ", $ids); 
?> 
<input type="hidden" name="hash" value="<?=md5('stackoverflow'.$_SESSION['baskettotal'].$_SESSION['basketids']);?>" /> 
<? 
if (($_POST['hash']) != (md5('stackoverflow'.$_SESSION['baskettotal'].$_SESSION['basketids']))){ 
    echo "error"; 
    die(); 
} 
?> 

これは良い方法ですか?彼らはセッションを編集できないので、簡単に操作できる隠し入力フィールドに格納するのではなく、バスケットの中のwhatsによって定義されます。

答えて

2

本当に正しいです、これはこれを行う良い方法です。

1)そのフォームのすべての値のハッシュを含むセッションを作成します。

2)フォームが送信されたら、フォームから値のハッシュを計算し、それらをSESSION変数の値と比較します。それらが同じであれば、ユーザーは何も変更しませんでした。違いがある場合は、明らかにユーザーが何かを変更しました。

ユーザーはSESSION変数を変更することはできませんが、たとえばこれをCookieに格納すると、そのCookieを介してハッシュを編集する可能性があります(これはクライアント側に保存されているためです)。セッションのあるサーバー側)。

例は次のようになります。

$_SESSION['form_data'] = md5("randomsalt123".$formValue1.$formValue2); 

とユーザーがフォームを送信:フォームでそれらを表示するセッションに格納していない程度

if($_SESSION['form_data'] == md5('randomsalt123'.$_POST['form_value_1'].$_POST['form_value_2'])){ 
// valid submission 

} else { 
// invalid 
} 
+0

ありがとう、素晴らしい答え。私は、ハッシュでIDと価格をソルトすることを考えていました。例えば、$ hash = md5($ ids。$ price)を計算しました。それを秘密のポスト値に入れます。投稿すると、SESSION情報と同じ塩味のハッシュが作成され、投稿された情報と照合されます。 – Latox

+0

OPを新しいコードで更新しました。どう思いますか? – Latox

+0

あなたがしたいことは($ _POST ['hash'])!=(md5( 'stackoverflow'。$ _ POST ['baskettotal']。$ _ POST ['basketids']))))です。新しくPOSTEDしたデータを見て、それを古いハッシュと比較したいとします。 –

1

セッション変数を変更する方法もあります。ユーザーが変更できないデータベースにコストを格納し、$ _POST ['cost']をチェックしてデータベースにあるものと一致するかどうかを確認するか、隠しフィールドを削除します。

dbを使用したくない場合は、ファイルに保存できます。

+0

セッション変数をどのように変更するかについては、 – Phil

+1

あなたはそれらがクッキーと混乱しているかもしれません...セッションデータはサーバー側に保存されています。 –

+0

https://addons.mozilla.org/en-us/firefox/addon/add-n-edit-cookies/ < - Firefoxのアドオンがあり、セッション変数とCookie変数を編集できます。 – MasterZ

1

何? (あるいは計算をしているときに無視する)。

+0

それは私がOPで言ったこと... – Latox

+0

@カイルそして私はちょうどあなたが言ったことを、マイナーな提案で確認していた。 – Haochi

0

なぜあなたは価格をフォームに保存していますか?これはサーバー側のみに格納する必要があります。 価格を表示することはできますが、返品する必要はありません。

+0

価格は外部の支払いゲートウェイに提出されていますが、あなたは私の質問を誤解していると思います。 – Latox

+1

@カイル:ああ....あなたの質問ではどこでそれを言ったのですか? PayPalの場合、実際にフォームを暗号化するオプションがあります。 – mpen

-1

フォームが外部スクリプトに送信されている場合。最終的なデータチェックを行わないため、セッションチェックは役に立たなくなります。

完全に安全である(または少なくとも類似している)ためには、セッション内に価格のサーバー側を格納し、チェックアウト時にcurlを使用して最終チェックの後に外部呼び出しを実行します。

+0

私はすでにそれを処理するためのスクリプトを書いていましたが、私はこれについて尋ねていませんでした。簡単な操作が可能な隠れたフォームフィールドを使って情報を投稿することなく情報を渡す最も安全な方法を求めていました。私のやり方が最高だったようです。ありがとう。 – Latox

+0

もうひとつのコメントで、あなたが外部のスクリプトにそれを提出していると言ったので、私はこれを言いました。 カール部分を除いて、近くで読むと、方法は主に同じです。 あなたはそれを考えています。 – frostymarvelous

1

あなたの方法は良いと思います。フォームにその値を表示していないときは、隠しフィールドとセッション値を一致させる必要はありません。あなたの計算に影響を与えない隠しフィールドの値を誰かが編集した場合、セッション変数の値に基づいて計算を行います。

-1

これは私のために十分である:最初の実行で

<?php 
session_start(); 
// thanks to bantam 
// http://www.php.net/manual/en/function.mcrypt-encrypt.php#87526 
define('SALT', 'whateveryouwant'); // use define, db stored value, var, included, etc. 
function encrypt($text) 
{ 
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
} 

function decrypt($text) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
} 

unset($_SESSION['baskettotal']); 
unset($_SESSION['basketids']); 

$grand = 350; 
$ids = array(1, 3, 5); 

$_SESSION['baskettotal'] = $grand; 
$_SESSION['basketids'] = implode(", ", $ids); 

?> 
<form method="post" action="<?php $_SERVER['PHP_SELF']?>" enctype="application/x-www-form-urlencoded" > 
    <input type="hidden" name="enc" value="<?= encrypt('stackoverflow' . $_SESSION['baskettotal'] . $_SESSION['basketids']);?>" /> 
    <input name="send" type="submit" value="Submit"> 
</form> 
<? 
if (decrypt($_POST['enc']) !== 'stackoverflow' . $_SESSION['baskettotal'] . $_SESSION['basketids']) die('Not so fast'); 
else echo 'Go ahead'; 
?> 

あなたが得る:

それほど速いあなたが送信ボタンをクリックすると:先に

ゴー

希望します。 Source

0

初期のコードは大丈夫でしたが、さらに「改善」はあまり意味がありません。
私は隠されたハッシュのものすべてのための使用を参照してください。

ちょうどそれ

$_SESSION['baskettotal'] = $grand; 
$_SESSION['basketids'] = $ids; 

行ってから提出するPOST時のセッションからこれらの2つの変数を取得しないのはなぜ。

$grand = $_SESSION['baskettotal']; 
$ids = $_SESSION['basketids']; 

これはすべてです!
なぜあなたのコードを複雑にする必要はありませんか?