【问题标题】:How to get rid from spam MySQL insert?如何摆脱垃圾邮件 MySQL 插入?
【发布时间】:2014-07-02 09:19:27
【问题描述】:

我真的很想知道有人如何将记录添加到我现有的博客评论表中。我正在使用我自己的自定义博客脚本,用户可以在其中对任何特定博客添加评论。我有一个带有博客 ID 的单独评论表。我尝试了几种验证码技术,但没有任何效果。我正在为 mysql 使用 PDO。我也在提交表单之前进行 JavaScript 验证。我不确定他/她是真人还是某些机器人正在这样做。在 1 小时内添加了数千条记录。

我在下面展示我的代码。有人可以帮帮我吗?

<?php
if(isset($_POST['user_comment']))
{

if ($_SESSION['answer'] == $_POST['answer'] ) 
{
$name = $_POST['name'];
$email = $_POST['email'];
$website = $_POST['website'];
$web = $website;
$comment = addslashes(nl2br($_POST['comment_text']));
$comment =strip_tags($comment);
$id = $article_id;
$ref = $_SERVER["HTTP_REFERER"];
$userip = $_SERVER['REMOTE_ADDR'];
$useragent = $_SERVER['HTTP_USER_AGENT'];
$submit_date = date('Y-m-d H:i:s');

if ((($name) && ($email) && ($comment))) {

$conn = new PDO("mysql:host=$hostname;dbname=$database",$username,$password);


$sql = "INSERT INTO blog_comments (user,email,website,message,date,storyid,userip,useragent,block) VALUES (:user,:email,:website,:message,:date,:storyid,:userip,:useragent,:block)";
$q = $conn->prepare($sql);
$q->execute(array(':user'=>$name, ':email'=>$email, ':website'=>$website, ':message'=>$title, ':date'=>$submit_date, ':storyid'=>$id, ':userip'=>$userip, ':useragent'=>$useragent,':block'=>'1'));

        }

}
else
{
?>
<tr><td>
<p style="text-align:center; color:#CC0000; font-size:14px; font-weight:bold; padding-bottom:10px;">Wrong Answer! Please try again!!</p>
</td>
</tr>           

<?php
}
}
?>

这是我的验证码:

<?php

    session_start();

    $digit1 = mt_rand(1,20);
    $digit2 = mt_rand(1,20);
    if( mt_rand(0,1) === 1 ) {
            $math = "$digit1 + $digit2";
            $_SESSION['answer'] = $digit1 + $digit2;
    } else {
            $math = "$digit1 - $digit2";
            $_SESSION['answer'] = $digit1 - $digit2;
    }

    ?>  

这是 JS 验证:

<script type="text/javascript" language="javascript">
function validate()
{
        if( document.getElementById( "name" ).value == ""){
           alert("Please enter your name.");
           document.getElementById( "name" ).focus();
           return false;
        }
        if( document.getElementById( "email" ).value == ""){
           alert("Please enter Your email ID.");
           document.getElementById( "email" ).focus();
           return false;
        }
        if( document.getElementById( "comment_text" ).value == ""){
           alert("Please enter your comment.");
           document.getElementById( "comment_text" ).focus();
           return false;
        }

        if( document.getElementById( "answer" ).value == ""){
           alert("Please solve this math.");
           document.getElementById("answer").focus();
           return false;
        }
}
</script>

这是我的表格:

<form action="" method="POST" onSubmit="return validate();">
<table cellpadding="5" cellspacing="5" width="100%">
<tr><td colspan="3">
<input type="hidden" name="id" value="<? print($id);?>">
</td></tr>

<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">Your Name</td>
<td style="width:260px;"><input type="text" name="name" id="name" style="width:250px; height:20px;"></td>
<td style="text-align:left;">Required</td>
</tr>


<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">Your E-mail</td>
<td style="width:260px;"><input type="text" name="email" id="email" style="width:250px; height:20px;"></td>
<td style="text-align:left;">Required</td>
</tr>


<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">Your Website</td>
<td style="width:260px;"><input type="text" name="website" style="width:250px; height:20px;"></td>
<td style="text-align:left;">Optional</td>
</tr>

<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">Your Comment</td>
<td style="width:260px;"><textarea name="comment_text" id="comment_text" style="width:250px; height:100px;"></textarea></td>
<td style="text-align:left;">Required</td>
</tr>

<tr>
<td style="font-size:12px; font-weight:bold; width:150px;">What's <?php echo $math; ?> = </td>
<td style="width:260px;"><input type="text" name="answer" id="answer" style="width:250px; height:20px;"></td>
<td style="text-align:left;">Required</td>
</tr>


<tr>
<td colspan="3" style="text-align:center;">
<input type="submit" class="submit" value="Submit" name="user_comment">
</td></tr>


</table>

</form>

【问题讨论】:

  • 也许有人发了一张然后一直按F5?您至少应该添加一个重定向,这样就不会再发生了。你能同时展示你的验证码和 JS 验证吗?
  • JS 验证无法解决这个问题,机器人直接向您的 PHP 脚本发送请求。你确定你的验证码工作正常吗?
  • 不!所有 cmets 都是新的,具有不同的 IP。我也在使用验证码和 javascript 验证。因此,如果有人只是重新提交表单,那么他/她会收到错误的验证码错误。
  • 是的,我的验证码工作正常。验证码没有问题。
  • @NeerajKumar php 验证在哪里,以防 javascript 被关闭?

标签: php spam


【解决方案1】:

我建议您从已发布电子邮件的用户的数据库中选择以前的记录,并将内容或日期与发布的数据进行比较。如果内容相同或日期范围很小,则显示批准消息以进行发布或执行类似操作。

【讨论】:

    【解决方案2】:

    您的验证码不是很安全。任何机器人都能给你答案。

    What's <?php echo $math; ?> = 
    

    这只会显示为 Text What's x + y = answer is z。

    每个 Bot 和每个自己编写的 Javascript 都可以填写所有必填字段并获取“问题”并将其填写在答案字段中。

    我猜如果您在发表评论后在浏览器中按 F5,php 脚本也会将其保存在您的数据库中,因为一次尝试后不会删除会话中的答案。

    尝试打印带有问题而不是文本的图像,并在第一次尝试后删除会话中的答案。 这应该可以解决问题。

    【讨论】:

    • 之前我用图像验证码尝试过,但没用。
    • 我怎么说你的php代码没有任何验证,它不会删除答案。你只需要一个代理切换器和一个机器人,你就可以在短时间内拥有大量的 cmets。
    • 我在我的表中添加了一个新字段来捕获数学答案,并惊讶于他们像人类一样回答,例如12、8、-3。他们是通过网站插入评论的真人吗?但是他们怎么可能在短时间内以不同的 ips 和 useragent 进入数百个 cmets。
    • 为什么只有人类才能做到这一点?任何机器人也可以做到这一点。我可以编写一个机器人,它可以在 10 分钟内轻松完成这项工作。因为它总是相同的结构(总是带有 - 和 + 的数学运算)
    【解决方案3】:

    毕竟我自己找到了解决方案。现在我显示最后评论的日期时间而不是 CAPTCHA 并要求用户输入该值,因为它在输入框中。所有验证码技术都失败了,而该技术完美运行,我不再收到垃圾邮件。

    非常感谢各位专家提出宝贵建议。

    【讨论】:

      猜你喜欢
      • 2013-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多