此代码是否足以保护我免受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?
}
答案 0 :(得分:1)
一般规则是拒绝所有内容并仅允许通过有效字符,而不是删除您认为无效的内容。
最重要的方面是你之后使用这些字符串做什么。如果你后来有一句话说:
tsql = "SELECT * FROM Users WHERE Username='" . $username . "' AND "
那么这是主要的风险领域,尽管mysql_real_escape_string
应该避免这种情况。
通过使用允许将参数传递到数据库的库或功能,永远不会有任何sql注入,因为数据库参数不能被解释为TSQL,只留下PHP / Javascript注入的可能性。
基本上,将bind_param
函数视为唯一真正的保护。
每当在屏幕上显示数据时,请考虑使用htmlspecialchars()
之类的内容将其转换为HTML。如果您以后无需转义,那么存储转义的内容是没有意义的,只要您始终认为它是原始的,数据库中的原始数据就不会带来任何风险。
总之,您列出的代码可能会或可能不会减少注入,但有太多组合可以排除所有可能性,包括用户使用单引号(您只是替换双引号)等方面。 所有用户输入数据都有潜在危险。可以随意存储它,但每当使用它时,请确保使用上述选项之一保护您的操作。
我的PHP现在有点生疏,但完全相同的规则适用于SQL Server,Oracle,.NET,Java任何其他数据库/语言。