向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
中未明确列出的表。
答案 0 :(得分:1)
我在演示文稿SQL Injection Myths and Fallacies和我的书SQL Antipatterns: Avoiding the Pitfalls of Database Programming中描述了一种类似的方法。我称之为白名单地图,但想法是一样的。
在我的示例中,我使用array_key_exists(),因为如果您尝试访问不存在的哈希键,您将收到错误。此外,如果密钥不存在,在我的示例中,我选择默认值而不是错误输出。但这取决于你,根据应用要求,任何一种行动都可能是正确的。
您还应该将哈希限制为您希望由给定Web请求访问的表的列表。不要让任何URL只查询数据库中的任何表,因为它们的名称是正确的。这意味着您需要为每个用户输入确定SQL标识符(表或列名等)的实例创建不同的哈希数组。
答案 1 :(得分:1)
我会大胆地说是的,这是安全的。您正在控制在SQL查询中有效使用的可能值,因此不会将任何意外情况注入到查询中。就这么简单。
显然,如果数据受到保护,您将需要访问控制。
答案 2 :(得分:0)
我会说不。任何拥有URL和哈希值的人都不能浏览服务器,如果它只是URL参数。我想真正的答案需要更多细节,返回的内容等等。
通常,如果我想要安全访问,我会传递用户名/密码或令牌,这是用户身份验证。