我正在为公共访问类别创建一个随机字母数字,只能通过在url链接中使用此字母数字的post id找到。奇怪的是,我只在使用数值时从查询中获得结果。
$sql = "SELECT *
FROM $a
WHERE access_key = $category_id
我得到一个“未知列”错误,其中包含alphnumeric数据作为列,我觉得有点奇怪。我认为这可能是一些简单的事情,比如逃避需要做的事情,但我并不确定。
任何建议都会得到满足。提前谢谢。
答案 0 :(得分:2)
这是正确的方法,也可以解决您所看到的错误。
的mysqli:
// assuming $a is already safe
$stmt = $mysqli->prepare('SELECT * FROM '. $a .' WHERE access_key = ?');
$stmt->bind_param('s', $category_id);
$stmt->execute();
PDO:
// assuming $a is already safe
$stmt = $pdo->prepare('SELECT * FROM '. $a .' WHERE access_key = :category_id');
$stmt->execute(array(':category_id'=>$category_id));
至于白名单......这是一个基本的例子(在任何sql操作之前都这样做):
$safe = array('categorytable','usertable');
if (!in_array($a,$safe)) { return; exit; die(); /*lol*/ }
ORRRRR ....如果您只是想快速修复当前的sql代码行(但请考虑将来做好准备):
$sql = "SELECT *
FROM $a
WHERE access_key = '$category_id'";
答案 1 :(得分:0)
如tadman所述,永远不要在SQL中使用直接的$ _GET或$ _POST值。用这样的东西保护它:
boolean
由于你没有在撇号中包装你的价值,MySQL认为它是一个专栏。所以,写下这样的东西:
Function protectSQL($val, $type=‘text’) {
$val = get_magic_quotes_gpc() ? stripslashes($val) : $val;
switch ($type) {
case "text":
$val = ($val != "") ? "'" . $val . "'" : "NULL";
break;
case "long":
case "int":
$val = ($val != "") ? intval($val) : "NULL";
break;
}
return $val;
}
你会得到像以下一样干净的东西:
$sql = sprintf("SELECT * FROM %s WHERE access_key = %s", $a, protectSQL($val)); // $val is passed in the functions above, and $a has to be guaranteed...
请记住,$ a假定来自您的代码,因此没有添加任何保护。如果它来自客户端,则一个简单的in_array命令可以确保它是一个有效的表。