这段代码足以保护我免受SQL注入攻击和PHP注入攻击吗?
这段代码足以保护我免受SQL注入攻击和PHP注入攻击吗 我将此函数包含在函数的include文件中:这段代码足以保护我免受SQL注入攻击和PHP注入攻击吗?,sql,code-injection,Sql,Code Injection,这段代码足以保护我免受SQL注入攻击和PHP注入攻击吗 我将此函数包含在函数的include文件中: function strclean ($string) { $outstr = ''; if (strlen ($string) > 0) { $ix = 0; $char = substr ($string, $ix, 1); // strip leading spaces while ($char == ' ') { $ix = $i
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;
}
甚至后来,我有了以下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?
}
一般的规则是否认一切,只允许有效的字符,而不是删除你认为无效的。 最重要的一点是以后如何处理这些字符串。如果你有一句话后来说:
tsql=“从用户名=”的用户中选择*”$用户名。“'和”
这是主要的风险领域,尽管mysql\u real\u escape\u string
应该避免这种情况
通过使用允许将参数传递到数据库的库或特性,永远不会有任何sql注入,因为数据库参数无法解释为TSQL,只允许PHP/Javascript注入。
基本上,将bind_param
函数视为唯一真正的保护
每当在屏幕上显示数据时,考虑一些类似于“代码> HTMLPrimeCARSARS())的代码,将其转换为HTML。如果你需要它,在以后不被释放的时候存储它是没有意义的,只要你一直认为它是原始的,数据库中的原始数据就不会有风险。 总之,您列出的代码可能会减少注入,也可能不会减少注入,但有太多的组合,无法排除所有可能性,包括用户使用单引号(您只是在替换双引号)等方面。 所有用户输入数据都有潜在危险。您可以随意将其原始存储,但无论何时使用,请确保使用上述选项之一保护您的操作
我的PHP现在有点生疏了,但SQL Server、Oracle、.NET、Java和其他任何数据库/语言都适用同样的规则。为什么你要自己制作一个,而不是在PHP核心中使用函数?因为它很长,而且读起来很复杂,我认为这不是一个可行的方法。请看一个类似的问题。可能重复的可能重复的可能重复的后面,我有一行写着:
$result=mysql\u query('SELECT*FROM username=“”。$username.”,$dbconn)代码>我不在查询中搜索密码。几行之后,我根据数据库上的密码测试了提供的密码。是的,这正是要避免的类型!如果有人发现您的复杂逻辑中存在缺陷,他们可以将任何语句注入该SQL。查看mysql库中的bind_param
函数并使用它们。这样就根本不需要逃跑了。理论上,你可以假设mysql\u real\u escape\u string
可以防止这种情况发生,但我从不冒险。
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?
}