2

私のajaxコードは次のとおりです。

$.ajax({
    type: "POST",
    url: "save.php",
    data: {
        name: $(this).attr('name'),
        value: $(this).val(),
        id: <?php if(!empty($_SESSION['user'])) echo $_SESSION['user'];?>
    }
});

そしてsave.phpで私はこの条件でチェックしています:

if (empty($_SERVER['HTTP_X_REQUESTED_WITH']) || $_SESSION['user']!=$_POST['id']){
    //then show an error
}

これは、save.php への不正な呼び出しを防ぐための正しい方法ですか?

4

2 に答える 2

4

一般に..

クライアント側のすべてが安全ではありません。したがって、スクリプトは、任意のパラメータ セットを使用して、いつでも誰からでも呼び出すことができます。

特定のスクリプトを保護する

したがって、サーバー側で何かを準備する必要があります。これは、後で何かが有効であることを検証します。

これをsecurity-tokenと呼びましょう。security-toke は、十分に長く、ランダムな文字列である必要があります。セキュリティ トークンは予測不可能である必要があります。この場合、サーバー側アプリケーションのみがこのトークンのソースになることができます。

このセキュリティ トークンをユーザーのセッションに保存し、クライアントに渡します。security-toke を保護するスクリプト呼び出しに関連付けます。セッションには次のプロパティがある場合があります。

$_SERVER[ 'sys$securityTokens' ] 
  = array(
     'AHSsd67sdSJDH/D6wehsd' 
       => array( 'script' => 'sensibleScript.php',
                 'params' => array( 'kid' => 3, 'var5' => 12 )
               ),
     'KSD87sd78sdsfk(DDF/sd' 
       => array( 'script' => 'someOhterSensibleScript.php',
                 'params' => array( 'value' => 'welcome!' )
               )
     );

この構造は、セキュリティ トークンをスクリプト名および後で呼び出される有効なパラメータに関連付けることに注意してください。

クライアントが JavaScript を使用してスクリプトを呼び出す必要がある場合、クライアントはセキュリティ トークンをサーバーに返します。

サーバー側で...

適切なスクリプト リクエストが来て、正しいセキュリティ トークンがリクエストの一部である場合は、セッションからセキュリティ トークンを削除し、スクリプトを実行します。

適切なスクリプト リクエストにセキュリティ トークンが含まれていない場合は、リクエストを拒否します。

于 2013-08-19T00:52:45.387 に答える
1

私はあなたが何をしようとしているのかを見ると..

このようにする方が良い:

$.ajax({
  type: "POST",
  url: "save.php",
  data: {
      name: $(this).attr('name'),
      value: $(this).val(),
      id: <?php if(!empty($_SESSION['user'])) echo $_SESSION['user'];?>
  }
});

そして、save.phpで次の条件を確認します。

if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) || strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest' ||  $_SESSION['user']!=$_POST['id']){
   //here you can show an error 
}

この新しい条件は、リクエストが ajax を介して行われたかどうかもチェックします。

ご覧のとおり、ユーザーの実際の制限ではありません。サーバーサイドでやったほうがいいです。あなたはこれを見ることができますダイレクトページアクセスを制限する

安全ですが、他にも方法があります..

于 2013-08-19T00:25:48.247 に答える