我已经读过了 Securing AJAX Requests via GUID 和 Securing an ajax request 。现在让我解释一下我的场景,下面的代码片段可能有助于解释主题。
[WebMethod[EnableSession = True]
[ScriptMethod]
public static string CreateTitle(string strTitleName)
{
string strResult = "Custom jSon string";
if(Session["Authorized"] == "True" && !String.IsNullOrEmpty(strTitleName))
{
String strTitle = Server.HtmlEncode(strTitleName);
InsertRecordInDB(strTitle);
strResult = "Custom jSOn string" + EncryptMD5("record id");
}
return strResult;
}
以下是要在参数中发送的javascript调用。 btnCreateTitle_click是按钮客户端的click事件。 txtTitle是接受标题名称的文本框。在页面上创建验证器以验证文本框.CreateTitle是我使用scriptmanager调用的页面方法
function btnCreateTitle_Click(evnt){
if(Page.ClientValidate()){
if($get("txtTitle")){
PageMethods.CreateTitle($get("txtTitle").value,success,failure,context);
}}}
函数成功显示已创建标题的growl消息,并显示带有加密记录id的链接作为查询字符串到url以查看已创建标题的详细信息。
现在燃烧的问题,
答案 0 :(得分:4)
虽然将任何方法限制为经过身份验证和授权的用户都是微不足道的,但是当您在查询字符串中公开db id时,您确实打开了经过身份验证和授权的用户可能会寻求访问他们不能访问的记录的可能性。当db id是整数或其他一些容易猜到的标识符时尤其如此。使用Guids作为db ID可以降低风险,但不是绝对的。
你总是需要记住的是不要信任输入。通过默默无闻的安全性(即加密等)不是一种可靠的技术。您的服务应始终验证当前用户是否可以检索他们请求的记录。有时这称为行级安全性。这只能通过编程方式完成。
例如,您需要验证他们是否拥有访问他们请求的记录的权利,而不是仅确定某人有权查看记录。
这意味着您需要某种方式将记录与经过身份验证的用户相关联。
BTW:任何HTTP请求都会针对潜在的危险输入进行验证。
希望这有帮助,