只有在客户端共享 cookie 时才会发生 CSRF 攻击。
我的意思是客户端可以访问来自多个
域(例如为您存储的每个站点的 cookie 的 Web 浏览器
访问)。但是,Web 应用程序 API 客户端通常只联系
单个域(您的 API 的域)。任何跨站攻击都不能使用
您的 API 中的 cookie 作为客户端不共享(HTTP 客户端在
Web 应用程序独立于移动浏览器中的 HTTP 客户端 -
或应该是)。因此,您的 Web 应用程序 API 应该已经是
如果 API 仅适用于您的移动应用程序,则对 CSRF 是安全的。
这里有一个通用指南,用于在此处讨论的 webapi 中实现防伪令牌。
Preventing CSRF Hacks in ASP.NET WebAPI
但由于您使用的是剑道网格,我们必须研究专门用于剑道网格的东西。
1:使用WEBAPI端点:
你可以喜欢使用数据:
通过读取传输的数据功能以常规方式发送防伪令牌
transport: {
read: {
url: url,
type: "POST",
data: {
__RequestVerificationToken: $("input[name=__RequestVerificationToken]").val()
}
}
或者使用参数映射:
@Html.AntiForgeryToken()
<div id="grid"></div>
<script>
$(document).ready(function () {
$("#grid").kendoGrid({
dataSource: {
type: "json",
transport: {
read: {
url: "/Home/GetProducts",
type: "POST"
},
update: {
url: "/Home/UpdateProduct",
type: "POST"
},
parameterMap: function (options, operation) {
options.__RequestVerificationToken = $("input[name=__RequestVerificationToken]").val();
return options;
}
},
schema: {
model: {
id: "ID",
fields: {
ID: { type: "number", editable: false },
Name: { type: "string" }
}
}
},
pageSize: 10
},
height: 250,
filterable: true,
sortable: true,
pageable: true,
editable: "inline",
columns: ["ID", "Name", {command: "edit"}]
});
});
</script>
你的 webapi 控制器
[ValidateAntiForgeryToken]
public ActionResult GetProducts()
{
return Json(products);
}
[ValidateAntiForgeryToken]
public void UpdateProduct(Product updatedProduct)
{
var product = products.FirstOrDefault(p => p.ID == updatedProduct.ID);
UpdateModel(product);
}
2:使用基于 Ajax 的调用
我们会让你在 Datasource 中使用 Data 函数来向 CRUD ops 发送防伪令牌
您需要在页面上添加它以生成令牌
@Html.AntiForgeryToken()
然后在剑道网格数据源配置中这样做
.DataSource(dataSource => dataSource
.Ajax()
.Model(model=>model.Id(m=>m.PersonID))
.Read(read => read.Action("GetPersons","Home").Data("sendAntiForgery"))
.Update(up => up.Action("UpdatePerson", "Home").Data("sendAntiForgery"))
)
这是将令牌发送到 CRUD 操作的 javascript 方法
<script type="text/javascript">
function sendAntiForgery() {
return { "__RequestVerificationToken": $('input[name=__RequestVerificationToken]').val() }
}
</script>
服务器端的控制器
[ValidateAntiForgeryToken]
public ActionResult GetPersons([DataSourceRequest] DataSourceRequest dsRequest)
{
var result = persons.ToDataSourceResult(dsRequest);
return Json(result);
}
[ValidateAntiForgeryToken]
public ActionResult UpdatePerson([DataSourceRequest] DataSourceRequest dsRequest, Person person)
{
if (person != null && ModelState.IsValid)
{
var toUpdate = persons.FirstOrDefault(p => p.PersonID == person.PersonID);
TryUpdateModel(toUpdate);
}
return Json(ModelState.ToDataSourceResult());
}
如需更多帮助,请查看剑道文档中的这些链接
http://www.telerik.com/forums/kendo-grid-antiforgerytoken#fPGvzDjUyEahRPNaTEo_TA
http://www.telerik.com/forums/anti-forgery-tokens#VA3XA6lbT0WgeOwOQ3w_nQ