구글 reCaptcha 를 php 로 연동하기 하기 위해서는 먼저 'Site key' 와 'Secret key' 를 발급받아야 합니다.


연동하고자 하는 도메인 주소나 localhost 를 입력하면 바로 발급받을 수 있으니 어렵지는 않습니다.



먼저 아래 주소로 접속해 주세요.


https://www.google.com/recaptcha/intro/index.html



다음에는 도메인 주소를 입력하고 등록을 클릭합니다.




등록 즉시 'Site key' 와 'Secret key' 를 발급받아 주세요.

'Site key', 'Secret key' 값을 아래 소스 값에 기입후 바로 사용하면 되겠습니다.


 <?php

 $sitekey 
'Site Key'
 $secretKey "Secret Key"

 if(
$_SERVER['REQUEST_METHOD'] === "POST") {
     
$name null;
     
$contents null;
     
$recaptcha null;
     if(
$_POST['name']){
         
$name $_POST['name'];
     }
     if(
$_POST['contents']){
         
$contents $_POST['contents'];
     }
     if(
$_POST['g-recaptcha-response']){
         
$recaptcha $_POST['g-recaptcha-response'];     
     }
     if(
$recaptcha){
         
$url "https://www.google.com/recaptcha/api/siteverify?
                 secret=" 
$secretKey "&response=" $recaptcha 
                 "&remoteip=" $_SERVER['REMOTE_ADDR'];

         $resource =  file_get_contents$url ); 


        $val json_decode($resourcetrue);
        if(
intval($val["success"]) !== 1){
             echo 
"정상적인 접속이 아닌 것 같습니다.";
             die();
        }
         echo 
"name = $name <br />";

         echo "contents = $contents <br />";
     }else{
         echo 
"로봇이 아니면 체크해주세요.";
         die();
     }
 }
 
?> 
 <html>
     <head>
        <title>Google recapcha</title>         <script src='https://www.google.com/recaptcha/api.js'></script>

    </head>
    <body>
        <h1>Google reCAPTHA</h1>
        <form action="" method="post">         <input type="text" name="name" size="40"><br><br>         <textarea name="contents" rows="8" cols="40"></textarea><br><br>         <input type="submit" name="submit" value="Submit"><br><br>         <div class="g-recaptcha" data-sitekey="
<?php echo $sitekey?>"></div>         </form>
     </body>
 </html>



신고

HTTP 헤더 인젝션은 공격자가 헤더에 개행문자를 삽입하여 헤더를 추가하여 공격하는 수동적 공격 방식입니다.


이 공격이 허용되는 경우 쿠키를 임의대로 생성하거나 임의로 URL를 리다이렉트 시킬 수 있습니다.


 http://example.com/?id=1001

위과 같은 코드가 있다면 아래 코드로 고쳐서 공격합니다.


 http://example.com/?id=101%0D%0A%0D%0ASet-cookie+SID=a123456789

결국 아래와 같은 결과 값을 얻게 되므로 쿠키를 만들게 됩니다.

 http://example.com/?id=101


 Set-cookie+SID=a123456789


공격자가 입력한 %0D%0A 는 \r\n 을 의미하므로 결과적으로 새로운 헤더가 만들어 지게 되는 것입니다.

다음의 방법도 주의해야할 부분입니다.


 http://example.com/?id=101%0D%0A%0D%0A<html><body><h2>Hello Habony!!</h2></body></html>

위 문자열이 HTTP 인젝션이 가능하게 되면 아래와 같은 결과가 나타나게 됩니다.

 http://example.com/?id=101


 <html>

   <body>

      <h2>Hello Habony!!</h2>

   </body>

 </html>


이 공격에 의해 유저에게 가짜 웹페이지를 표시하여 개인 정보를 입력받거나 크로스 사이트 스크립팅과 같은 공격을 받게 됩니다. 


물론 개행문자를 이용해 메일 헤더 인젝션 공격도 시도할 수 있습니다.


 http://example.com/?email=you@example.com%0D%0Ato@example.com


이렇게 입력받게 되면 공격자는 Bcc에 임의대로 수신자를 추가해 버릴 것입니다.


 <?php
 $header "you@example.com%0D%0Ato@example.com";
 mail($to$subject$content), $header);
 /*
 결과:
 you@example.com
 to@example.com
 */
 ?>


그래서 다음의 방법 등으로 문자열을 취환해서 공격을 회피해야 합니다.


 <?php
 $str "http://example.com/?id=101%0D%0A%0D%0ASet-cookie+SID=a123456789";
 
$str str_replace(array("\r""\n"), ""$str);
 
?>


신고

◀ PREV : [1] : [2] : [3] : [4] : [5] : ... [301] : NEXT ▶