【问题标题】:validate user input by typecasting通过类型转换验证用户输入
【发布时间】:2013-04-02 11:01:20
【问题描述】:

当我在网站导航上工作时,应该在网站本身上显示 GET 参数,我不知道如何验证用户输入。

“正常”的方法是使用类似 htmlspecialchars() 的方式转换输入,以避免 XSS 攻击。我决定不转换输入,而是将其类型转换为 int。

代码如下所示:

$siteinfo['current_site'] = (int) $_GET['p'];

(当然这是可能的,因为预期的输入是整数)

您对此有何看法?安全吗?你觉得有什么缺点吗?

【问题讨论】:

    标签: php security validation casting web


    【解决方案1】:

    这可能是验证 int 最安全的方法:

    $siteinfo['current_site'] = filter_input(INPUT_GET, 'p', FILTER_VALIDATE_INT);
    

    在此处阅读更多信息:http://php.net/manual/en/function.filter-input.php

    【讨论】:

      【解决方案2】:

      是的,这是安全的,假设您认为任何整数都是“安全的”。

      但是请注意,攻击者仍然可以尝试向您提供零或负值,或非常大的值,例如 999999999 或(如果您使用 64 位 PHP)甚至 9999999999999999999。如果您的代码尝试例如,运行具有那么多迭代的循环,分配具有那么多元素的数组,甚至创建那么多数据库记录,它可以作为对您的站点执行拒绝服务攻击的简单方法。

      因此,为了真正安全,您不仅应该将输入强制转换为整数,还应该验证生成的数值对于您使用它的目的是否合理。

      【讨论】:

        【解决方案3】:

        嗯,我认为这很好,但我也会把它删掉:

        // imagine you need up to four chars
        $_GET['var'] = substr($_GET['var'], 0, 4);
        

        如果是文本,那我也可以这样:

        // sample of bad guys
        $bad = array('<','>');
        $_GET['var'] = str_replace($bad, '', $_GET['var']);
        

        【讨论】:

          【解决方案4】:

          @Mahdi:这两个建议似乎都不太合适。 第一个建议将输入视为字符串 - 您使用对字符串进行操作的函数。从某种角度来看,这一切都很好($_GET 仅包含字符串),但从您期望输入为某种形式(整数)的角度来看,这并不好。

          第二个建议也是这样做的(被视为字符串),但进一步使用黑名单而不是白名单。黑名单的缺点是您忘记某些情况的风险很高。如果您完全采用这种方法,您可以以正则表达式检查的形式创建一个白名单。

          类型转换意味着输入的原始形式不正确,或者可能不正确。它也可能会自动尝试修复输入。最好明确检查输入。

          user1909426 的建议似乎是迄今为止最好的,同时也考虑了 Ilmari Karonen 的笔记。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-12-11
            • 1970-01-01
            • 1970-01-01
            • 2018-01-19
            • 2011-03-10
            相关资源
            最近更新 更多