我最近被黑客攻击,黑客检索了我所有的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.***'));
我想知道他们是如何使用验证电子邮件功能的。 如果这是他们设法破解的地方,或者我只是在误解我需要搜索更多..
答案 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)
黄金保护规则:
尽管已执行(或尚未执行)任何验证,但您的查询必须正确格式化。
如果这是他们设法真正入侵的地方,或者我只是在误解,我需要搜索更多...
然而,这个查询几乎不可能是被盗电子邮件的原因。所以,你必须在其他地方观看。从这段代码来看,还有很多其他弱点。