0

我已经读了很多遍了-只是想澄清一下(我想我很困惑)

我今天切换到 mysqli,并开始使用准备好的语句。

我准备好的陈述的例子

function read($table, $var) {
    if($stmt = mysqli_prepare($link, "SELECT * FROM ? WHERE `uid`=?")) {
        mysqli_stmt_bind_param($stmt, "si", $table, $var);
        mysqli_stmt_execute($stmt);
        return mysqli_fetch_assoc($stmt);
    } else {
        echo '<script type="text/javascript>">alert("Something went wrong");</script>';
    }
}

$info = read("users", $_SESSION['uid']);
$char = read("characters", $_SESSION['uid']);

我还需要逃避什么吗?我知道,我知道,我在任何地方都读过,使用准备好的语句时不需要逃避,但是有这样的问题担心

4

2 回答 2

4

您查询的唯一问题是您不能将 tableName 作为参数传递。只有值可以参数化。所以另一种方法是将 tableName 与您的查询连接起来。

"SELECT * FROM `" . $tableNameHere . "` WHERE `uid`=?"
于 2012-12-27T04:47:35.177 回答
-1

好吧,首先这些代码是行不通的。

所以,实际上有2个问题

  1. 我是否需要对绑定参数进行任何额外的转义

不。

  1. 如何安全地将标识符插入查询?

这取决于。只要您在代码中硬编码了表名 - 就可以按原样插入它。
但如果它来自不受信任的来源,则必须使用白名单将其过滤掉。我已经在我的其他答案中解释了它https://stackoverflow.com/a/8255054/285587

至于您链接到的问题,第二个无关紧要,第一个几乎没有意义。LIKE应该返回许多行,因此,一个人要么根本不使用 LIKE,要么不用担心它(在安全方面)。尽管就返回正确结果而言,您可能希望转义在 LIKE 中具有特殊含义的字符,但我根本不会将 LIKE 用于搜索目的。

于 2012-12-27T05:03:07.717 回答