使用哈希将不受信任的输入转换为可信输入

时间:2011-11-23 22:13:36

标签: php mysql security

向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 个答案:

答案 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参数。我想真正的答案需要更多细节,返回的内容等等。

通常,如果我想要安全访问,我会传递用户名/密码或令牌,这是用户身份验证。