预处理语句和转义


Prepared statements and Escaping

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

我今天切换到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']);

我还需要转义吗?我知道,我知道,我在任何地方都读过,当使用预处理语句时,你不需要转义,但是接下来有这样的问题,这让我担心。

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

"SELECT * FROM `" . $tableNameHere . "` WHERE `uid`=?"

首先,这段代码是行不通的。

实际上有两个问题

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

  • 如何安全地将标识符插入查询?
  • 视情况而定。只要在代码中硬编码了表名,就可以按原样插入。
    但如果它来自不受信任的来源,您必须使用白名单将其过滤掉。我已经在我的另一个答案中解释过了https://stackoverflow.com/a/8255054/285587

    至于你链接到的问题,第二个是不相关的,第一个是没有意义的。LIKE 假定返回许多行,因此,必须要么根本不使用LIKE,要么不用担心它(就安全而言)。虽然为了返回正确的结果,您可能希望转义在LIKE中具有特殊含义的字符,但我根本不会将LIKE用于搜索目的。