2012-01-03 20 views
1

私の場合はjqueryを使ってajaxを呼び出す際の問題は、ターゲットがサイドのソースで見えるということです。私は、虐待を防ぐための解決策を探して、私の謙虚なアプローチについてどう思っているのか尋ねたいと思います。PHP/ajaxcall - 乱用や直接アクセスを防ぐためのアプローチ

  • あなたはそれが任意の通常のHTMLレンダリングのようにアクセスする必要があるため、ユーザーへの直接アクセスを許可する必要がありますAJAXコール(私は間違っているなら、私を修正)について知っておく

  • セッションを使用できます。ユーザーがファイルではなく、私のスクリプトにアクセスしているので、

  • IPトラッキングは、私が最初にajaxscriptにアクセスするスクリプトを作成した。このうち

(これは他の固定的なアプローチのために保持します)を使用することができ、時間を取得し、既知の塩とパスワードで同じ時刻をハッシュまたは暗号化し、これらの2つの値をユーザーに配信します。成功関数では、私はこの2つの値を取って、次のajaxcallでメインスクリプトにアクセスします。そこで私は、これらの値をチェックします。

  1. は時間であり、同じ

  2. 暗号化された時間はx秒以上2つのアヤックスが

を呼び出した後に実行されませんでした私も、簡単に含ま追加のセキュリティのために$ _SERVER ['HTTP_X_REQUESTED_WITH'を偽造するために、これは簡単になりすまして偽造することができます。 GETで2つの値を渡すのではなく、Sessionを使ってそれらを転送することができます:)。

index.htmlを

<script> 
$(document).ready(function() { 
$("#ajaxloadlink").click(function(){ 
$("#ajaxcontent").load("ajax.php",function(responseText, textStatus, XMLHttpRequest){ 
    // alert(responseText); 
    var pruf = responseText; // $("#ajaxcontent").html(); 
    var arr = pruf.split('|'); 
    var geturl = "ajax.php?verifyvar="+ arr[1] +"&timedone="+ arr[0]; 
    $("#ajaxcontent").load(geturl); 

     }); 
    }); 
}); 
</script> 
<button id="ajaxloadlink">Lade ajax.php mit load()</button> 

processfileのajax.php:私はあなたが私のアプローチの考えを聞いて、あなたがあれば、コードを修正することは名誉になり

<?php 
// the function to use for encryption 
define('SALT', 'whateveryouwant'); 
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))); 
    } 


if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')) 
{ 
    //only internal scripts can be used, fakeable 

     if(empty($_GET)) 
     { 
      $time = time(); 
      $verifvar_created = encrypt($time); 
      echo $time."|".$verifvar_created; 
     } 
     else 
     { 
     //zweiter Durchlauf 
     $verifvar = $_GET['verifyvar']; 
     $timedone = $_GET['timedone']; 

      //VERIFY 
      $curtime = time(); //holds also timemax 
      $timemin = $curtime - 2; 

      if($timedone <= $curtime && $timedone >= $timemin) 
      { 
       echo "COOOL"; 
       //now its an actual request 
       $verifvar_checked = decrypt($timedone); 
       if ($verifvar == $verifvar_checked) 
       { 
        echo "VERIFIED"; 
        // now process the actual script 
        // :) 
       } 
      } 
     } 
} else 
    { 
     echo "no direct access allowed"; 
    } 
?> 

それがあると思う。私にとってはうまくいく、私はajaxの呼び出しの間に2秒を許可した(これは2単語なのでレンダリングが簡単だ)。

通常、アクセス可能なすべてのコンテンツには、通常のユーザーのようにindex.htmlを通過することで正しいヘッダーのcurlを使用してアクセスできます。ほとんどの環境(phpのような)では、このスクリプトで必要とされるボタンを "クリック"することができないので、カールは簡単にajaxコールを呼び出せないからです。ワイア、セレンのような他の環境でも簡単にそれを偽造することができます。

それでは、セキュリティの追加層ですか? 私を助けてくださったご意見ありがとうございます。私の間違いを訂正してくれてありがとう。

SOF 2012ですばらしい一日を!

+0

これはcodereviewのほうが良いかもしれませんが、私が見ているように、コードにはすでに少しの問題があります。ユーザーの接続の速さ、1秒間の読み込み量、多分あなたは限界を上げるべきです。それ以外は、どのような虐待を防止しようとしていますか? –

+0

クライアントサイドでURLを隠そうとする理由がわかりません。そして私はあなたが«curlはajaxcallsに簡単にアクセスできない»ということを何を意味するのか理解していません。このコードの目的を説明できますか? –

+0

@egor私はクライアント側のURLを隠すことはできませんが、これはできません。 curlはajax-target-scriptを取得し、そのスクリプトに直接アクセスできます。 curl(php環境では)がindex.htmlにアクセスできず、そこからajax-target-scriptに移動します。最初に必要な2つの値を取得するには、スクリプトをindex.htmlから呼び出す必要があります。 – Email

答えて

0

さらに難読化するために、それぞれが応答の一部のみを返す2つ(またはそれ以上)の異なるサーバースクリプトを、インデックスページからのみ利用可能な共有キーで暗号化することができます。したがって、javascriptコードは2つの異なるajax呼び出しを行い、応答をまとめてクライアント側で解読し、使用可能にするだけです。

しかし、これはセレンの防衛に役立つものではありません。ユーザーが通常行うことは何でもできます。

0

Ajaxコールは通常のPOST/GETリクエストよりも技術的に異なり、ターゲットは常にユーザー/ブラウザから見えるようにする必要があります。アプリケーションを「不明瞭なセキュリティ」で保護することはできません。

リクエストレートを制限する場合は、ウェブサーバーまたはファイアウォールレベルのでリクエストレートを制限する必要があります。 phpを使用したい場合は、セッションを使用してユーザーを識別し、要求レートを制限することができます。

<?php 
    session_start(); 

    if(!isset($_SESSION['time']) 
    || $_SESSION['time'] < (time() - 60 * 5) 
){ 
    $_SESSION['time' ] = time(); 
    $_SESSION['count'] = 0 ; 
    } 
    $_SESSION['count']++ ; 

    if( $_SESSION['count'] > 10){ 
    die("Stop ! You can't make more than 10 requests in 5 Minutes"); 
    } 

富栄セッションはクッキーを使用するので、それはHTTPフラッドに対するあなたのアプリケーションを守るために無用です。

+0

@hi thxです。私はそれが完全に確保することはできません知っている。すべてのコードはローカルマシン上で実行されるので、ブラウザでJavaScriptで処理されるすべてのデータ/計算は安全ではありません。セッションを使用してGETではなく値を転送することをお勧めします。私のスクリプトでは、index.htmlを経由せずに直接「ajax.php」にアクセスすることは不可能です。これは、時間がその暗号化されたcontrepartsを取得するためです。 – Email

+0

firebugでは、chromeの開発ツールやwiresharkがあなたのアプリケーションが作成したリクエストを見ることができます。私はあなたのアプリケーションのjsコードを持っているので、私は小さなPHP/Pythonスクリプトを書いて、index.htmlを訪れて1000回のリクエストを行うことができますonce.itはapache/nginxやiptablesでリクエストレートを制限するのは本当に簡単です。 。 – devmach

+0

ユーザーのように行動するボットが悪用されるのを防ぐことは不可能です。私はPythonでabuseproofへのスクリプトを書いています。これはアクセス可能なウェブサイトで行うことができます。私はあなたがindex.html 1000xをリクエストする方法を1つだけのサイトレンダリングで得ることはできません。それは不可能だ! ..新しい属性は新しい要求でのみレンダリングされるからです。 – Email

関連する問題