0

我最近被黑了,黑客检索了我所有的 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

4 回答 4

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 注入方面更安全。

于 2013-04-07T13:46:52.423 回答
-1

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

a@a.com';select * from mailing_list;
于 2013-04-07T13:59:33.280 回答
-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');
于 2013-04-07T13:47:38.470 回答
-2

保护的黄金法则:

数据验证绝不能用于替代 SQL 数据格式。

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

如果这是他们真的设法入侵的地方,或者我只是弄错了,我需要搜索更多..

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

于 2013-04-07T13:52:03.123 回答