我们听到很多关于使用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以便相应地采取行动???
那么我们应该使用什么?将变量,参数等传递给下一页的最安全的方法是什么?
答案 0 :(得分:2)
答案 1 :(得分:2)
您可以使用许多选项,其中大多数都需要您构建一个在页面之间传递变量的策略。
在我使用此策略的大多数项目中,我创建了一个formVariables类来保存当前活动的项目。它具有您需要通过查询字符串传递的属性。我把这个课存放在会议上。在我的基页中,我从会话中读到它。因此,在每个页面中,我都会获得此对象的值。关于这种方法的唯一不利之处是在完成工作后清理物品..
希望这会有所帮助。
答案 2 :(得分:2)
我会劝你避免使用Session在页面之间传递变量,因为这会破坏Web的无状态模型。 如果您刚刚在会话中存储了某个与某个页面相关的值,那么用户会使用他们的浏览器返回按钮返回到应该具有不同状态的同一页面,然后您就不会知道它了。
它导致读取与用户当前正在查看的页面无关的会话值的可能性 - 这对最终用户来说可能非常混乱。 如果你过分依赖它,你也会遇到会话到期的问题。
我个人尽量避免在可能的情况下使用会话,而不是隐藏的表单值+可以在回发+导航中读取的查询字符串。
答案 3 :(得分: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”作为该键中逗号分隔的值列表。
答案 4 :(得分:1)
在页面之间传递信息的最佳/最安全的方法是使用会话。
// On page 1:
this.Session["type"] = 3;
// On Page 2:
int type = (int)this.Session["type"];
您可以在会话中存储任何类型的对象,并将其存储在服务器端,因此用户无法像查询字符串,视图状态或隐藏字段那样对其进行操作
答案 5 :(得分:0)
首先,在asp.net中,您可以使用多个策略在页面之间传递值。您也有viewstate,但是viewstate存储了值并且使用在不同的场景中,您也可以使用它。而不是会话,当然还有帖子。
如果您的问题是安全问题,我建议您创建2个用户来访问数据。一个具有只读访问权限的用户,用于访问页面(Sql Inyection prevent)并验证数据抛出查询字符串。并且您的私人区域具有写入权限。
对不起,我的英语不合适。
答案 6 :(得分:0)
如果你对每个页面加载进行适当的安全检查,那么查询字符串很好并且最灵活恕我直言。
它们提供了最大的灵活性,因为页面的条目不依赖于发件人,就像在其他一些选项中一样。您可以从自己的应用程序中的任何点调用页面,或者如果需要,可以通过查询字符串从外部调用页面。它们也可以加入书签并手动修改以进行测试或直接操作。
关键是关键是为查询字符串添加适当的安全性和验证,而不是盲目地处理它。请记住,根据数据和用户的不同,seucirty不仅具有编辑或读访问权限,在数据拥有且对特定用户私有的情况下,他们可能根本无法访问数据。[/ p >
我们已经尝试了各种方法,试图隐藏查询字符串,但最终又回到了它,因为它更容易做,调试和管理。
答案 7 :(得分:0)
我喜欢使用查询字符串,因为我喜欢用户能够为常见搜索之类的内容添加书签等。例如。如果一个页面可以单独工作,那么我喜欢它能够独立工作。
使用会话/跨页回发很酷,如果你需要来自你所在页面的另一个页面才有意义,但除此之外我通常会发现查询字符串是更好的解决方案。
请记住,查询字符串是未经验证的输入,请谨慎对待任何未经验证的输入。