1

我们听说了很多关于使用 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 以相应地采取我的行动???

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

4

8 回答 8

2

您可以使用Cross-Page Postbacks

还要检查这篇文章:

于 2009-02-28T07:45:13.320 回答
2

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

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

希望这可以帮助。

于 2009-02-28T07:47:09.447 回答
2

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

它导致读取与用户当前正在查看的页面无关的会话值的可能性——这对最终用户来说可能非常混乱。如果您过于依赖会话过期,您也会遇到会话过期问题。

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

于 2010-08-17T15:10:31.057 回答
1

你说:

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

“3,0”(三个逗号哦)和“3.0”(三个哦)是有区别的。您还说您正在“通过类似的东西”。

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

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

如果最终结果类似于:

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

然后当你回读

Request.QueryString["type"]

您将获得“3,0”作为该键中以逗号分隔的值列表。

于 2009-02-28T21:30:18.437 回答
1

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

// On page 1:
this.Session["type"] = 3;

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

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

于 2009-02-28T21:45:12.537 回答
0

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

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

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

于 2009-02-28T10:18:55.837 回答
0

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

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

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

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

于 2009-02-28T11:19:21.853 回答
0

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

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

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

于 2009-02-28T11:25:45.223 回答