【发布时间】:2013-06-12 23:48:57
【问题描述】:
通过检查列出这些表的表,将表名与可接受表的白名单进行比较。该列表必须是动态的,这就是我选择不使用数组的原因。设置变量部分中的变量是否安全?他们来了用户提交的帖子数据。
if ($stmt = $mysqli->prepare("INSERT INTO `" . mysql_real_escape_string($tablename) . "` (item_name, item_price, item_position, item_type, multi_link_id) values (?, ?, ?, ?, ?)")) {
//Build Parameters
$stmt->bind_param('sdiii', $additemnameb, $additempriceb, $itempositionb, $itemtypeb, $linkidb);
//Set Variables
$additemnameb = $additemname;
$additempriceb = $additemprice;
$itempositionb = $itemposition;
$itemtypeb = $itemtype;
$linkidb = $linkid;
//Execute Statement
$stmt->execute();
//Close Statement
$stmt->close();
}else{
//Errors
printf("Prepared Statement Error: %s\n", $mysqli->error);
}
编辑有一个实际问题,以明确我关心的问题。
【问题讨论】:
-
这不是问题。
-
你为什么在 mysqli 中使用 mysql_real_escape_string?选择一个扩展(并注意 php_mysql 在 5.5 中已被弃用等待删除)。准备好的语句是安全的:)
-
@Martin,使用 mysql_real_escape_string 在从以前的方法切换时过度使用。我很担心,因为这些值来自用户提交的 POST 数据,只是感觉很脏。我仍在学习 PHP,我所拥有的很多东西都是教程。现在我正在经历和实施安全性,同时对代码进行更改以使其成为“自己的”,试图全面了解各个方面,准备好的语句还不是全面了解的一部分。
-
与其转义
$tablename,不如将$tablename与可接受的 表名数组进行比较。如果不在白名单中,则不执行查询。 -
@MichaelBerkowski 我将摆脱 tablename 的转义,但正如我在帖子中提到的那样,我确实计划将它与从一个单独的表构建的白名单进行检查,该白名单出于不同的原因需要,但是在这种情况下,恰好可以完美地用作白名单。
标签: php mysql mysqli prepared-statement