如何摆脱垃圾邮件MySQL插入?

时间:2014-07-02 09:19:27

标签: php spam

我真的很想知道有人在我现有的博客评论表中添加记录。我正在使用自己的自定义博客脚本,用户可以在任何特定博客上添加评论。我有一个带有博客ID的单独评论表。我尝试了几种CAPTCHA技术,但没有任何效果。我正在使用PDO for mysql。我在提交表单之前也在进行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
}
}
?>

这是我的CAPTCHA代码:

<?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>

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你的验证码不是很安全。任何机器人都可以给你回答。

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

这仅显示为文字What's x + y =答案为z。

每个Bot和每个自编的Javascript都可以填写所有必填字段并获得&#34;问题&#34;并填写在答案字段中。

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

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

答案 2 :(得分:0)

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

非常感谢所有专家提供宝贵的建议。