我有一个关于Django CsrfViewMiddleware机制的问题.我知道,Django:
但Django不检查令牌是否已被使用(例如来自CsrfViewMiddleware):
if not constant_time_compare(request_csrf_token, csrf_token):
return self._reject(request, REASON_BAD_TOKEN)
Run Code Online (Sandbox Code Playgroud)
所以我可以使用相同的令牌POST多个请求(我在我的服务器上测试它).
它是标准的行为,还是我的Django设置不正确?谢谢.
我复制了一些在compojure 1.1.18和其他旧库中运行的旧代码,但是使用最新版本我无法使用它.
这里是我的小例子,代码从复制这里的小例子来证明,用最新环的Compojure库,我得到一个错误,当我发送一个HTTP POST,甚至与报头组.
lein ring server 启动它,然后做
curl -X GET --cookie-jar cookies "http://localhost:3000/" 结果是这样的:
{"csrf-token":"7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF"}
Run Code Online (Sandbox Code Playgroud)
但是当我这样做的时候
curl -X POST -v --cookie cookies -F "email=someone@gmail.com" --header "X-CSRF-Token: 7JnNbzx8BNG/kAeH4bz1jDdGc7zPC4TddDyiyPGX3jmpVilhyXJ7AOjfJgeQllGthFeVS/rgG4GpkUaF" http://localhost:3000/send
Run Code Online (Sandbox Code Playgroud)
我明白了 <h1>Invalid anti-forgery token</h1>
难道我做错了什么?
我借用的代码旨在回答这个问题.
我的Laravel5网站使用csrf令牌来防止CSRF攻击.在Chrome和Firefox上,eveything工作正常.
我提交了我的客户端网站进行测试,当他使用Internet Explorer(9/10)时,他使用令牌在evey页面上出现"Token mismatch"错误.
我认为这是一个cookie /会话问题.
经过一些研究,我尝试删除cookie名称中的斜杠("laravel_session"),并更改会话驱动程序(默认情况下为"file").它没有帮助.
我知道我的客户可以在IE中更改其"信任策略",但它是一个公共站点,这只是一个临时解决方案.
有什么奇怪的问题吗?
我有以下ajax调用来更新模型的特定字段
$("#updateLink").click(function(){
var dec_text = $('#desc_text').val();
$.ajax({
type: "POST",
url:"/users/update_desc/",
data: {
'val': dec_text,
},
success: function(){
$(".display, .edit").toggle();
$("#descText").html(dec_text);
},
error: function(){
alert("Error");
},
});
return false;
});
Run Code Online (Sandbox Code Playgroud)
我的观点是这样的
@csrf_exempt
def update_desc(request):
if request.is_ajax():
if request.method == 'POST':
desc_text = request.POST.get('val', False)
if desc_text:
profile = user.profile
profile.desc = desc_text
profile.save()
return_message = "Sent mail"
return HttpResponse(return_message,mimetype='application/javascript')
Run Code Online (Sandbox Code Playgroud)
我不断收到错误消息,我不知道如何解决这个问题.我甚至使用csrf_exempt装饰器来解决问题,如果问题是由于缺失引起的,csrf token但问题仍然存在.
除了ajax post在我的base模板中所有ajax调用都失败的情况.任何人都可以帮助了解这里发生的事情.如果需要,我可以提供更多细节.
编辑:
我在我的基本模板中添加了一个js包含此https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax的文件,因此这意味着它存在于我的所有模板中.我正在使用django 1.3版本.
我正在开发一个通过API为移动应用程序提供服务的Rails 4应用程序,并且有一个用于管理员管理应用程序的Web UI.还有一些用户可以看到的网页(成功的电子邮件确认和重置密码).
我创建了两组控制器:一组继承自APIController,另一组继承自AdminController.这两个都继承自ApplicationController.负责面向用户的网页的其余控制器也继承自ApplicationController.
鉴于此方案,我不确定如何使用protect_from_forgery正确实施CSRF保护.我目前有以下内容:
class ApplicationController < ActionController::Base
# ...
end
module API
class APIController < ApplicationController
protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }
# ...
end
end
module Admin
class AdminController < ApplicationController
protect_from_forgery with: :exception
# ...
end
end
class UsersController < ApplicationController
protect_from_forgery with: :exception
# ...
end
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:这是正确的吗?有没有办法改善它?APIController中的检查是否毫无意义,因为所有API请求都只是JSON吗?
Brakeman抱怨说ApplicationController中没有protect_from_forgery调用,但也许它看不到子类中的调用.
提前致谢!
TL;DR 我需要保护我的表单免受 CSRF 攻击,我想在前端使用 ReactJS,在后端使用 Flask/Flask-WTF。
我正在重构一个使用 Python、Flask 和 Flask-WTF 构建的用于表单的网站,我想将 React 用于前端,而不是通过 PyPugjs 使用 Jinja2。我正在使用 Flask-WTF 来呈现表单,它负责处理 CSRF 令牌等。我知道如何使用 React 制作表单,但如何获得 CSRF 保护?
现在我的表单渲染看起来像这样:(使用 Pug)
mixin render_form(form, id='', action='Submit')
form(method='POST', action='', id=id)
=form.csrf_token
each field in form
fieldset
if field.errors
each error in field.errors
.notification.error
#{error}
#{field(placeholder=field.label.text)}
button(type='submit') #{action}
Run Code Online (Sandbox Code Playgroud) 通常,服务器会生成一个csrf令牌,然后将其发送给客户端。当客户端提交表单时,令牌将被传递回服务器,服务器随后将对其进行验证。
如果我仅使用API Gateway和Lambda,我将如何确保所有POST / PUT请求均有效,并防止csrf攻击?关于该主题,我找不到很多文章,而且我不确定如何持久保存生成的csrf令牌,以便所有lambda函数都可以访问它。
这是AWS已经为我处理的事情,还是我需要以特殊方式专门配置它?
amazon-web-services csrf-protection aws-lambda aws-api-gateway
我知道ASP.NET MVC中的防伪令牌是如何工作的.但是仍然不清楚几个场景.我在下面提到的一个.
提交以下信息的帖子请求
在到达服务器之前,黑客修改了表单数据(名字和姓氏),使标记信息保持不变.
在这种情况下,我们如何确保安全提交的数据无需任何修改即可到达服务器
实际上这个问题是由面试官提出的.我与同事讨论过,我也在谷歌搜索过.由于我无法找到清晰度,我想在这里问一下.
我不确定这是否是一个有效的问题.如果是的话,任何帮助将不胜感激
我已经阅读了一些关于使用ValidateAntiForgeryToken防止 XSRF/CSRF 攻击的文章。然而,我所看到的似乎只与 MVC 相关。
这些是我看过的文章:
ValidateAntiForgeryToken 用途、解释和示例
ASP.NET MVC 和网页中的 XSRF/CSRF 预防
我如何在 WebForms 应用程序中实现这个或类似的东西?
我在同一台服务器上托管了多个 Laravel 站点。在我创建的最新网站中,联系表单拒绝提交,并且不会抛出 419 错误。我已经在 web.php 文件中设置了路由,就像其他网站一样,这些网站有实时、有效的联系表单,并且我以完全相同的方式生成和发送令牌 - 使用{{ csrf_field() }}.
我找到了类似问题的答案,指出您可以通过$except向 中的数组添加条目来禁用 Csrf 检查app/Http/Middleware/VerifyCsrfToken.php。我已经验证这确实解决了 419 错误:
protected $except = [
'contact',
'contact*',
];
Run Code Online (Sandbox Code Playgroud)
但我当然希望保留 Csrf 功能,并且我仅更新了$except用于故障排除值的数组。
有谁知道新的 Laravel 环境可能有什么不同,尽管传递了生成的令牌,但仍会出现 419 行为?我尝试过更新一些 ENV 设置并切换不同的东西,但除了修改$except数组之外,没有任何其他方法对这个问题产生任何影响。
由于到目前为止已经进行了一些讨论,我想我应该提供一些额外的信息和代码。
首先,这是一个 ajax 形式,但先不要从座位上跳起来。我一直在使用和不使用ajax 的情况下测试表单。如果我想使用 ajax 进行测试,我只需单击连接到 jQuery 侦听器的按钮即可。如果没有,我会更改或删除按钮的 ID,或者$("#formName").submit();在控制台窗口中运行。
上述(ajax、老式提交和带有 的 jquery 选择器.submit();)都会产生完全相同的响应 - 419 错误。
为了完整起见,这是我的 ajax 代码,它可以在我托管的所有其他网站上运行。我定义了一个 postData 数组以使其保持整洁,并console.log()在其后面直接添加了一条语句以(再次)确认令牌生成良好并且正在随请求正确传递。
var postData = {
name: $("#name").val(),
email: …Run Code Online (Sandbox Code Playgroud) csrf-protection ×10
c# ×2
csrf ×2
django ×2
django-csrf ×2
php ×2
ajax ×1
asp.net ×1
asp.net-mvc ×1
aws-lambda ×1
clojure ×1
compojure ×1
javascript ×1
jquery ×1
laravel ×1
laravel-5 ×1
python ×1
reactjs ×1
ring ×1
web ×1
webforms ×1