【问题标题】:Quick MySQLi security question [duplicate]快速MySQLi安全问题[重复]
【发布时间】:2010-05-24 03:25:34
【问题描述】:

可能重复:
Do I have to use mysql_real_escape_string if I bind parameters?

我有一个与 MySQLi 安全相关的快速问题...

例如,看一下这段代码(从用户那里获取输入,对照数据库检查用户名/密码组合是否存在):

$input['user'] = htmlentities($_POST['username'], ENT_QUOTES);
$input['pass'] = htmlentities($_POST['password'], ENT_QUOTES);

// query db
if ($stmt = $mysqli->prepare("SELECT * FROM members WHERE username=? AND password = ?"))
{
    $stmt->bind_param("ss", $input['user'], md5($input['pass'] . $config['salt']));
    $stmt->execute();
    $stmt->store_result();

    // check if there is a match in the database for the user/password combination
    if ($stmt->num_rows > 0)
    {}
}

在这种情况下,我在表单数据上使用 htmlentities(),并使用 MySQLi 准备好的语句。我还需要使用 mysql_real_escape_string() 吗?

【问题讨论】:

  • 我想我还应该问...除了使用 MySQLi 准备好的语句和 htmlentities() 之外,还有什么我应该做的,安全方面的吗?
  • 这不是在编辑您的原始问题,但已经足够好了 :)
  • htmlentities 用于向客户端显示。你不应该真的在数据库查询中使用它——它是多余的。
  • @Mark - 抱歉,这里是新用户。 :) 以后我会先搜索。
  • 无需抱歉 :) 我们这样做是为了将来参考。

标签: php security mysqli


【解决方案1】:

不,如果您使用准备好的语句绑定参数,则不需要使用mysql_real_escape_string。事实上,使用它会给你错误的结果,因为转义的数据将被插入到数据库中。 mysql_real_escape_string在不使用参数的情况下直接写入SQL字符串时需要。

【讨论】:

    【解决方案2】:

    是的,因为有非 html 相关的实体可能会对您的数据库造成真正的转义字符串捕获的损害。类似于 UTF-8 字符。

    但正如在 cmets 中所述,您正在使用 mysqli prepare 就足够了。

    如果您有兴趣,顺便说一句,MySQLi 有it's own escape string function.

    【讨论】:

    • 不会使用准备好的语句来解决这个问题吗?老实说,htmlentities() 电话似乎没有必要;我不确定他为什么这样做,除非是出于非数据库原因
    • 很抱歉没有看到那里的准备工作。是的,它是正确的。
    • 如果我在页面上显示 $_POST 数据,使用 htmlentities() 是有意义的,对吗?但如果我只是在 MySQLi 查询中使用 $_POST 数据,MySQLi 会自动转义所有内容吗?
    • @Ben 是的,它的目的是在您向客户端发送显示的文本时使用。准备好的语句会自动转义所有内容,您不需要做任何额外的事情;这是使用它们的主要好处之一
    • 啊,谢谢你的澄清。
    猜你喜欢
    • 2016-05-23
    • 2017-12-01
    • 2013-09-25
    • 1970-01-01
    • 2012-11-01
    • 2011-09-26
    • 1970-01-01
    • 2018-01-03
    • 2017-02-08
    相关资源
    最近更新 更多