2012-01-03 2 views
1

내 경우 jquery를 통해 아약스를 호출하여 문제는 대상이 측면 소스에서 볼 수 있다는 것입니다. 남용을 방지하기위한 해결책을 모색하고 저의 겸손한 접근 방식에 대해 어떻게 생각하는지 묻고 싶습니다. PHP/ajaxcall - 악용 또는 직접 액세스를 막기위한 접근법

아약스 호출 (만약 내가 잘못 날 수정)에 대해 알아야 할 사항 : 당신이 정규 HTML 렌더링처럼 접근이 필요하기 때문에 사용자에게 직접 액세스를 허용해야

  • .

  • 개의 세션을 사용할 수 있습니다. ,

이 중 내가 먼저 ajaxscript에 액세스하는 스크립트를 생성 추적은 사용자 이후 사용할 수

  • IP가 파일에 액세스하지 내 스크립트 (이것은 다른 보호 방법에 대한 보유 것) 시간을 얻거나 해시하거나 소금과 암호로 같은 시간을 암호화하여이 두 값을 사용자에게 전달합니다. 성공 함수에서 나는이 2 개의 값을 취하여 다음 ajaxcall을 사용하여 메인 스크립트에 액세스합니다. 이 난이 값 확인 :

    1. 시간과 동일하게 암호화 된 시간인가를

    2. 두 아약스 후에 실행 x 초 내가 또한 쉽게 포함

    호출 이하나요 추가 보안을 위해 $ _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을 통해 올바른 머리글을 사용하여 말아서 액세스 할 수 있습니다. 왜냐하면 대부분의 환경 (php 같은)에서는이 스크립트에서 필요한 버튼을 "클릭"할 수 없으므로 curl은 쉽게 ajax 호출을 사용할 수 없기 때문입니다. watir, 셀레늄과 같은 다른 환경에서도 쉽게 위조 할 수 있습니다.

    그렇다면 추가적인 보안 계층이 필요합니까? 나를 도와 주신 귀하의 의견에 감사드립니다. 나의 잘못을 고쳐 주셔서 감사합니다.

    SOF 2012에서 멋진 하루 되세요 !!

  • +0

    이것은 codereview에서 더 좋을지 모르지만 내가 본 것처럼 이미 코드에 약간의 문제가 있습니다. 사용자의 연결 속도, 1 초 안에로드 할 항목, 다른 사용자가로드 할 항목을 알 수 없습니다. 5. 그래서 어쩌면 당신은 한도를 올려야합니다. 그런 다음에 어떤 종류의 학대를 예방하려고합니까? –

    +0

    왜 클라이언트 쪽에서 URL을 숨기려고하는지 이해가 안됩니다. 그리고 나는 컬이 아약스 콜에 쉽게 접근 할 수 없다는 것을 무슨 뜻인지 이해하지 못합니까? 이 코드의 목표를 설명 할 수 있습니까? –

    +0

    @egor 나는 클라이언트 측 URL을 숨기지 않습니다.이 작업은 수행 할 수 없습니다. curl은 ajax-target-script를 잡고 스크립트에 직접 액세스 할 수 있습니다. curl (php 환경에서)은 index.html에 액세스 할 수 없으며 Ajax-target-script로 이동합니다. 먼저 2 개의 필요한 값을 얻으려면 index.html을 통해 스크립트를 호출해야합니다. – Email

    답변

    0

    더 많은 것을 혼란스럽게 만들려면 색인 페이지에서만 사용할 수있는 공유 키로 암호화 된 응답의 일부만 반환하는 두 가지 (또는 더 많은) 다른 서버 스크립트를 만들 수 있습니다. 그래서 자바 스크립트 코드는 두 개의 서로 다른 아약스 호출을 한 다음 응답을 함께 넣고 클라이언트 측에서 해독 한 다음 사용할 수있게됩니다.

    그러나 이것은 사용자가 일반적으로하는 모든 일을 할 수 있으므로 Selenium을 방어하는 데 도움이되지 않습니다.

    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

    방화 광으로 Chrome 개발자 도구 또는 wireshark를 통해 응용 프로그램의 요청을 볼 수 있습니다. 내가 응용 프로그램의 js 코드가 있기 때문에 나는 작은 PHP/파이썬 스크립트를 작성하고 index.html 방문하여 1000 요청을 만들 수 있습니다 once.it 정말 아파치/nginx 또는 iptables와 요청 속도를 제한하기 쉽고 그것은 갈 방법이어야합니다 . – devmach

    +0

    사용자가 악용하는 것을 막는 봇을 막을 수는 없습니다. 나는 접근 가능한 웹 사이트에서 수행 될 수있는 abuseproof에 대한 python 스크립트를 작성했습니다. 비록 한 사이트 렌더링만으로 index.html 1000x를 요청할 수는 없지만 그것은 불가능! .. 새로운 속성은 새로운 요청에 대해서만 렌더링되기 때문에. – Email

    관련 문제