2009-07-01 4 views
8

저는 PHP의 초보자입니다.다른 도메인의 게시물 데이터 중지 PHP

제가하려는 것은 포스트 데이터가 다른 웹 페이지에서 오는 것을 막는 것입니다.

내가 겪고있는 문제는 누군가 내 양식을 복사하여 웹 사이트에 붙여 넣습니다. Post Data가 내 이메일 양식에서 스크립트를 실행하는 것을 중지 할 수 있기를 원합니다.

어떻게하면됩니까? 내가 충분히 명확하지 않다면 알려줘.

My PHP 문의 양식은 조건문이있는 페이지 하나에서 실행됩니다. 즉 데이터가 체크 아웃되면 제출하십시오.

+1

나는 또한 PHP에서 URL을 검사 해 보았지만 아마추어 실수라고 알았습니다. – Juan

+0

확인. 나는 너희들이 내게 주신 것을 살펴 봤고 너희들이 나에게 준 것을 사용해서 다른 생각을 생각했다 ... 내가 문자 집합을 무작위로 정해서 변수로 변환하고 숨겨진 값으로 게시하면 어떨까? 그래서 매번 바뀌고 스크립트가 실행될 때 그것을 확인합니까? – Juan

+0

아마추어 실수 다시 ..... 미안. – Juan

답변

7

$ _SERVER [ 'HTTP_Referrer']는 좋지만 신뢰할 수는 없습니다. MD5의 숨겨진 양식 필드를 사용하여 다른 쪽에서도 확인할 수 있습니다.

+0

번호를 무작위로 추출하여 숨겨진 값으로 게시 한 경우 어떻게됩니까? – Juan

+1

오, 그들은 그냥 숨겨진 값을 제거하고 작동하도록 만들 수 있습니다 .... 롤. 그냥 내가 PHP의 그립을 얻고 있다고 생각할 때. – Juan

+0

필자는 마침내 그것을 생각해 냈습니다. session_start를 사용했고, 폼이 표시 될 때 세션 변수를 만든 다음 변수가 제출되도록 설정되었는지 확인했습니다! – Juan

0

신속하고 더러운 접근법을 찾으려면 REFERER 헤더를 확인할 수 있습니다.

실제로 사이트에서 양식을 가져 오려면 양식이로드 될 때마다 토큰을 생성하고 세션에 첨부해야합니다.

$_SESSION['formToken'] = sha1(microtime()); 

그런 다음 양식에 숨겨진 입력 할 수 있습니다 :

<input type="hidden" name="token" value='<?=$_SESSION['formToken'];?>' /> 

을하고 양식 데이터를 처리할지 여부를 결정할 때 것을 확인할 수 있습니다이 작업을 수행하는 간단한 방법은 무엇인가처럼 될 것입니다.

+2

$ _POST에서 토큰을 확인해야합니까? $ _SESSION 값이 아직 설정되어 있는지 확인하는 것만 큼 좋을까요? – AndyMcKenna

9

CSRF - Cross-Site Request Forgery을 방지하려고합니다. Jeff himself에 대한 블로그 기사가 있습니다.

진정한 XSRF 방지는 세 부분으로 필요합니다 단지 생성되는 양식을 챙겨 양식의 엡실론 내에서 그것을

  • Timechecking를 내장에서 사람을 방지하기 위해

    • 숨겨진 입력 필드를, 그렇지 않으면 누군가를 생성 할 수 있습니다 유효한 형태는 한 번 토큰을 사용합니다 (저장 어떻게 impementation /에 따라)
    • 쿠키 : 이것은 man-in-the-middle 공격
    을가 클라이언트의 척 및 공연에서 악의적 인 서버를 방지하는 것입니다 형태
  • +0

    ** ** ** ** 1) ** 숨겨진 입력 - 누구나 HTML 소스에서 "숨겨진"입력을 찾을 수 있습니다. ** 2) ** 원격 사용자는 현재 시간에 따라 유효한 양식을 생성 할 수 있습니다. ** 3) ** 악의적 인 서버는 쿠키를 설정할 수있는 페이지입니다. (** 현실적인 해결책으로는, 아래에서 대답을했습니다 **). –

    1

    :

    <? 
    $password = "mypass"; //change to something only you know 
    $hash = md5($password . $_SERVER['REMOTE_ADDR']); 
    echo "<input type=\"hidden\" name=\"iphash\" value=\"$hash\"/>"; 
    ?> 
    

    당신이 확인하고 있습니다 : 그것은 보안 구멍이 왜에 "허용 대답을"댓글을 달았습니다

    $password = "mypass"; //same as above 
    if ($_POST['iphash'] == md5($password . $_SERVER['REMOTE_ADDR'])) { 
        //fine 
    } 
    else { 
        //error 
    } 
    
    +2

    REMOTE_ADDR은 스푸핑 될 수 있습니다. 따라서 MITM 공격이 있다면 가치가없는 것으로 입증 될 것입니다. 또한 한 번의 요청을 한 후에는 해시를 복제하여 더 쉽게 만들 수 있습니다. 이 쓸데없는, 해시의 '고유 한'부분이 더 '고유'해야하므로 시간을 사용하도록 선택했습니다() 마녀는 현재 시간대를 제공합니다. – UnkwnTech

    +0

    "공격자"는 클라이언트가 아니며 다른 서버 그의 고객에게 양식 페이지 제공하기 –

    +1

    어쨌든 여전히 쉬운 일이 될 수 있습니다. – UnkwnTech

    0

    . 대신보다 안전한 방법을 사용해야하지만 양식의 방법에 따라 다릅니다. (아래 주어진 방법은 더 안전하지만 이상적이지는 않다).

    1) 먼저 양식이 생성 된 .php 페이지의 프레임 구성을 해제하십시오 (.php).상단 담기 : 만약 그렇지 않으면 (대조군 경우

    if(!empty($_POST)){ 
        if(!empty($_SERVER['HTTP_REFERRER']) && DomainOf($_SERVER['HTTP_REFERRER']) == $_SERVER['HTTP_HOST']){ 
    
         $request_valid = true; 
    
        } 
    } 
    

    3) 또한,)/만드는 코드를이 부분을 건너 폼 데이터를 구문 분석

    header('X-Frame-Options: Deny'); 
    

    2) 또한, 확인 (15 분 만료) 유효성 검사 통과 여부를 확인, 구문 분석에

    <?php 
    // ========= Needef functions ========= 
    // RandomString : https://pastebin.com/raw/CziyUiDv 
    // Two way encryption: https://github.com/tazotodua/useful-php-scripts/blob/master/two-way-encrypt-decrypt.php 
    
    //before start of the output 
    $secret_key  = 'fjd3vkuw#KURefg'; //change this 
    $encrypted_value = Cryptor::encrypt(time(), $_SERVER['REMOTE_ADDR'] . $secret_key); 
    ?> 
    <form> 
    .... 
    <input name="temp_random" value="<?php echo $encrypted_value;?>" ... /> 
    

    :,이 phseudo 코드와 같은 논리를 사용

    // paragraph 2 validation at first 
    // ..... 
    // then: 
    if ( Cryptor::decrypt( $_POST['temp_random'], $_SERVER['REMOTE_ADDR'] . $secret_key) > time() - 60* 15){ 
        //validated 
        ... 
    } 
    
    관련 문제