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

wnrlj8wa  于 2022-10-22  发布在  PHP
关注(0)|答案(3)|浏览(274)

向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中未明确列出的表。

b4wnujal

b4wnujal1#

我在我的演示文稿SQL Injection Myths and Fallacies和我的书SQL Antipatterns Volume 1: Avoiding the Pitfalls of Database Programming中描述了一种类似的方法。我称之为白名单Map,但想法是一样的。
在我的示例中,我使用array_key_exists(),因为如果您尝试访问一个不存在的散列键,就会得到一个错误。此外,如果密钥不存在,在我的示例中,我选择默认值而不是出错。但这取决于您,根据应用程序的要求,两种操作都可能是正确的。
您还应该将哈希限制为只允许给定web请求访问的表列表。不要让任何URL仅仅因为名称正确就查询数据库中的任何表。这意味着您需要为用户输入确定SQL标识符(表或列名等)的每个示例创建不同的哈希数组。

j7dteeu8

j7dteeu82#

我会大胆地说是的,这是安全的。您正在控制在SQL查询中有效使用的可能值,因此不会有意外的东西注入到您的查询中。就这么简单。
显然,如果数据是受保护的,那么除此之外还需要访问控制。

vlju58qv

vlju58qv3#

我会说不。任何拥有URL和哈希的人都不能浏览服务器,如果它的GET只是URL参数。我想真正的答案需要更多的细节,返回的是什么,等等。
通常,如果我想要安全访问,我会传递用户名/密码或令牌,这是用户身份验证。

相关问题