我的服务器端PHP在reCaptcha(数百封垃圾邮件)之后仍然被黑了

时间:2018-06-26 19:47:29

标签: php recaptcha server-side

我之前在StackOverflow上遇到的问题是有人每隔几个小时向我发送数百封垃圾邮件。现在,我将脚本固定在服务器端,但是第二天早晨,我仍然收到30封电子邮件或其他内容,托管公司为我的FTP提供了一个新密码,并将索引文件移至了备份地图(离线网站),他们说由于以下可疑脚本而被黑客入侵。他们说:“这通常是通过您网站上的泄露脚本(一个过时的脚本)发生的。这是什么意思?他们在电子邮件中说,此脚本文件中包含某些内容。因为我在服务器端使用了reCaptcha,所以缺少一些东西吗?

<?php

if(isset($_POST['g-recaptcha-response'])){
      $captcha=$_POST['g-recaptcha-response'];


      }


/* OUTCOMMENTED CODE BELOW DOESN'T LET FORM SEND IF EVERYTHING IS CHECKED???? 


    if(!$captcha){
          echo '<h2>Check captcha .</h2>';
          exit;
        }*/



    $response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=(SECRETKEY)&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']);
            if($response.success==false)
            {
                echo '<span id="status" style="font-size:1vmax;color:red;">ReCaptcha ERROR</span>';
            }else
            {

        if( isset($_POST['n']) && isset($_POST['e']) && isset($_POST['mn']) && 

isset($_POST['m']) ){
        $n = $_POST['n']; // HINT: use preg_replace() to filter the data
        $e = $_POST['e'];
        $mn = $_POST['mn'];
        $m = nl2br($_POST['m']);
        $to = "gesternl@gester.nl"; 
        $from = $e;
        $subject = 'Contact Formulier-eng';
        $message = '<b>Naam:</b> '.$n.' <br><b>Email:</b> '.$e.' <br><b>Mobiel-nummer:</b> '.$mn.' <p>'.$m.'</p>';
        $headers = "Van: $from\n";
        $headers .= 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
        if( mail($to, $subject, $message, $headers) ){
            echo "success";
        } else {
            echo "The server failed to send a message. Please try again later. Thank you!";
        }
    }
        }
    ?>

我刚刚再次上传了它,看看现在会发生什么。有人可以帮我确保此文件对黑客的安全。没有人真正在上一个问题中提供帮助,但只提供了没有代码的建议(我是nooby)。

(第8行周围过时的注释代码不起作用,我不明白,有人知道为什么有人可以入侵它的原因吗?)

是的,recaptcha的HTML中的代码与公钥很好地链接了

3 个答案:

答案 0 :(得分:3)

$response=file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=(SECRETKEY)&response=".$captcha."&remoteip=".$_SERVER['REMOTE_ADDR']);
if($response.success==false)

这段代码片段很不幸,现在已经浪费了很多(糟糕的)教程。它不提供任何保护-条件始终为false,因为$response.success被解释为将常量success与reCaptcha API返回的API响应串联。无论用户输入什么,这都将使CAPTCHA始终被视为有效。

使用Google reCaptcha库来验证来自reCaptcha API的响应。可通过以下网址获得:https://github.com/google/recaptcha

答案 1 :(得分:2)

您不是要对用户输入进行消毒。您应该立即修复此问题,因为它是安全缺陷。

答案 2 :(得分:0)

  1. 您必须按照@kevin Cai的说法来清理用户输入
  2. 您在以下行中出错:if($response.success==false)

    $response=file_get_contents("......");
    
    $result = json_decode($response);
    
    if($result->success==false){