我正在构建一个专门为其请求和响应内容使用JSON的Web服务(即,没有表单编码的有效负载).
如果以下情况属实,Web服务是否容易受到CSRF攻击?
POST例如,没有顶级JSON对象的任何请求{"foo":"bar"}将被拒绝400.例如,POST具有该内容的请求42将因此被拒绝.
POST具有除内容类型之外的任何请求application/json将被拒绝400.例如,POST具有内容类型的请求application/x-www-form-urlencoded将因此被拒绝.
所有GET请求都是安全的,因此不会修改任何服务器端数据.
客户端通过会话cookie进行身份验证,Web服务在通过带有JSON数据的POST提供正确的用户名/密码对后为其提供,例如{"username":"user@example.com", "password":"my password"}.
补充问题:是PUT和DELETE要求日益容易受到CSRF?我问,因为似乎大多数(所有?)浏览器都不允许HTML表单中的这些方法.
编辑:添加了第4项.
编辑:到目前为止,有很多好的评论和答案,但没有人提供过这种Web服务易受攻击的特定CSRF攻击.
我正在Angular.js中实现一个网站,它正在攻击ASP.NET WebAPI后端.
Angular.js具有一些内置功能,可以帮助防止csrf.在每个http请求中,它将查找名为"XSRF-TOKEN"的cookie并将其作为名为"X-XSRF-TOKEN"的标头提交.
这依赖于Web服务器能够在对用户进行身份验证之后设置XSRF-TOKEN cookie,然后检查X-XSRF-TOKEN标头以获取传入请求.
该角文档状态:
要利用这一点,您的服务器需要在第一个HTTP GET请求中在名为XSRF-TOKEN的JavaScript可读会话cookie中设置令牌.在后续的非GET请求中,服务器可以验证cookie是否与X-XSRF-TOKEN HTTP标头匹配,因此请确保只有您域上运行的JavaScript才能读取令牌.令牌对于每个用户必须是唯一的,并且必须由服务器验证(以防止JavaScript组成自己的令牌).我们建议令牌是您网站的身份验证cookie的摘要,以增加安全性.
我找不到ASP.NET WebAPI的任何好例子,所以我在各种来源的帮助下推出了自己的例子.我的问题是 - 任何人都可以看到代码有什么问题吗?
首先我定义了一个简单的帮助器类:
public class CsrfTokenHelper
{
const string ConstantSalt = "<ARandomString>";
public string GenerateCsrfTokenFromAuthToken(string authToken)
{
return GenerateCookieFriendlyHash(authToken);
}
public bool DoesCsrfTokenMatchAuthToken(string csrfToken, string authToken)
{
return csrfToken == GenerateCookieFriendlyHash(authToken);
}
private static string GenerateCookieFriendlyHash(string authToken)
{
using (var sha = SHA256.Create())
{
var computedHash = sha.ComputeHash(Encoding.Unicode.GetBytes(authToken + ConstantSalt));
var cookieFriendlyHash = HttpServerUtility.UrlTokenEncode(computedHash);
return cookieFriendlyHash;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我在授权控制器中使用以下方法,并在调用FormsAuthentication.SetAuthCookie()后调用它:
// http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-(csrf)-attacks
// http://docs.angularjs.org/api/ng.$http
private void SetCsrfCookie() …Run Code Online (Sandbox Code Playgroud) 我是一名PHP开发人员,通过阅读Michael Hartl的教程来学习Ruby on Rails .以下是本书的引用,指的是csrf_meta_tag:
... Rails方法
csrf_meta_tag[防止]跨站点请求伪造(CSRF),一种恶意Web攻击.不要担心细节(我没有); 只知道Rails正在努力保证您的应用程序的安全.
问题是,我真的很好奇.插入csrf-param和csrf-token元标记如何阻止CSRF?我试过谷歌搜索,但找不到任何东西.
django csrf中间件无法禁用.我从我的项目中间件中评论过它,但由于缺少CSRF问题,我的登录失败了.我正在使用Django主干.如果在中间件中未启用CSRF,CSRF如何导致问题?
我必须禁用它,因为我的网站上有很多POST请求,CSRF刚刚中断.有关如何在django主干项目中完全禁用CSRF的任何反馈?
来自Django主干的"新'CSRF框架也破坏了一个外部网站,它正在进入我正在给它们的URL上进行POST(这是一个宁静的API的一部分.)我无法禁用CSRF框架我之前说过,我该如何解决这个问题?
我正在建立一个移动应用程序通过webservices与我的symfony2应用程序交谈我无法找到一种方法来禁用特定控制器/操作上的csrf保护
我想将注册数据发布到此操作并使用sf2表单验证.我不会在我的移动应用程序中调用该表单
无法更改操作中的容器参数,因为它是冻结参数而抛出异常...
我不想为整个应用程序禁用表单保护
任何线索?
谢谢 !
更新:使用symfony 2.1.x
/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'csrf_protection' => false,
));
}
Run Code Online (Sandbox Code Playgroud) 我有一个网站,人们可以这样投票:
http://mysite.com/vote/25
Run Code Online (Sandbox Code Playgroud)
这将对项目25进行投票.我想只为注册用户提供此选项,并且只有在他们想要这样做时才可以.现在我知道有人在网站上忙碌,有人给他们这样的链接:
http://mysite.com/vote/30
Run Code Online (Sandbox Code Playgroud)
然后投票将是他在项目上的位置,而他不想这样做.
这是CSRF的一个例子,我该如何防止这种情况发生.我能想到的最好的事情就是像哈希一样在链接中添加一些内容.但是,在所有链接的末尾添加一些内容会非常恼人.没有其他方法可以做到这一点.
另一件事可能有人可能会给我一些其他的例子,因为该网站对我来说似乎是相当的神话.
使用PUT或DELETE方法可以实现CSRF吗?或者PUT或DELETE的使用是否会阻止CSRF?
我现在正在使用Ruby on Rails 开发Web API.当Rails应用程序收到没有任何csrf令牌的POST请求时,将发生以下错误消息.因为该应用没有视图.
WARNING: Can't verify CSRF token authenticity
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如何在这种情况下安全地逃避csrf令牌检查?
非常感谢你提前.
可以使用try catch块捕获TokenMismatchException吗?我希望它显示实际页面并显示错误消息,而不是显示显示"VerifyCsrfToken.php第46行中的TokenMismatchException ..."的调试页面.
我对CSRF没有任何问题,我只是希望它仍然显示页面而不是调试页面.
复制(使用firefox):步骤:
实际结果:"哎呀,看起来出了问题"页面显示.预期结果:仍显示登录页面,然后传递"令牌不匹配"或其他错误.
请注意,当我清除cookie时,我没有刷新页面以使令牌生成新密钥并强制它出错.
更新(增加表格):
<form class="form-horizontal" action="<?php echo route($formActionStoreUrl); ?>" method="post">
<input type="hidden" name="_token" value="<?php echo csrf_token(); ?>" />
<div class="form-group">
<label for="txtCode" class="col-sm-1 control-label">Code</label>
<div class="col-sm-11">
<input type="text" name="txtCode" id="txtCode" class="form-control" placeholder="Code" />
</div>
</div>
<div class="form-group">
<label for="txtDesc" class="col-sm-1 control-label">Description</label>
<div class="col-sm-11">
<input type="text" name="txtDesc" id="txtDesc" class="form-control" placeholder="Description" />
</div>
</div>
<div class="form-group">
<label for="cbxInactive" class="col-sm-1 control-label">Inactive</label>
<div class="col-sm-11">
<div class="checkbox">
<label>
<input type="checkbox" name="cbxInactive" id="cbxInactive" value="inactive" />
<span …Run Code Online (Sandbox Code Playgroud)