我在页面中使用Forms身份验证,并且在页面加载时,将未经身份验证的用户重定向到登录页面。如果用户直接向该方法发送POST请求,那么这个页面上的Page Methods是否也需要检查身份验证,还是整个页面的身份验证都被继承了?(实质上,即使用户设法只发送到PageMethod,整个页面周期是否仍然发生?
谢谢。
PageMethods的安全性取决于它所在的处理程序。
FormsAuthentication将保护除登录页面以外的所有内容。
对于未受保护的处理程序(如登录),您应仅公开不敏感或验证用户的方法。
编辑:针对有关CSRF和XSS的评论和其他答案,请参见http://weblogs.asp.net/scottgu/archive/2007/04/04/json-hijacking-and-how-asp-net-ajax-1-0-mitigates-these-attacks.aspx
然而,保护页面方法成为了困扰我的问题。我发现可以通过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";
}
{
"Message": "There was an error processing the request.",
"StackTrace": "",
"ExceptionType": ""}
如果在本地主机上,可能会显示更详细的错误信息。
我知道有浏览器插件可以通过位于网站旁边来拦截API调用。我还没有测试过这个。但是需要建立一个单独的安全修复来解决这个问题。一旦我进行了一些测试,我会在这里更新。
您正在尝试防范 CSRF攻击。
可以通过要求在POST参数中提供授权代码并在初始页面加载时提供授权代码来预防这些攻击。(授权代码应该是每个IP地址和每个用户的,并且应该很快过期)
为了增加安全性,可以使每个授权代码只能使用一次,并使每个请求返回一个新的授权代码。 (但是,如果任何请求失败,您将需要重新加载页面)
将Pagemethods想象成页面本地的迷你Web服务。事实上,除了整个网站上放置的检查和验证以及您选择放置的检查和验证外,它们将没有额外的检查和验证。
从“封装”的角度来看,使用Pagemethods是个聪明的主意,如果您打算使用它们,那么在适当的位置尝试添加一些额外的安全措施也无妨。