我已多次阅读 - 只是想澄清(我觉得我很困惑)
我今天切换到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']);
我还需要逃避任何事吗?我知道,我知道,我在任何地方都读到了你在使用准备好的陈述时不需要逃避的事情,但是有this和this之类的问题让我担心。
答案 0 :(得分:4)
您查询的唯一问题是您不能将tableName作为参数传递。 只能参数化值。所以另一种方法是将tableName与您的查询连接起来。
"SELECT * FROM `" . $tableNameHere . "` WHERE `uid`=?"
答案 1 :(得分:-1)
好吧,首先这段代码不起作用。
所以,实际上有2个问题
- 我是否需要对绑定参数进行任何额外的转义
醇>
没有
- 如何安全地将标识符插入查询?
醇>
这取决于。只要您的代码中有您的表名硬编码 - 可以按原样插入 但如果它来自不受信任的来源,则必须使用白名单将其过滤掉。 我在其他答案https://stackoverflow.com/a/8255054/285587
中解释了这一点至于你所关联的问题,第二个问题是无关紧要的,第一个问题就没什么意义了。 LIKE 假设返回许多行,因此,必须要么根本不使用LIKE或者不担心它(就安全性而言)。虽然在返回正确结果方面你可能想要转义LIKE中具有特殊含义的字符,但我根本不会将LIKE用于搜索目的。