首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql(i)_real_escape_string,安全可靠吗?

mysql(i)_real_escape_string,安全可靠吗?
EN

Stack Overflow用户
提问于 2013-03-13 23:52:54
回答 3查看 219关注 0票数 2
代码语言:javascript
复制
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;
    }

我有一个这样的函数。基本上,我像这样进行查询:

代码语言:javascript
复制
$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似乎有点过分了。

你认为如何?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-14 03:33:41

今天真的是伟大的一天-第二个很好的尝试,在一行中创建了一个合理的数据库抽象层。

我应该使用mysqli_real_escape_string进行清理吗?

不是。

仅仅因为,这个函数不会清理任何东西。

但是要格式化 SQL字符串文字,这个函数是必须的,不能避免或替换。

因此,您使用该函数的方式是完全正确的,即只对字符串进行格式化,并对其进行unconditionally.格式化

那么,你有没有你的查询完全安全的,只要你可以使用?标记来替换实际的数据(并且只要您使用mysql(i)_set_charset()函数设置SQL编码,就会使nitpick也抱怨空闲)。

如果有人说你的方法失败了--只要向他们索要完整的证明代码片段,就可以显示出某些漏洞。

但是,让我把您的注意力集中到几件重要的事情上。

  1. Dynamic SQL query parts only to string。例如,以下两个查询将不适用于您的函数:

SELECT * FROM表LIMIT ?,?SELECT * FROM表ORDER BY?

仅仅因为数字和标识符需要不同的格式。

因此,最好使用类型提示占位符,来告诉您的函数,应用哪种格式的

  • 来运行查询只是作业的一部分。你也需要得到结果。为什么不去获取它们,而不是用不必要的调用使你的代码变得臃肿呢?

  • 应该有一种插入文字的方法?标记到查询中,而不对其进行分析。

请看一下my class,它的构建原理与您的完全相同,但经过了我上面提到的改进。我希望你会发现借鉴一两个想法是有用的,或者至少是值得的。

票数 1
EN

Stack Overflow用户

发布于 2013-03-13 23:55:55

使用绑定参数并不过分,应该是必需的。它将更有效地转义并准备参数。

代码语言:javascript
复制
$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

票数 2
EN

Stack Overflow用户

发布于 2013-03-14 00:03:47

如果您使用now mysqli而不是mysql。最好使用mysqli_real_escape_string。注意参数顺序已被修改。(%和_仍未转义)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15390125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档