【问题标题】:Do you validate your URL variables?你验证你的 URL 变量吗?
【发布时间】:2010-09-15 18:04:00
【问题描述】:

当您使用 GET 请求通过您的站点传递变量时,您是否在使用它们之前对其进行验证(正则表达式、过滤器等)?

假设您有 URL http://www.example.com/i=45&p=custform。你知道“i”总是一个整数,而“p”总是只包含字母和/或数字。是否值得花时间确保没有人试图操纵这些值然后重新提交页面?

【问题讨论】:

    标签: validation url server-side


    【解决方案1】:

    是的。毫无疑问。永远不要相信用户输入。

    为了改善用户体验,可以(恕我直言,应该)在客户端验证输入字段。这可以抢占到只导致相同表单和错误消息的服务器的往返行程。

    但是,输入必须始终在服务器端进行验证,因为用户只能在 GET url 中手动更改输入数据或发送精心设计的 POST 数据。

    在最坏的情况下,您最终可能会遇到SQL injection,甚至更糟的是XSS 漏洞。

    大多数框架已经有一些内置的方法来清理输入,但即使没有这个,使用常规异常和查找表的组合来清理输入通常也很容易。

    • 假设您知道它是一个整数,使用 int.Parse 或将其与正则表达式“^\d+$”进行匹配。
    • 如果它是一个字符串并且选择有限,请制作一个字典并通过它运行字符串。如果没有匹配,请将字符串更改为默认值。
    • 如果是用户指定的字符串,则将其与严格的正则表达式匹配,例如“^\w+$”

    【讨论】:

    • 绝对……不这样做就是大意
    • +1 SQL 注入、跨站点脚本和无效数据操作。验证所有输入的原因的聚宝盆!请参阅thedailywtf.com/Articles/… 了解有史以来最可怕的例子。
    【解决方案2】:

    与任何用户输入一样,非常检查以确保它符合您的预期是非常重要的。所以是的!

    【讨论】:

      【解决方案3】:

      是的,是的,三次是的。

      当然,许多 Web 框架都会为您执行此操作,例如 Struts 2。

      【讨论】:

        【解决方案4】:

        一个重要的原因是检查sql injection。 所以是的,始终清理用户输入。

        【讨论】:

        • SQL 注入只能在 SQL 附近处理(例如,参数、准备好的语句),而不是在输入附近。你会拒绝那些名为:O'Reilly 的人吗?
        • 正确使用 SQL 占位符(假设支持它们的语言/数据库 - 如果您不支持它们,请获取现代语言/数据库)使 SQL 注入无效,无论验证如何。不过,仍有许多其他充分的理由需要验证。
        【解决方案5】:

        是的,请尽可能彻底地检查它们。在 PHP 中,我总是检查类型 (IsInt(i), IsString(p))。

        【讨论】:

          【解决方案6】:

          不仅仅是其他人在说什么。想象一个名为 nc 的查询字符串变量,当用户每页分别选择 10、50 和 100 个结果时,可以看到它的值分别为 10、50 和 100。现在想象有人将其更改为 50000。如果您只是检查它是否为整数,则每页将显示 50000 个结果,影响您的综合浏览量、服务器负载、脚本时间等。另外,这可能是您的整个数据库。当您有这样的规则(每页 10、50 或 100 个结果)时,您应该额外检查 nr 的值是否仅为 10、50 或 100,如果不是,请将其设置为默认值。这可以简单地是一个 min(nc, 100),因此如果 nc 更改为 25、75 等,它将起作用,但如果它看到任何高于 100 的值,它将默认为 100。

          【讨论】:

            【解决方案7】:

            我想强调这是多么重要。我知道第一个答案讨论了 SQL 注入和 XSS 漏洞。 SQL Injection 的最新进展是在查询字符串中传递二进制编码的 SQL 语句,如果它发现 SQL 注入漏洞,它将在数据库中的每个文本字段中添加一个 http://reallybadsite.com'/>。

            作为 Web 开发人员,我们必须验证所有输入并清理所有输出。

            请记住,黑客不会使用 IE 来破坏您的网站,因此您不能依赖网络中的任何验证。

            【讨论】:

              猜你喜欢
              • 2015-07-14
              • 2011-12-18
              • 1970-01-01
              • 2010-09-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-30
              • 1970-01-01
              相关资源
              最近更新 更多