【发布时间】:2012-04-14 16:02:58
【问题描述】:
这段代码是否足以保护我免受 SQL 注入攻击和 PHP 注入攻击?
我在函数的包含文件中有这个函数:
function strclean ($string) {
$outstr = '';
if (strlen ($string) > 0) {
$ix = 0;
$char = substr ($string, $ix, 1);
// strip leading spaces
while ($char == ' ') {
$ix = $ix + 1;
$char = substr ($string, $ix, 1);
}
// disarm naughty characters
while ($ix < strlen ($string)) {
$char = substr ($string, $ix, 1);
if ($char == '<') $char = '<';
else if ($char == '>') $char = '>';
else if ($char == '"') $char = '"';
else if ($char == '&') $char = '&';
else if ($char < chr(20)) $char = '';
$outstr = $outstr . $char;
$ix = $ix + 1;
}
// strip trailing spaces
while (substr ($outstr, strlen ($outstr) - 1, 1) == ' ' && strlen ($outstr) > 0) {
$outstr = substr ($outstr, 0, strlen ($outstr) - 1);
}
$outstr = mysql_real_escape_string ($outstr);
}
return $outstr;
}
稍后在我的页面中,我从表单输入返回了各种字符串,例如这个例子:
$username = strclean ($_POST['username']);
$password = strclean ($_POST['password']);
甚至后来,我有以下 SQL:
$result = mysql_query ('SELECT * FROM users WHERE
username = "' . $username . '"', $dbconn) or die (mysql_error());
我没有在查询中同时搜索用户名和密码。在这之后的几行,我检查了一个有效的密码,如下所示:
if ($rowsfound == 1) {
$userrow = mysql_fetch_array ($result);
$userword = $userrow ["password"];
if ($userword == $password) {
// logon
}
else {
// incorrect password
}
}
else if ($rowsfound == 0) {
// unknown user
}
else {
// something strange happened! possible sql injection attack?
}
【问题讨论】:
-
你为什么要自己做一个而不是使用 PHP 核心中的函数?
-
鉴于阅读起来又长又复杂,我想说这不是一个可行的方法。
-
类似问题请见this answer。
标签: sql code-injection