我在CodeIgniter中遇到了一个非常奇怪的CSRF保护问题.我确保使用form_open来启动表单,在配置文件中将csrf_protection设置为true,并且我还确保隐藏的csrf名称和值字段与csrf cookie匹配,如下所示:http:// d .pr/3cfB.
当我提交表单时,我会收到"遇到错误.我们不允许您请求的操作." 错误,我不知道为什么.当我关闭csrf_protection时,表单工作正常.
更奇怪的是,我使用tank_auth库进行身份验证,并且还使用form_open作为登录表单.当csrf_protection打开时,我确实检查了登录表单中是否有隐藏的csrf字段,我能够提交表单并登录而没有任何问题.
关于我可以做些什么来调试这个问题的想法?
我目前正在考虑websockets中的CSRF漏洞.
我已经阻止了所有跨域websocket请求,但是存在脚本(例如这个python坏男孩)来绕过这样的安全措施.
是否值得在用户的index.html中包含一个令牌,它必须作为查询字符串包含在socket.io.connect()调用中?这样在服务器上我们可以检查令牌是否符合预期,否则阻止连接请求.
感谢所有的建议!
我有一个nginx服务器提供纯HTML和JS文件.
然后,js代码从API服务器调用各种REST API到GET/POST数据.
如果nginx收到对/ api/location的请求,它会将请求转发给另一个处理所有API的服务器.这个api服务器是用Ruby on Rails构建的.
由于我的所有纯HTML页面都是由nginx直接提供的,因此在呈现时我无法进行服务器端会话.
我该怎么做才能防止CSRF攻击?
我正在使用最新版本的 Django 和 Django Rest Framework。我的 Web 应用程序提供了一个当前仅由前端使用的 API。
我正在使用相同的 API 路由创建 chrome 扩展。
当我使用本地服务器runserver 命令时,我没有问题。当服务器在 HTTPS 后面运行时,我始终有 403 错误。
{"detail":"CSRF Failed: Referer checking failed - no Referer."}
Run Code Online (Sandbox Code Playgroud)
我使用的视图如下:
@method_decorator(csrf_exempt, name='dispatch')
class ObtainAuthToken(APIView):
permission_classes = (AllowAny,) #maybe not needed in your case
def post(self, request):
username = request.POST['username'].lower()
password = request.POST['password']
user = authenticate(username=username, password=password)
payload = dict()
if user is not None:
token, created = Token.objects.get_or_create(user=user)
payload['token'] = token.key
payload ["success"] = True
else:
payload['error'] = "Credentials …Run Code Online (Sandbox Code Playgroud) django ajax google-chrome-extension django-csrf csrf-protection
在阅读了CSRF保护在Rails中的工作原理后,我尝试通过执行以下操作来触发CSRF保护:
注意:我们正在使用基于cookie的会话。
我期望这会失败,因为第二个选项卡生成了一个新的,不同的CSRF令牌。提交登录表单时,提交给服务器的令牌不应该是旧的,陈旧的令牌吗?
但是,这确实有效:
在这种情况下,我得到一个InvalidAuthenticityToken异常。为什么?
我复制了一些在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中更改其"信任策略",但它是一个公共站点,这只是一个临时解决方案.
有什么奇怪的问题吗?
我们在Rails 4.1应用程序中看到了一个不幸的,可能是基于浏览器的CSRF令牌真实性问题.我们在这里发布它是为了询问社区其他人是否也看到它.
请注意,大多数错误报告工具(如Honeybadger)会自动禁止ActionController :: InvalidAuthenticityToken,因此您通常不会在错误报告工具中看到问题,除非您不想看到它.
这是问题所在,这不是一个发展问题 - 这是一个尚未被诊断出来的生产问题.
我们看到的例外是在我们网站正常登录时的ActionController :: InvalidAuthenticityToken.仔细检查表单发送的authenticity_token和会话的_csrf_token(我们使用active_record_store作为我们的session_store设置),它们只是不匹配.经过直接检查,我可以断定它们是完全不同的代币,但我不知道为什么.
这不是一个简单的新手开发人员问题,请不要回答有关如何将CSRF令牌从客户端传递到服务器或如何在我的控制器上跳过伪造保护的基本答案.我不感兴趣听到任何一个有这两个答案的人:你不知道你在说什么,你不明白问题的深度和复杂性.我只对收听流量较高的网站的人有兴趣,他们可以确认这种情况发生在非无关紧要的访问者身上(奇怪的是,似乎比其他浏览器更频繁地影响某些浏览器.)
我们广泛地看到这个问题,可能约占我们高流量网站的1-2%.我只在生产中看到它,我无法在开发中重现它.
我在IE 11和Edge浏览器上看到的最多(你会注意到Rails 4.1在IE 11和Edge之前发布),但在Android上的Chrome上也是如此,偶尔也会在移动Safari上发布.
我们的Cache-control标头设置如下:
Cache-Control: max-age=0, private, must-revalidate
好。我正式对这个问题失去了理智。
我们使用默认的Rails应用程序(5,但我也尝试使用4默认应用程序)。
我正在尝试使用一个简单的javascript代码将ajax POST请求发送到一个控制器动作。
在我的ApplicationController代码中:
class ApplicationController < ActionController::Base
after_action :set_csrf_cookie
protected
def set_csrf_cookie
cookies["X-CSRF-Token"] = form_authenticity_token
end
end
Run Code Online (Sandbox Code Playgroud)
设置"X-CSRF-Token"值为的Cookie form_authenticity_token。
之后,我可以使用以下代码在SPA(单页应用程序)中读取此cookie:
<script>
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(";");
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) === " ") c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
// …Run Code Online (Sandbox Code Playgroud) 之后我在app.js文件服务器端有以下内容bodyParser
let dotEnv = require("dotenv");
dotEnv.load();
let express = require("express");
let app = express();
if (process.env.NODE_ENV === 'production') {
app = require('./public/web/server').app;
}
let passport = require("passport");
let server = require("http").Server(app);
let io = require("socket.io").listen(server);
// load intial configuration
require("./startup/initial-configuration")(app, io);
require("./server/config/socket")(io);
require("./server/config/database")(app, process.env.NODE_ENV);
require("./server/authentication/passport.local")(passport);
require("./server/authentication/passport.impersonate");
require("./startup/initial-routes")(app);
if (process.env.NODE_ENV === 'production') {
app.get('*.*', express.static('./public/web/browser', {
maxAge: '1y'
}));
app.get('*', (req, res) => {
res.render('index', {
req,
res
}, (err, html) => {
if (html) {
res.send(html);
} …Run Code Online (Sandbox Code Playgroud) csrf-protection ×10
csrf ×5
ajax ×2
angular ×1
architecture ×1
clojure ×1
codeigniter ×1
compojure ×1
django ×1
django-csrf ×1
express ×1
javascript ×1
laravel-5 ×1
mean-stack ×1
node.js ×1
php ×1
ring ×1
security ×1
socket.io ×1
websocket ×1
xss ×1