Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用JQuery Ajax和ASP.NET通用处理程序时必须采取的XSS和CSRF预防以外的安全措施_C#_Javascript_Jquery_Asp.net_Ajax - Fatal编程技术网

C# 使用JQuery Ajax和ASP.NET通用处理程序时必须采取的XSS和CSRF预防以外的安全措施

C# 使用JQuery Ajax和ASP.NET通用处理程序时必须采取的XSS和CSRF预防以外的安全措施,c#,javascript,jquery,asp.net,ajax,C#,Javascript,Jquery,Asp.net,Ajax,我是一名纯粹的ASP.NET开发人员,使用工具箱控件创建网站。但当我研究发现,使用纯JS/JQuery和通用处理程序创建的应用程序更吸引人、更吸引用户、性能更快时,我研究了它们。现在我正在创建一个完全基于JS业务逻辑的网站,并使用ASP.NET处理程序访问数据库。我使用ASPX页面作为开始,这样捆绑和路由等功能将由这些页面完成,我的开发速度将更快 当我考虑使用JavaScript可以进行的攻击时,我发现XSS和CSRF是纯JavaScript可以进行的两种攻击。我通过清理传输到服务器的文本来防止

我是一名纯粹的ASP.NET开发人员,使用工具箱控件创建网站。但当我研究发现,使用纯JS/JQuery和通用处理程序创建的应用程序更吸引人、更吸引用户、性能更快时,我研究了它们。现在我正在创建一个完全基于JS业务逻辑的网站,并使用ASP.NET处理程序访问数据库。我使用ASPX页面作为开始,这样捆绑和路由等功能将由这些页面完成,我的开发速度将更快

当我考虑使用JavaScript可以进行的攻击时,我发现XSS和CSRF是纯JavaScript可以进行的两种攻击。我通过清理传输到服务器的文本来防止XSS攻击。通过使用CSRF令牌并将其保存到cookie中,并将该cookie值与通用处理程序中Ajax请求的令牌进行比较,可以防止CSRF攻击。这两种方法都很有效

但后来我开始思考我可能在应用程序中留下的任何其他循环漏洞。然后我想到了一个情景。以下是场景:

由于JS文件都是公开可见的,因此假设有一个函数
saveData(data)
,它将要保存在数据库中的数据和一个CSRF令牌发送给通用处理程序。现在假设攻击者使用浏览器(如chrome、opera、IE等)的Inspect元素功能调用此函数,然后 注入一个链接,如:

现在,当他单击这个注入的“Hack”链接时,
saveData()
函数将向处理程序发送“IHackedYou”和CSRF令牌(因为它存储在JS文件中的全局变量中)。处理程序将授权此请求,因为CSRF令牌与cookie令牌相同,并将在数据库中存储不需要的数据。如果攻击者手动或使用某些自动系统单击链接一千次(或更多),情况会变得更糟。这将杀死我的数据库服务器

所以我想问一下这是什么类型的攻击,我应该如何防止它?

不要依赖客户端验证 客户端完成的所有操作都必须在服务器端进行检查。这不是新的,即使在没有javascript的地方也适用。假设以下纯html表单:

<form>
  <select name="fruit">
    <option value="banana">Banana</option>
    <option value="apple">Apple</option>
  </select>
</form>
一旦用户提交了他的命令,就很容易直接使用客户端计算的
totalPrice
,但是永远不会这样做。
totalPrice
只能在客户端使用,以改善用户体验


有时这真的很重要,因为您必须重新实现相同的客户端和服务器端逻辑,这也是javascript服务器端解决方案最近流行的原因之一。

我是否应该检查用户正在更新的特定内容是否属于他在服务器端?
{
  "products": [
    {"name": "banana", "price": 2.0, "quantity": 1},
    {"name": "apple", "price": 3.0, "quantity": 2}
  ],
  "totalPrice": 8.0
}