【问题标题】:mysqli_real_escape_string, should I use it?mysqli_real_escape_string,我应该使用它吗?
【发布时间】:2012-12-10 07:38:13
【问题描述】:

我想消除sql注入,应该使用mysqli_real_escape_string()还是在mysqli中明确? 例如

$nick = mysqli_real_escape_string($_POST['nick'])

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    您应该使用prepared statements 并将字符串数据作为参数传递,但您不应该对其进行转义。

    此示例取自文档:

    /* create a prepared statement */
    if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
    
        /* bind parameters for markers */
        $stmt->bind_param("s", $city);
    
        /* execute query */
        $stmt->execute();
    
        /* bind result variables */
        $stmt->bind_result($district);
    
        /* fetch value */
        $stmt->fetch();
    
        printf("%s is in district %s\n", $city, $district);
    
        /* close statement */
        $stmt->close();
    }
    

    请注意,该示例不调用mysqli_real_escape_string。如果您将字符串直接嵌入到查询中,您只需要使用mysqli_real_escape_string,但我建议您永远不要这样做。尽可能使用参数。

    相关

    【讨论】:

    • 我完全不明白准备好的陈述,但是谢谢
    • 明天你应该做的第一件事是理解准备好的陈述,然后才能打开你的礼物。
    • 是的,我必须......但如果我应该在用户输入的每种情况下使用它,代码会很长,而只需使用 mysqli_real_escape_string 就更简单了
    • @dontHaveName:但是如果你不使用参数,留下 SQL 注入的风险要高得多。您只需在一次查询中犯一个错误,您的整个数据库都可能受到损害。如果你愿意冒这个险来节省几次击键,我想这是你的选择。
    • 非常感谢。现在我明白了:)。顺便说一句,还有其他可能危及我的网络的“黑客”吗?
    【解决方案2】:

    是的,如果您要使用占位符或某种查询构建器实现自己的查询处理器,您可以使用 mysqli_real_escape_string 来格式化字符串。

    如果您打算在代码中使用裸 API 函数(这显然是错误的做法,但在当地人中非常流行)- 最好使用准备好的语句。

    无论如何,单独使用这个函数是无法“消除sql注入”的。 mysql(i)_real_escape_string 函数不会阻止注入,也不应该用于任何保护。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2019-06-11
      • 2012-12-03
      相关资源
      最近更新 更多