14

ユーザーの操作に基づいてデータベースの値をインクリメントする必要があるWebサイトがあります。ユーザーがボタンをクリックすると、値をインクリメントするphpスクリプトが呼び出されます。このスクリプトが外部のスクリプトからアクセスされないように保護したいと思います。現在、ユーザーは、同じphpファイルを繰り返しヒットしてデータベース内の値を爆破するjavascript関数を使用して独自のWebページを作成できます。

インクリメントを行う私のjqueryコードは次のとおりです。

jQuery(function(){
$('.votebtn').click(function(e){
    var mynum = $(this).attr('id').substring(0,5);
    $.ajax({
            url:"countvote.php",
            type:"GET",
            data: { 
                thenum:mynum
            },
            cache: false,
            success:function(data) {
                alert('Success!');
                }
            }
        });
});
});

ローカルサーバー上のajax/jqueryからの呼び出しのみが「countvote.php」にアクセスできるようにするにはどうすればよいですか?それが正しい方法ではない場合は、phpスクリプトが外部のスクリプトによって悪用されるのを防ぐための提案を受け付けています。

4

4 に答える 4

40

ソリューションには 2 つのステップが必要です。

まず、ajax ファイルは、このコードを使用した ajax リクエストでのみアクセスを許可する必要があります。

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&      strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
if(!IS_AJAX) {die('Restricted access');}

次に、ajax ファイルは、コマンド $_SERVER['HTTP_REFERER'] で呼び出すファイル名でアクセスできます。そのため、ホスト サーバーでのみアクセスを制限できます。

$pos = strpos($_SERVER['HTTP_REFERER'],getenv('HTTP_HOST'));
if($pos===false)
  die('Restricted access');

たぶん、コードは2番目の部分でのみ機能します

于 2013-12-02T21:06:37.600 に答える
3

if $_SERVER['HTTP_X_REQUESTED_WITH']equalsを確認できますがxmlhttprequest、リクエストが AJAX リクエストであるかどうかを判断する信頼できる方法ではありません。これを回避する方法は常にあります。しかし、間違って入力された URL やクローラーなどのランダム ヒットからユーザーを保護します。

于 2013-03-15T16:06:43.153 に答える
2

そうするための100%の方法は実際にはありません。AJAXリクエストは常にクライアントから送信されます。GETの代わりにPOSTリクエストを使用すると、問題を阻止するのに役立ちますが、問題を完全に停止することはできません。PHPでは、すべてのgetリクエストを削除するだけです。

于 2013-03-15T16:08:45.393 に答える