如何解决可以独立于ASP.net导致Page.IsPostBack为true吗?
| 如果正在检查用户的角色以确定他们是否可以访问页面,是否可以安全地将此检查仅放在“ 0”中?客户端是否可能独立于ASP.net导致“ 1”;也就是说,客户端POST \到页面并设置正确的表单字段?如果可能的话,那么我认为最佳实践是检查每个页面加载的安全性,而不仅是检查“ѭ2”时的安全性。解决方法
容易。而且它甚至不必通过HTTP发布。
IsPostBack检查ViewState和Event *隐藏字段。如果您在查询字符串中提供了这些字段,则IsPostBack实际上将返回true,因此,例如,尝试使用该杰瑞操纵的查询字符串加载图像的客户端页面将导致后面的代码认为它已回发。
, 举一个具体的例子,假设您的页面上有一个按钮,只有管理员才能看到并单击:
<asp:Button runat=\"server\" ID=\"resetButton\" Text=\"Reset\" OnClick=\"resetButton_Click\" />
如果用户不是管理员,则在后面代码的if (!IsPostBack)
块中隐藏该按钮:
protected override void OnInit(EventArgs e)
{
if (!IsPostBack)
resetButton.Visible = IsAdmin();
}
private bool IsAdmin()
{
...
}
问题:非管理员可以使ѭ6中的代码执行吗?
答:是的,即使启用了视图状态和事件验证。
有人可以简单地浏览到您的页面,并在URL后面附加?__VIEWSTATE=
或?__EVENTTARGET=
(使IsPostBack
返回true
),然后单击按钮。
结论:关闭if (!IsPostBack)
中的敏感功能并不安全。
要解决此问题,请取消选中IsPostBack
或在按钮标记中添加Visible=\"False\"
(默认情况下为安全)。
, 如果您未在所有情况下都进行检查,则可能会设置一些讨厌的形式攻击。考虑到恶意用户可能只是使用所有适当的表单值构建对服务器的HTTP请求,以使ASP.NET认为它是回发。我强烈建议您检查每个请求(无论是否发回)的用户角色。
,因此,正如其他人指出的那样,这是个坏主意,您不应该在授权系统中加入漏洞。实际上,授权根本不应该在页面中进行,而应该在页面处理请求之前查看请求的HttpModules中进行。
为了专门回答这个问题,除非您使用ViewState并设置一个ViewStateUserKey值对已验证用户是唯一的,否则很容易使系统认为IsPostback为true,否则为非。它验证viewstate和event字段,并且可以伪造viewstate。即使使用计算机密钥对其进行了加密,这也是不够的,因为攻击者可以自己访问该页面,复制加密的viewstate并将其用于恶意攻击。
回顾一下,仔细研究通常在系统中如何进行身份验证,并使用现成的东西而不是手工编写。
*编辑*
答案很长:在谈论安全性时,您想将其分解为威胁并进行列举。一旦了解了威胁,就可以确定来自这些威胁的风险。一旦遇到威胁和风险,就可以确定是否值得减轻威胁,以及如何去做。例如,许多人系安全带是因为事故很常见,但我们没有采取任何措施保护自己免受外来入侵。
您似乎担心以下威胁:
未经身份验证的用户正在访问您的
现场
一些通过身份验证的用户,但是
没有所需的特权
看到页面的某些部分
跨站请求伪造
为了缓解第一个威胁,请查看进行认证的标准现成组件,例如FormsAuthenticationModule,它是Forms Authentication的一部分。这些组件内置于ASP.Net中,并且经过精心设计。
用户正确通过您的应用程序身份验证后,要确定他们是否具有特定特权,请查看基于角色的授权和RoleManagerModule。这将使您有机会将一组角色与Forms Authentication授权的每个身份相关联。
最后,您可能没有意识到,但您偶然发现了另一个安全问题,即恶意用户可能会说服位于Internet上其他位置的应用程序的授权用户对您的页面进行POST。攻击者可以在其他网页上创建隐藏表单,然后使用javascript将其提交到您的网页。如果授权用户已经登录,那么页面中应执行的所有操作均将作为受害者,但POST的所有参数均由攻击者控制(攻击者为表单及其值编写了代码)。
为了防止这种情况的发生,最简单的方法是使用我之前提到的ViewStateUserKey值,并确保使用EnableViewStateMAC或ViewStateEncryption。首选加密,因为HMAC仅能确保攻击者无法篡改视图状态,但其内容仍可恢复。加密提供机密性和完整性。
, 绝对有可能独立于ASP.Net而发布到URL。您甚至不需要浏览器。
您应该检查ASP.Net \的内置身份验证,授权和成员资格功能,而不要尝试自己动手使用。
这是一个不错的起点:http://www.4guysfromrolla.com/articles/120705-1.aspx和http://www.4guysfromrolla.com/articles/031204-1.aspx
, 对所有已经回答的人表示抱歉,但是我不同意仅检查Page.IsPostBack == false
块内的安全授权肯定是不安全的(只要打开了事件验证和加密的viewstate)。我已经在这里解释了为什么会这样,但是简短的答案是:我认为您必须先在非回发上下文中加载回发来获取viewstate和eventvalidation表单字段,然后才能欺骗回发到页面。返回的viewstate字段将使您隐藏在Page.IsPostBack == false
块内的内容在使用该viewstate的任何回发中保持隐藏,并且由于viewstate是加密的,因此无法对其进行篡改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。