2010-03-01 132 views
0

嘿,伙计们,今天我访问了我的网站,我看到有人在我的故事表中插入超过1000查询防垃圾邮件

我的脚本是在PHP/MySQL和我已经启用了验证码,我不知道他怎么能做这样的事情

一个简单的表格,并在另一个函数,它检查$ VAR和验证它们,然后在数据库中插入

我敢肯定,他是用一个机器人做这样的事情

IM真的困惑

这是我的功能验证,并插入到表

function submitStory($name, $address, $subject, $story, $storyext, $topic, $alanguage,$tags) { 

     $subject = check_words(check_html(addslashes($subject), "nohtml")); 
     $story = check_words(addslashes($story), "nohtml"); 
     $storyext = check_words(addslashes($storyext), "nohtml"); 

     $result = $db->sql_query("INSERT INTO ".$prefix."_stories 
      (sid,catid,aid,title,time,hometext,bodytext,newsref,newsreflink,comments,counter,topic,informant,notes,ihome,alanguage,acomm,hotnews,haspoll,pollID,associated,tags,approved,section) 
     VALUES 
(NULL, '$catid', '', '$subject', now(), '$story', '$storyext', '','', '0', '0', '$topic', '$name', '', '', '$alanguage', '', '', '0', '0', '','$tag_ids','2','news')"); 

mysql_error(); 


     include ('header.php'); 
     echo "<font class=\"content\"><b>"._THANKSSUB."</b><br><br>" 
     .""._SUBTEXT."" 
     ."<br>"._WEHAVESUB." $waiting "._WAITING.""; 

     include ('footer.php'); 
    } 
+7

您有一个SQL注入漏洞。 您需要使用参数。 – SLaks 2010-03-01 18:27:17

+2

@Mac:供参考:http://www.php.net/manual/en/pdo.prepared-statements.php。关于使用PDO的教程,包括准备好的语句:http://www.kitebird.com/articles/php-pdo.html – outis 2010-03-01 18:53:30

+1

您确实在检查验证码是否有效? – jasonbar 2010-03-01 19:20:41

回答

2

最有可能的SQL injection attack。您应该立即将您的站点脱机,而不是重新启用它,直到您同时修复了漏洞并仔细检查了数据库中的恶意软件(例如Zeus dropper)。

如果您的网站允许用户生成的内容,你也应仔细过滤这些邪恶的HTML代码,JavaScript等

+0

一个残酷的现实,但是如果您可以在不保证代码安全的情况下将该网站脱机以防止进一步滥用,那么您应该这样做。 – Kzqai 2011-09-17 00:19:50

3

@Mac,

虽然要添加到和addslashes几个变量,其余的都暴露给sql注入。请申请mysql_real_escape_string功能,所有的变量,并在列表中包括以下内容:

$catid, $topic, $name, $alanguage, $tag_ids 

我建议你坚决申请mysql_real_escape_string但如果你是在一个真正着急,想速战速决尝试一下马上不不得不想知道mysql_real_escape_string究竟是什么以及它做了什么,然后至少在function submitStory内将addslashes应用于我上面提到的变量。

你可以阅读更多关于mysql_real_escape_string here

希望这有助于。让我们知道。

+0

稍等片刻,我知道这意味着什么,我只是削减了我的函数的一些代码,问题是他们如何在我的数据库中插入这些数量的查询,所以你说这个问题只是在过滤$ vars?!即时通讯肯定错误是在别的地方!也许在哪里条件 – 2010-03-01 18:56:41

+0

'哪里条件'?我的朋友,你的查询甚至不使用WHERE条件。如果您正在讨论您正在使用的功能与上面列出的功能不同的WHERE条件,那么可能是。他们如何做到这一点?这是因为你没有逃过我提到的变量,这使得他们巧妙地制定自己的查询并使用它,而不是你期望的常规输入值。有些人对DB的架构有所了解,或者擅长猜测,只能猜测并尝试注入他们的代码。那有意义吗? – Devner 2010-03-01 19:21:10

+0

我的代码是开源的,每个人都可以看到它,嗯,我应该学习更多的安全性,仍然可以肯定没有问题,因为我的变数没有任何问题,因为我逃脱了所有他们,没有列出他们在我的问题。 应该有别的东西我不知道。 他们对我的注册部分做了同样的处理,并向我的数据库中注入了大量数据,该部分由专业编码人员编写,该数据库为 。 即使这些部件都具有验证码系统。 呃 – 2010-03-01 20:04:02

0
  1. 一旦有人获得了验证码,他们可以发布任何数量的故事吗? (即现在认为该会议是安全的)。这只能证明他们是人类第一次尝试......

  2. 有人注册后是否有发布限制?

  3. 您是否为每个注册用户的会话和表单生成了一个ID,以便他们的凭证不能在XSS中使用?

如果1为真或者2和3为假,他们绝对可以运行脚本来发送数据库垃圾邮件。

+0

是的,他们可以发布任何数字,几天前我问如何阻止垃圾邮件发送者在PHP和延迟张贴,但没有收到一个很好的答案, – 2010-03-01 20:06:41

+0

为每个用户添加时间戳$ _Session。发布故事时,请检查当前时间戳与会话戳。如果它少于您设置的时间(例如,新故事为45秒,编辑为10秒),则显示错误。 – Cryophallion 2010-03-02 03:17:36