向php页面发出get
请求。其中一个键/值对被传递给该函数getReport
,该函数访问mysql数据库并返回json序列化字符串:
function getReport($untrusted) {
$tables = array(
"day" => "p_day",
"month" => "p_month"
... keys are 'untrusted', values are 'trusted' table names .....
);
$trusted = $tables[$untrusted];
if(!$trusted) {
... error out ...
}
$query = "select * from " . $trusted;
.... access mysql database, do some other stuff ...
}
问题:**这安全吗?不受信任的输入仅用作查找以获取受信任的字符串。可信字符串用于生成查询。
澄清:
数据是公开的。我担心SQL注入,或者用户能够访问连接参数或$tables
中未明确列出的表。
3条答案
按热度按时间b4wnujal1#
我在我的演示文稿SQL Injection Myths and Fallacies和我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming中描述了一种类似的方法。我称之为白名单Map,但想法是一样的。
在我的示例中,我使用array_key_exists(),因为如果您尝试访问一个不存在的散列键,就会得到一个错误。此外,如果密钥不存在,在我的示例中,我选择默认值而不是出错。但这取决于您,根据应用程序的要求,两种操作都可能是正确的。
您还应该将哈希限制为只允许给定web请求访问的表列表。不要让任何URL仅仅因为名称正确就查询数据库中的任何表。这意味着您需要为用户输入确定SQL标识符(表或列名等)的每个示例创建不同的哈希数组。
j7dteeu82#
我会大胆地说是的,这是安全的。您正在控制在SQL查询中有效使用的可能值,因此不会有意外的东西注入到您的查询中。就这么简单。
显然,如果数据是受保护的,那么除此之外还需要访问控制。
vlju58qv3#
我会说不。任何拥有URL和哈希的人都不能浏览服务器,如果它的GET只是URL参数。我想真正的答案需要更多的细节,返回的是什么,等等。
通常,如果我想要安全访问,我会传递用户名/密码或令牌,这是用户身份验证。