PageMethods安全性

3
我试图将我的网站“AJAX化”以改善用户体验。就性能而言,我也试图摆脱UpdatePanel。我在Encosia上发现了一篇很棒的文章,展示了使用PageMethods进行发布的方法。我的问题是,在生产环境中,页面方法有多安全?作为公开的,是否有人可以创建JSON脚本直接向服务器发送POST请求,或者是否存在跨域检查?我的PageMethods还会将数据写入数据库(经过过滤后)。
我在页面中使用Forms身份验证,并且在页面加载时,将未经身份验证的用户重定向到登录页面。如果用户直接向该方法发送POST请求,那么这个页面上的Page Methods是否也需要检查身份验证,还是整个页面的身份验证都被继承了?(实质上,即使用户设法只发送到PageMethod,整个页面周期是否仍然发生?
谢谢。
4个回答

3

@Slaks - 我不这么认为。REST方法需要application/json内容类型。你无法通过CSRF或XSS攻击来实现这一点。我花了一些时间来查找一些证据 - 请参见http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx - Sky Sanders
你好,Sky Sanders。我的PageMethod旨在允许用户更新其个人资料设置。无论是检索数据还是更新数据,我总是使用POST方法,并确保contentType被设置。页面处理程序是标准的.aspx处理程序,在页面加载时检查IsAuthenticated。当你说FormsAuthentication除了登录页面以外都会进行保护,这是否意味着IsAuthenticated(在页面加载时)将被Page Method继承,因为它们都在同一页? - keyboardP
@TenaciousImply - 访问PageMethod需要间接处理包含它的页面,因此如果页面受FormsAuthentication保护,则只有经过身份验证的请求才会被处理。您在page_load中提到使用Request.IsAuthenticated是不必要的,因为只有经过身份验证的请求才能访问该页面。至于login.aspx,您应始终假定请求未经过身份验证,并仅公开非敏感数据/方法。 - Sky Sanders
@SkySanders,我通过谷歌找到了这个帖子,虽然它已经超过两年了,但是其中的内容可能会让其他人认为WebMethods可以防止跨站请求伪造攻击,这让我很不爽。从那篇帖子中看来,它只能保护GET请求而不能保护POST请求?如果domaina向domainb发送一个XHR并且用户在domainb上已经通过身份验证,那么在我看来,就有可能发生CSRF攻击。domaina无法读取响应,但它可以导致请求被发送并由domainb执行。 - SilverlightFox

1
我正在开发一个项目,其中大量使用了ASP.Net WebForms页面方法,并使用Ajax进行通信。这比在JavaScript中编写所有代码对我而言更加方便。

然而,保护页面方法成为了困扰我的问题。我发现可以通过Postman和Fiddler访问页面方法,从而使黑客能够操纵您的API。

我的解决方案非常简单,是我意外发现的。向页面方法添加静态Cookie请求将为任何不是该网站的应用程序返回错误。

 [WebMethod]
[ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json)]
public static string GetAnything(object dat)
{
    HttpCookie myguid = HttpContext.Current.Request.Cookies.Get(Constants.Session.PreventHacking);
    var hackguid = myguid.Value ?? ""; //other page method contents
    return "anything";
}

这句话的意思是:发送一个Postman请求到这个方法,将返回以下内容:
{
"Message": "There was an error processing the request.",
"StackTrace": "",
"ExceptionType": ""}

如果在本地主机上,可能会显示更详细的错误信息。

我知道有浏览器插件可以通过位于网站旁边来拦截API调用。我还没有测试过这个。但是需要建立一个单独的安全修复来解决这个问题。一旦我进行了一些测试,我会在这里更新。


1

您正在尝试防范 CSRF攻击。

可以通过要求在POST参数中提供授权代码并在初始页面加载时提供授权代码来预防这些攻击。(授权代码应该是每个IP地址和每个用户的,并且应该很快过期)

为了增加安全性,可以使每个授权代码只能使用一次,并使每个请求返回一个新的授权代码。 (但是,如果任何请求失败,您将需要重新加载页面)


感谢您的帮助。为了澄清,当页面加载时,我应该使用IP/Session等数据生成代码。然后用户发送POST请求。如何从客户端获取相关信息并将其放入POST参数中?是否只需使用JavaScript获取IP / User-agent信息并将其放置在参数中? - keyboardP
@TenaciousImply - 我不认为简单的CSRF / XSS在这种情况下是一个问题。 - Sky Sanders
@TenaciousImpy:我的意思是,授权码应该只适用于单个IP地址/用户(例如,安全哈希)。但是,我相信Sky Sanders是正确的,这不是一个问题。 - SLaks

0

将Pagemethods想象成页面本地的迷你Web服务。事实上,除了整个网站上放置的检查和验证以及您选择放置的检查和验证外,它们将没有额外的检查和验证。

从“封装”的角度来看,使用Pagemethods是个聪明的主意,如果您打算使用它们,那么在适当的位置尝试添加一些额外的安全措施也无妨。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接