SQL注入问题。 (通过电子邮件验证?)

时间:2013-04-07 13:44:23

标签: php mysql sql sql-injection

我最近被黑客攻击,黑客检索了我所有的mailing_list数据 我想知道他们是如何通过“Validate_email”功能并设法进行sql注入的?

这是我的代码:

function validate_email($address)
{
            return (ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'. '@'. '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.' . '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z
{|}~]+$', $address));
}

if (empty($_REQUEST['email']) || !validate_email($_REQUEST['email'])) {
    die('INVALID EMAIL');
}

mysql_query("
    REPLACE INTO mailing_list
    SET email='".strtolower($_REQUEST['email'])."'
") or die('Unable to insert email to database');

die(header('Location: http://www.***'));

我想知道他们是如何使用验证电子邮件功能的。 如果这是他们设法破解的地方,或者我只是在误解我需要搜索更多..

4 个答案:

答案 0 :(得分:4)

您在电子邮件地址中允许'。虽然这可能在电子邮件地址中有效,但在mysql_query中允许它并不是一个好主意。用以下代码替换查询:

mysql_query("
   REPLACE INTO mailing_list
   SET email='".mysql_real_escape_string(strtolower($_REQUEST['email']))."'
   ") or die('Unable to insert email to database');

对于未来,请考虑切换到预准备语句,因为这些语句在SQL注入方面更安全。

答案 1 :(得分:-1)

因为你没有使用mysql_real_escape_string

而不是直接使用$ _REQUEST ['email']

$email = mysql_real_escape_string($_REQUEST['email']);
mysql_query("
REPLACE INTO mailing_list
SET email='".strtolower($email)."'
") or die('Unable to insert email to database');

答案 2 :(得分:-1)

类似输入以下内容作为电子邮件地址...

a@a.com';select * from mailing_list;

答案 3 :(得分:-2)

黄金保护规则:

绝不应使用数据验证来替换SQL数据格式。

尽管已执行(或尚未执行)任何验证,但您的查询必须正确格式化。

  

如果这是他们设法真正入侵的地方,或者我只是在误解,我需要搜索更多...

然而,这个查询几乎不可能是被盗电子邮件的原因。所以,你必须在其他地方观看。从这段代码来看,还有很多其他弱点。