【发布时间】:2011-01-02 08:08:38
【问题描述】:
我知道 mysql_real_escape_string()
在以下字符前添加反斜杠:\x00、\n、\r、\、'、" 和 \x1a
我知道这如何保护查询不被注入到 where 子句中的变量之类的东西中。但这里有一个我不确定的场景:
$query = "SELECT * FROM $db WHERE 1";
如果 $db 取自用户输入,则用户可以插入如下内容:
$db = 'RealDatabase WHERE 1; DELETE FROM RealDatabase WHERE 1; SELECT FROM RealDatabase';
据我了解,mysql_real_escape_string() 不会影响这个字符串,
进行最终查询:
$query = "SELECT * FROM RealDatabase WHERE 1; DELETE FROM RealDatabase WHERE 1; SELECT FROM RealDatabase WHERE 1";
这将删除数据库。是否还有其他我不知道的保护级别?
【问题讨论】:
-
为什么还要接受用户输入的数据库名称?
-
我们的数据集非常大,所以我们把它分成了一百个左右的表。 GET 变量确定页面应该查询哪个表。
-
一种简单的方法是将该变量的值与白名单中的一组允许值进行比较,例如
if( ! in_array($_GET['table'], $allowed_tables) die('HAX!'). -
@Brian:这听起来没有必要,而且存在严重的安全风险。你有多少行?
-
我们有 52 张桌子。它们都有 100,000 和 1,000,000 行,选择查询的速度非常重要。
标签: php mysql sql-injection