function Query()
{
$args = func_get_args ();
if (sizeof ($args) > 0)
{
$query = $args[0];
for ($i = 1; $i < sizeof ($args); $i++)
$query = preg_replace ("/\?/", "'" . mysql_real_escape_string ($args[$i]) . "'", $query, 1);
}
else
{
return FALSE;
}我有一个这样的函数。基本上,我像这样进行查询:
$this->Query('SELECT * FROM USERS WHERE Username = ? AND Points < ?', $username, $points);它目前支持不推荐使用的mysql函数,但适应mysqli就像在我的类中用mysqli替换mysql一样简单。
这是抵御SQL注入攻击的安全方法吗?每个问号都会被mysql_real_escape_string自动清理,我以前从未遇到过问题,但我应该使用mysqli_real_escape_string进行清理吗?
我知道mysqli的预准备语句,但对我来说,对每个变量使用bindParam似乎有点过分了。
你认为如何?
发布于 2013-03-14 03:33:41
今天真的是伟大的一天-第二个很好的尝试,在一行中创建了一个合理的数据库抽象层。
我应该使用mysqli_real_escape_string进行清理吗?
不是。
仅仅因为,这个函数不会清理任何东西。
但是要格式化 SQL字符串文字,这个函数是必须的,不能避免或替换。
因此,您使用该函数的方式是完全正确的,即只对字符串进行格式化,并对其进行unconditionally.格式化
那么,你有没有你的查询完全安全的,只要你可以使用?标记来替换实际的数据(并且只要您使用mysql(i)_set_charset()函数设置SQL编码,就会使nitpick也抱怨空闲)。
如果有人说你的方法失败了--只要向他们索要完整的证明代码片段,就可以显示出某些漏洞。
但是,让我把您的注意力集中到几件重要的事情上。
SELECT * FROM表LIMIT ?,?SELECT * FROM表ORDER BY?
仅仅因为数字和标识符需要不同的格式。
因此,最好使用类型提示占位符,来告诉您的函数,应用哪种格式的
请看一下my class,它的构建原理与您的完全相同,但经过了我上面提到的改进。我希望你会发现借鉴一两个想法是有用的,或者至少是值得的。
发布于 2013-03-13 23:55:55
使用绑定参数并不过分,应该是必需的。它将更有效地转义并准备参数。
$stmt = mysqli_prepare($link, "INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
mysqli_stmt_bind_param($stmt, 'sssd', $code, $language, $official, $percent);
$code = 'DEU';
$language = 'Bavarian';
$official = "F";
$percent = 11.2;
/* execute prepared statement */
mysqli_stmt_execute($stmt);这真的看起来有点过火了吗?
Documentation
发布于 2013-03-14 00:03:47
如果您使用now mysqli而不是mysql。最好使用mysqli_real_escape_string。注意参数顺序已被修改。(%和_仍未转义)
https://stackoverflow.com/questions/15390125
复制相似问题