我正在 Visual Studio 2012 中从事网站项目。这里我有一个采用单个参数的 Web 方法。该方法由
AutoCompleteExtender
控件调用。下面是它的代码:
<asp:TextBox ID="txtsearch" runat="server" CssClass="form-control setvaluework" MaxLength="4000" />
<ajx:AutoCompleteExtender ID="AutoCompleteExtender1" runat="server" TargetControlID="txtsearch" ServicePath="SearchWebService.asmx" ServiceMethod="GetWorsList"
MinimumPrefixLength="1" CompletionSetCount="20" CompletionInterval="0" EnableCaching="true" CompletionListElementID="autocompleteList" >
</ajx:AutoCompleteExtender>`
“GetWorsList”定义如下:
[WebMethod]
public List<string> GetWorsList(string prefixText)
{
List<string> workNames = null;
if (Validations.ValidWorkNoAjax(prefixText) == false)
{
return workNames;
}
else
{
if (con.State == ConnectionState.Closed)
{
con.Open();
}
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("", con);
cmd.Parameters.Add("@prefixText", SqlDbType.VarChar, 500).Value = "%" + prefixText + "%";
/*Some Code*/
return workNames;
}
}
我正在努力保护此方法免受
API Mass Assignment
的侵害。在审核扫描中,此方法被利用。在测试扫描中发出 POST 请求时,使用了以下有效负载:
{
"prefixText": "WL",
"count": 20,
"is_admin": true,
"is_sso": true,
"role": "admin"
}
并且它返回 200 OK 状态,这不应该是这种情况,因为函数只接受单个输入作为
prefixText
。
我对此进行了搜索,发现我必须
避免使用自动将客户端输入绑定到代码变量或内部对象的函数。如果适用,请显式定义并强制执行输入数据有效负载的架构。
为了实现这一目标,我尝试了以下方法:
public object GetWorsList(string prefixText)
{
var requestStrings = HttpContext.Current.Request.QueryString;
foreach (var item in requestStrings.AllKeys)
{
if (!item.Contains("prefixText") && !item.Contains("count"))
{
return BadRequest("Invalid Request");
}
}
}
我创建了一个将被接受的参数白名单。如果攻击者添加任何其他参数,则此方法将返回
BadRequest
。但同样在 POST 请求中,此方法不起作用,即我没有得到 BadRequest
。我使用以下详细信息在邮递员中对此进行了测试:
POST 请求中的 http://localhost:6949/ewbms_bb/SearchWebService.asmx/GetWorsList
我发送的有效负载是:
{
"prefixText": "WL",
"count": 20,
"is_admin": true,
"is_sso": true,
"role": "admin"
}
使用上述有效负载,该方法应返回
BadRequest
,但它给出状态代码 200 OK
。
我还尝试创建一个单独的类,如下所示:
public class WorkSearchModel
{
public string prefixText { get; set; }
public int Count { get; set; }
}
并使用
WorkSearchModel
作为我的方法参数。当我使用邮递员以及本地主机进行测试时,我收到错误:There was an error processing the request.
通过我在互联网上的搜索,我发现“API批量分配”在Asp.Net Core中得到了正确处理,但在webform/website项目中我没有发现这样的结果。请大家指导一下。
您能找到解决这个问题的方法吗?我也面临同样的情况。请指教