从安全页面上的asp.net控件回发不安全,同时避免身份验证
-
03-07-2019 - |
题
我们正在使用标准的asp.net表单身份验证。某些页面需要用户登录;这些页面中的至少一些是由https提供的。每页顶部都有一个搜索控件。使用它时,即使当前页面需要登录,我们也不关心用户的会话是否已过期。
但是,目前,在执行搜索时,内置窗体身份验证会发现要发布到的页面需要身份验证并将用户重定向到登录页面,而上一页不是搜索结果页作为推荐人。
绕过安全的最佳方法是什么?我考虑使用PostBackUrl属性发布到不同的页面,但如果这不是https,则会得到“您将数据发布到不安全的连接”。消息,用户不喜欢。
感谢您的帮助。
编辑:感谢Nick建议您在搜索页面上使用GET。我们已经这样做了,但查询字符串由搜索输入控件构造,然后重定向。如何在不使用回发的情况下构建查询字符串? (显然javascript是一种选择,但我希望找到一种替代机制。)
解决方案 3
正如在其他答案中所建议的那样,最正确的方法是将搜索输入控件放在一个单独的表单中,该表单有一个get的方法和searchresults.aspx的操作。但是对于aspx来说这很困难,因为在页面上只能有一个服务器端表单。
最后,我找到的解决方案非常有效,就是要找到一个HttpModule,如果“搜索”的话。单击按钮(通过查看是否存在其id的param)然后通过查找标准参数并重定向到搜索结果页面来构建查询字符串。这意味着绕过所有身份验证/授权模块,因为我们已经调用了重定向到(不安全)搜索结果页面,然后才会触发它们。
它有点脆,但对我们来说效果很好。
其他提示
对于搜索页面,您要确保通过GET请求进行搜索。 (例如像查询字符串中带有“q”的谷歌)你有可能正在进行POST。
所以改变你的
<form method="post" ...>
到
<form method="get" ...>
大多数开发人员在搜索页面上犯的最大错误就是回复邮件。 HTTP被设计为通过查询字符串(因此名称)进行查询或搜索,并获得一个表单以发布到查询字符串而不是您需要使用“GET”的主体。方法。这样任何搜索设备都可以使用您的搜索页面,甚至是浏览器搜索框。
其次,您要为您创建一个特殊的位置配置搜索页面。您可以将它添加到您的web.config。
<location path="my-search-page.aspx">
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
这会为该页面创建一个特殊覆盖,并且location标记内的所有内容都使用完全相同的web.config结构来覆盖web.config。
您希望为要允许所有用户的每个页面重复此操作。
如果搜索结果页面正在执行回发,则在点击搜索按钮之前将触发pageload事件。
因此,如果他们所在的页面需要登录,则在搜索按钮单击事件将其发送回登录屏幕之前将运行登录命令。
这有几种方法可以使搜索成为正常的html表单并使其成为GET而非POST并被“Nick”引用
如果整个页面都在.net回发表单中,则需要将搜索按钮事件添加到页面加载的重载中,以便首先触发。
此网站在页面上有一篇很好的文章,例如循环及其覆盖。 http://www.15seconds.com/issue/020102.htm