1

indev Web サイトを保護しようとしているときに、レンガの壁にぶつかりました。インデックスは、Google Maps v3 API を使用して、ユーザーが独自のマーカーを追加できる私の都市の地図を表示する PHP ファイルです。マーカーを追加したら、それをクリックして、場所に関するさまざまな情報を送信できるフォームを含む InfoBox を開くことができます。JS で記述された単純な DOM 要素であるフォームは、データをパラメーター化して MySQL データベースに挿入する前にデータを検証する PHP スクリプトに POSTS します。Web サイトは必然的に登録を必要としないため、PHP スクリプトが検証する 1 回限りのトークンを作成して、フォームのフラッディングを抑止しようとしましたが失敗しました。

具体的には、私の問題は次のとおりです。最初にindex.phpファイルでトークンを作成し、フォームがadd.phpスクリプトに正常にPOSTされた後に設定を解除できますが、JSファイル内からPHPコードを実行して非表示のフォーム要素を新しいトークンで更新します。

これがコードで起こっていることです -

index.php から (ページ読み込み時にトークンが作成される場所):

$_SESSION['stoken'] = sha1(uniqid(mt_rand(), true));

トークンが作成されたので、次のように JS 変数に割り当てます。

var stoken = "<?php print($_SESSION['stoken']); ?>";

これで、外部の .JS ファイルが「stoken」にアクセスできるようになり、ユーザーがアクセスすると、Google マップの InfoBox ウィンドウの非表示のフォーム要素に配置されます。次に、ユーザーがフォームを送信すると、私の add.php ファイルは、$_SESSION['stoken'] が POSTed hidden form 値と同等であることを確認します。次に、$_SESSION['stoken'] の設定を解除します。

これは私が立ち往生しているところです。.JS ファイル内から PHP を実行して、ユーザーが作成して入力する次の InfoBox の新しいトークンを設定またはアクセスすることはできません。ユーザーが各 InfoBox に同じトークンを使用できるようにすると、データベースをエントリであふれさせる HTML ファイルをデスクトップに作成するのは非常に簡単になります。データの検証により、誰かがランダムな BS の束を入力することはできなくなりますが、個人はデータベースに「正当な」情報をわずかに異なる値で何度も入力することができます。

これまでのところ、私は2つの「解決策」を考え出しました。

(1) 新しいトークンを作成するページのリロードを強制できます

また

(2) .htaccess を設定して、JS ファイル内で PHP を処理するように Apache に指示できます。これにより、新しい InfoBox の作成関数が新しいトークンを認識できるようになります。

これらのオプションは両方とも、私のような初心者だけが頼りにし、将来的に他の問題を引き起こす可能性がある警官のように思えます. この問題に対するよりエレガントで合理的な解決策を教えていただければ幸いです。ありがとう。

4

1 に答える 1

0

AJAX リクエストを使用して Stoken を作成するため (テキストが正しければ)、次の値を返すことができます。

$_SESSION['stoken'] = sha1(uniqid(mt_rand(), true));

JS Var と書きます。そうすることで、適切な Stoken もアクティブになります。そうする方法のヒントが得られるため、Javascript コードを使用した JS Fiddle が最適です。

jQuery でこれを行う例は、 $.load() または $.ajax() リクエストに応じて次のようになります。

$.ajax({
  url: "XYZ"
}).done(function ( data ) {
  stoken=data;
});

そこにある詳細情報: http://api.jquery.com/jQuery.ajax/

于 2013-08-09T14:51:40.587 に答える