【问题标题】:What is the best alternative for QueryStringQueryString 的最佳选择是什么
【发布时间】:2009-02-28 07:37:45
【问题描述】:

我们听到了很多关于使用 QueryStrings 的漏洞和可能的攻击。 除此之外,昨天,一个错误让我非常恼火,以至于我决定停止使用 QueryStrings,我传递了如下内容:

Dim url As String = "pageName.aspx?type=3&st=34&am=87&m=9"

我试过了

Response.Write(url) 

在重定向页面中,它打印了“类型”为 3,然后我在目标页面中尝试了它,它打印了 3,0....我知道这很容易处理,但为什么呢?我的意思是为什么我应该通过 3 并且必须在下一页的加载中检查 3.0 以采取相应的行动???

那么我们应该使用什么?将变量、参数...等传递到下一页最安全的方法是什么?

【问题讨论】:

    标签: asp.net vb.net query-string page-lifecycle


    【解决方案1】:

    你可以使用Cross-Page Postbacks

    也请查看这篇文章:

    【讨论】:

      【解决方案2】:

      您可以使用许多选项,其中大多数都需要您构建在页面之间传递变量的策略。

      在我使用这种策略的大多数项目中,我创建了一个 formVariables 类来保存当前活动的项目。它具有您需要通过查询字符串传递的属性。我在会话中存储这个类。在我的基本页面中,我从会话中读取它。所以在每一页我都得到了这个对象的值。这种方法唯一的缺点是在你完成工作后清理物品..

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        我建议您避免使用 Session 在页面之间传递变量,因为这会破坏 Web 的无状态模型。 如果您刚刚在会话中存储了一些与某个页面相关的值,那么用户使用浏览器的后退按钮返回到应该具有不同状态的同一页面,那么您将不会知道它。

        这导致读取与用户当前正在查看的页面无关的会话值的可能性 - 这可能会让最终用户感到非常困惑。 如果您过于依赖会话过期,也会遇到会话过期问题。

        我个人尽量避免在可能的情况下使用会话,而不是隐藏表单值 + 可以在回发 + 导航时读取的查询字符串。

        【讨论】:

          【解决方案4】:

          在页面之间传递信息的最佳/最安全的方式是使用会话。

          // On page 1:
          this.Session["type"] = 3;
          
          // On Page 2:
          int type = (int)this.Session["type"];
          

          您可以在会话中存储任何类型的对象,并且它存储在服务器端,因此用户无法像查询字符串、视图状态或隐藏字段一样操作它

          【讨论】:

            【解决方案5】:

            你说:

            它打印了 3,0....我知道这很容易解决,但为什么呢?我的意思是为什么我应该通过 3 并且必须检查 3.0

            “3,0”(三个 逗号 oh)和“3.0”(三个 oh)是有区别的。你还说你在“传递类似的东西”。

            在查询字符串中,如果您在同一个键中传递多个值,它们将用逗号分隔。

            由于所有值都作为字符串传递,因此 int "3" 不可能神奇地变成十进制 "3.0",除非您在请求时对其进行解析。

            我会回去仔细检查你传递给你的 URL 的内容,如果它最终是这样的:

            pageName.aspx?type=3&st=34&am=87&m=9&type=0
            

            然后当你回读时

            Request.QueryString["type"]
            

            您将在该键中以逗号分隔值列表的形式返回“3,0”。

            【讨论】:

              【解决方案6】:

              首先,在 asp .net 中,您可以使用多种策略在页面之间传递值。您也有视图状态,但是视图状态存储的值和使用情况不同,您也可以使用它。会议代替,当然是通过邮寄形式。

              如果您的问题是安全性,我建议您创建 2 个用户来访问数据。一个具有只读访问权限的用户,用于访问页面(防止 Sql Inyection )并验证数据抛出查询字符串。还有一个对您的私有区域具有写访问权限。

              对不起,我看不懂的英语。

              【讨论】:

                【解决方案7】:

                我喜欢使用查询字符串,因为我希望用户能够为常见搜索等内容添加书签。例如。如果一个页面可以独立工作,那么我喜欢它能够独立工作。

                如果您需要从另一个页面访问您所在的页面,那么使用会话/跨页面回发很酷,但否则我通常会发现查询字符串是更好的解决方案。

                请记住,查询字符串是未经验证的输入,并谨慎对待它们,就像对待任何未经验证的输入一样。

                【讨论】:

                  【解决方案8】:

                  如果您在每个页面加载时都进行了适当的安全检查,那么查询字符串就可以了,恕我直言,这是最灵活的。

                  它们提供了最大的灵活性,因为页面的入口点不像其他选项那样依赖于发件人。您可以从您自己的应用程序中的任何位置调用页面,如果需要,可以通过查询字符串从外部调用页面。它们还可以添加书签并手动修改以进行测试或直接操作。

                  再次,关键是为查询字符串添加适当的安全性和验证,而不是盲目地处理它。请记住,安全不仅仅是拥有编辑或读取权限,具体取决于数据和用户,在特定用户拥有和私有数据的情况下,他们可能根本无法访问具有这些参数的数据。

                  我们尝试了各种方法,试图隐藏查询字符串,但最终还是回到了它,因为它更容易操作、调试和管理。

                  【讨论】:

                    猜你喜欢
                    • 2017-05-08
                    • 2012-03-15
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-09-14
                    • 2021-08-01
                    相关资源
                    最近更新 更多