我的理解是,CSRF 可以防止攻击者使用<img>标签让受害者的浏览器发送使用会话 cookie 进行身份验证的请求。鉴于<img>s 总是使用 GET 请求而不是 POST 提交,那么为什么需要在 POST 请求中要求 CSRF 令牌呢?
此外,攻击者无法在无法运行代码的情况下在网页中提交表单(即 XSS 攻击),在这种情况下,他们无论如何都可以绕过您的 CSRF 保护。
我想自动备份需要登录的网站的网页内容。我尝试通过模拟 POST 请求来登录。但我收到错误:
csrf token: CSRF attack detected
Run Code Online (Sandbox Code Playgroud)
以下是我使用的代码的一些摘录:
func postLoginForm(csrfToken string) {
values := make(url.Values)
values.Set("signin[username]", "myusername")
values.Set("signin[password]", "mypassword")
values.Set("signin[_csrf_token]", csrfToken)
resp, err := http.PostForm("https://spwebservicebm.reaktor.no/admin/nb", values)
dumpHTTPResponse(resp) // show response to STDOUT
}
Run Code Online (Sandbox Code Playgroud)
我通过获取登录页面并扫描名为 的隐藏输入字段来获取 csrf 令牌signin[_csrf_token]。执行此操作的代码的重要部分如下:
// Finds input field named signin[_csrf_token] and returns value as csrfToken
func handleNode(n *html.Node) (csrfToken string, found bool) {
if n.Type == html.ElementNode && n.Data == "input" {
m := make(map[string]string)
for _, attr := range n.Attr {
m[attr.Key] = …Run Code Online (Sandbox Code Playgroud) 我在使用 csrf 令牌测试视图时遇到问题。
这段代码
class ViewTests(TestCase):
def test_bets_view(self):
login_page = self.client.get('/users/login/')
print(login_page.content)
Run Code Online (Sandbox Code Playgroud)
返回带有 CSRF 隐藏输入的 HTML。
我需要将这个东西与以前的 HTML 进行比较,
expected_html = render_to_response('login.html',
dictionary={'form': LoginForm()})
Run Code Online (Sandbox Code Playgroud)
没有隐藏的 CSRF 输入。所以断言失败。
如何在测试客户端中禁用 CSRF 渲染?
我没有使用像把手或视图这样的模板语言(我捆绑了客户端代码),所以我很难弄清楚如何在不将其传递到视图的情况下发送 csrf 令牌。
几乎所有示例都像这样注入令牌服务器端:
app.get('/form', csrfProtection, function(req, res) {
// pass the csrfToken to the view
res.render('send', { csrfToken: req.csrfToken() })
})
Run Code Online (Sandbox Code Playgroud)
我不完全确定注入是否是安全机制正常工作所必需的。
注意:我将 cookie 选项设置为 true,并且在 csurf 之前调用了 cookie 解析器 - 但我仍然收到ForbiddenError: invalid csrf 令牌(我相信这是因为我将 _csrf 秘密作为令牌发回,但我猜它发送秘密,_csrf,我们还必须连同它一起发送 csrf 令牌。
题:
是否有其他可接受的方式将 csrf 令牌发送到客户端(例如 headers、cookies、res.body 等)?
好吧,仍然试图围绕它们是什么,并且需要......相信我我已经阅读了很多并且认为我理解但我可能不......
我能得到的最接近的是,当您的网站上有任何形式的登录页面时,绝对需要它们......
我的问题是,当您出于任何原因拥有基本的联系表格和/或填写表格时……您是否需要这些页面的 CSRF 令牌?
我有一个使用 ExpressJS 构建的 NodeJS 应用程序。经过安全审查后,我被建议对所有表单和 ajax 提交实施 CSRF。为此,我使用了csurf包。为此,我们需要在每个表单页面中传递 CSRF 令牌,然后将其与表单提交数据一起返回。
首先,我尝试对包含表单的页面单独执行此操作。但后来我意识到我的页眉中有一个搜索表单,它出现在所有页面上。现在,有什么方法可以将 CSRF 令牌传递给我的所有视图,而无需为每个请求显式传递它。这是我用来呈现表单页面的通用代码。我使用 Jade/Pug 进行渲染:
router.get('/createcampaign', checkUserSession, middleWare2, middleware3, function(req, res){
var pageInfo = {};
pageInfo.title = 'Create New Campaign';
pageInfo.projects = req.projects;
pageInfo.session = req.session;
pageInfo.bodyid = 'createcampaign';
pageInfo.project_id = req.flash('project_id');
pageInfo.bodyclass = 'bluebody';
pageInfo.account = req.account;
pageInfo.grammars = req.grammars;
pageInfo.csrfToken = req.csrfToken; //Here I pass csrfToken to view
res.render( 'users/createcampaign', pageInfo );
});//createcampaign get route
Run Code Online (Sandbox Code Playgroud)
如您所见,我需要将 csrfToken 与视图上下文对象一起传递。如何全局传递它以便将其传递到所有视图?
另外,在所有页面上发送此 csrfToken 并在需要的地方使用它是否安全?
谢谢。
Django: 1.9.7 / Python3.5.1
视图.py
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
class OrderPayCheckView(View):
@csrf_exempt
def post(self, request, *args, **kwargs):
return JsonResponse(
data={
"valid": False,
}
)
Run Code Online (Sandbox Code Playgroud)
当我POST通过 向这个 url发送请求时POSTMAN,它显示,
403 Forbidden-CSRF authentication Fail有点东西(我真的想显示所有错误,但语言是韩语)
我在我的测试服务器中测试了它,它有自己的 url。
为什么会发生?
我收到此 CSRF 令牌错误,当我环顾四周时,每个人都说我只需要在提交数据时使用 {{ csrf_field() }}。过去,它运行良好,但一段时间后,出现此错误,我无法提交数据,甚至根本无法编辑数据。有人可以在这里帮助我吗谢谢。
请告诉我我哪里出错了?我想在这里做什么
edit.blade.php(这是 csrf 部分)
<form class="form-horizontal" method="post" action="{{ url('/user/show/'.$object->id) }}">
{{ method_field('PUT') }}
{{ csrf_field() }}
<div class="input-group">
<label><b>Name/NRIC:</b></label>
<input type="text" name="Name" value="{{ $object->Name }}" class="form-control">
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
app.js(laravel 默认不是我的,这是我看到的)
/**
* We'll load the axios HTTP library which allows us to easily issue requests
* to our Laravel back-end. This library automatically handles sending the
* CSRF token as a header based on the value of the "XSRF" token cookie.
*/
window.axios = …Run Code Online (Sandbox Code Playgroud) 当发出 GET 请求时,我注意到我的 csrf 令牌被附加到我的 url 中。这安全吗?
我有一个使用相同auth中间件的 API 。因此,当我成功登录时,我被重定向到一个页面,该页面从同一应用程序的 API 中获取数据。在我的app.blade.php我只添加了 axios 和一个简单的 html 并注意,除了在我的表单中的登录页面之外csrf-token,我的标题中甚至没有元数据。@csrf
这是我的app.blade.php布局
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
<body>
@yield('content')
<script src="{{ asset('js/axios.min.js') }}"></script>
<script>
const http = axios.create({
baseURL: '/api'
});
http.interceptors.request.use((request) => {
console.log('Starting Request', request);
return request;
});
</script>
@stack('scripts')
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在我的其中一页中:
@extends('layouts.app')
@section('content')
<div>
<h1>Hello World</h1>
</div>
@endsection
@push('scripts')
<script>
async function test() {
const { data } = await http('/some-page');
// I'm getting a …Run Code Online (Sandbox Code Playgroud)