准备好的陈述和逃避

时间:2012-12-27 04:45:55

标签: php mysql database mysqli

我已多次阅读 - 只是想澄清(我觉得我很困惑)

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

我还需要逃避任何事吗?我知道,我知道,我在任何地方都读到了你在使用准备好的陈述时不需要逃避的事情,但是有thisthis之类的问题让我担心。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:-1)

好吧,首先这段代码不起作用。

所以,实际上有2个问题

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

没有

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

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

中解释了这一点

至于你所关联的问题,第二个问题是无关紧要的,第一个问题就没什么意义了。 LIKE 假设返回许多行,因此,必须要么根本不使用LIKE或者不担心它(就安全性而言)。虽然在返回正确结果方面你可能想要转义LIKE中具有特殊含义的字符,但我根本不会将LIKE用于搜索目的。