ASPMVC-从客户端检测到潜在危险的Request.Form值

时间:2018-09-04 17:28:18

标签: c# asp.net-mvc

我有一个System.ArgumentNullException: Array cannot be null. Parameter name: bytes at System.Text.ASCIIEncoding.GetBytes(String chars, Int32 charIndex, Int32 charCount, Byte[] bytes, Int32 byteIndex) at System.Net.HttpWebRequest.GenerateRequestLine(Int32 headersSize) at System.Net.HttpWebRequest.SerializeHeaders() at System.Net.HttpWebRequest.EndSubmitRequest() at System.Net.HttpWebRequest.GetResponse() at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange. WebServices.Data.IEwsHttpWebRequest.GetResponse() at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse( IEwsHttpWebRequest request) at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest( IEwsHttpWebRequest& request) at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecute() at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute() at Microsoft.Exchange.WebServices.Data.ExchangeService.InternalBindToItems( IEnumerable`1 itemIds, PropertySet propertySet, String anchorMailbox, ServiceErrorHandling errorHandling) at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToItem(ItemId itemId, PropertySet propertySet) at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToItem[TItem](ItemId itemId, PropertySet propertySet) at Microsoft.Exchange.WebServices.Data.EmailMessage.Bind(ExchangeService service, ItemId id, PropertySet propertySet) 应用程序,然后有一个表单,用户可以在其中创建用户名和密码。

用户收到以下消息错误:

 ChangeCollection<ItemChange> changeCollection=null;
 List<Item> syncedItems = null;

 changeCollection = _exchangeService.SyncFolderItems(exchangeFolder.Id,
                new PropertySet(BasePropertySet.IdOnly, ItemSchema.ItemClass), null,
                _syncBatchSize,
                SyncFolderItemsScope.NormalItems,
                currentSyncState);

 syncedItems = changeCollection.Where(d => d.ChangeType == ChangeType.Create || d.ChangeType == ChangeType.Update)
                        .Select(c => c.Item).ToList();

foreach (var item in syncedItems)
{
  if (!item.ItemClass.Equals("IPM.SkypeTeams.Message"))
      continue;

  EmailMessage message = EmailMessage.Bind(_exchangeService, item.Id.UniqueId,
                    new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.Attachments,
         ItemSchema.TextBody));
   //...code to store message
 }

用户正在创建以下密码:

ASP.NET MVC

我猜服务器由于A potentially dangerous Request.Form value was detected from the client (Password="1e.q<Tm6"). 字符而拒绝了该字符串。

  

这是预期的行为吗?通常在密码输入中不允许使用这些字符吗?如果允许的话,如何保证控制器安全但允许使用这些字符?

谢谢

2 个答案:

答案 0 :(得分:0)

是的。这是预期的行为。收到错误的原因是,提交表单时,asp.met mvc框架将检查请求正文,以查看它是否具有任何潜在危险的内容(如HTML标记)( 考虑脚本注入 )。如果检测到任何危险内容,则请求验证模块将引发错误。这是设计使然

您可以将AllowHtml属性应用于视图模型属性,以便请求验证框架在执行请求验证步骤时将忽略此特定属性。

public class LoginVM
{
   public string UserName { set;get;}

   [AllowHtml]
   public string Password { set; get; }
}

下面的文字来自msdn官方页面,我认为这是相关的。

  

强烈建议您的应用程序明确检查所有   禁用请求验证以防止脚本的模型   漏洞。

答案 1 :(得分:0)

使用控制器上的属性 [ValidateInput(false)]

[HttpPost]     
[ValidateInput(false)]
[ValidateAntiForgeryToken]
public ActionResult Create(Product model)

如果它是发送到服务器的HTML类型的内容,请使用 WebUtility.HtmlEncode 方法对字符串进行编码,并使用 WebUtility.HtmlDecode 进行读取。