我正在使用backbone.js,效果很好.但我作为javascript模板创建的表单缺少rails csrf保护令牌.如何将其添加到我在javascript中创建的模板中?
这是关于生成CSRF令牌的问题.
通常,我想基于与用户会话相关联的唯一数据生成令牌,并使用密钥进行散列和腌制.
我的问题是在没有唯一用户数据时生成令牌.没有可用的会话,cookie不是一个选项,IP地址和这种性质的东西是不可靠的.
我有什么理由不能将字符串包含在请求中作为请求的一部分吗?示例伪代码生成令牌并嵌入它:
var $stringToHash = random()
var $csrfToken = hash($stringToHash + $mySecretKey)
<a href="http://foo.com?csrfToken={$csrfToken}&key={$stringToHash}">click me</a>
Run Code Online (Sandbox Code Playgroud)
CSRF令牌的服务器端验证示例
var $stringToHash = request.get('key')
var $isValidToken = hash($stringToHash + $mySecrtKey) == request.get('csrfToken')
Run Code Online (Sandbox Code Playgroud)
散列中使用的字符串在每个请求上都是不同的.只要它包含在每个请求中,CSRF令牌验证就可以继续进行.由于每个请求都是新的,并且只嵌入在页面中,因此无法访问令牌.然后令牌的安全性落到了仅为我所知的$ mySecretKey.
这是一种天真的做法吗?我错过了一些为什么这不起作用的原因?
谢谢
我读到在使用JWT时,没有必要防止CRSF攻击,例如:" 因为你不依赖于cookie,所以你不需要防止跨站点请求 ".
但是,我不明白:如果我将令牌存储在localStorage中(正如我在同一网站的教程中所建议的那样),是什么阻止攻击者通过读取我的localStorage而不是我的cookie来伪造恶意请求?
由于它是在服务器端生成的,因此我不知道如何在客户端请求中使用令牌而不将其存储在客户端的某个位置.
我正在使用curl测试我的一个Django表单.我尝试过的调用(每个调用都有错误,多行可读):
(1):
curl
-d "{\"email\":\"test@test.com\"}"
--header "X-CSRFToken: [triple checked value from the source code of a page I already loaded from my Django app]"
--cookie "csrftoken=[same csrf value as above]"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
(使用http标头和csrftokencookie)导致400错误,没有返回数据.
(2):
curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
--cookie "csrftoken=[as above];sessionid=[from header inspection in Chrome]"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
(如在(1)中但在头属性声明中没有空格,并且sessionid在cookie中也没有空格)导致相同的400错误而没有返回数据.
(3):
curl
-d "{a:1}"
--header "X-CSRFToken:[as above]"
http://127.0.0.1:8083/registrations/register/
Run Code Online (Sandbox Code Playgroud)
(只有http标头X-CSRFToken,没有cookie)会导致错误代码403,并显示消息:未设置CSRF cookie.
如何用卷曲测试我的表单?除了cookie值和http标头之外,我还没有考虑哪些因素?
我在spring框架中有csrf保护.所以在每个请求中,我从ajax调用中在头文件中发送csrf令牌,这非常有效.
<meta name="_csrf" content="${_csrf.token}"/>
<meta name="_csrf_header" content="${_csrf.headerName}"/>
var token = $("meta[name='_csrf']").attr("content");
var header = $("meta[name='_csrf_header']").attr("content");
Run Code Online (Sandbox Code Playgroud)
在ajax
beforeSend: function(xhr) {
xhr.setRequestHeader(header, token),
xhr.setRequestHeader("username", "xxxx1"),
xhr.setRequestHeader("password", "password")
}
Run Code Online (Sandbox Code Playgroud)
我不知道生成csrf令牌并包含在Postman Rest Client的标题部分?你能帮我从Postman Rest Client发送csrf令牌吗?

检查引荐来源是否足以防止跨站点请求伪造攻击?我知道引用者可能是欺骗者,但攻击者是否有办法为客户端做这件事?我知道令牌是常态,但这会有用吗?
你如何通过python模块请求传递csrftoken?这就是我所拥有但它不起作用,而且我不确定将它传入哪个参数(数据,标题,认证...)
import requests
from bs4 import BeautifulSoup
URL = 'https://portal.bitcasa.com/login'
client = requests.session(config={'verbose': sys.stderr})
# Retrieve the CSRF token first
soup = BeautifulSoup(client.get('https://portal.bitcasa.com/login').content)
csrftoken = soup.find('input', dict(name='csrfmiddlewaretoken'))['value']
login_data = dict(username=EMAIL, password=PASSWORD, csrfmiddlewaretoken=csrftoken)
r = client.post(URL, data=login_data, headers={"Referer": "foo"})
Run Code Online (Sandbox Code Playgroud)
每次都有相同的错误消息.
<h1>Forbidden <span>(403)</span></h1>
<p>CSRF verification failed. Request aborted.</p>
Run Code Online (Sandbox Code Playgroud) 我知道有渲染CSRF与令牌隐藏输入常用的方式form_rest,但有没有办法使刚刚 CSRF输入自己?我{% block field_widget %}在主题中重写了渲染一段额外的文本.但是当CSRF令牌也在输入字段中呈现时,我得到了一段文本,我不需要在隐藏字段旁边.所以我想用一个告诉它不要渲染这个文本的参数来单独渲染它.
我在ASP.Net MVC中遇到AntiForgeryToken问题.如果我在我的网络服务器上执行iisreset并且用户继续他们的会话,他们会被退回到登录页面.并不可怕,但AntiForgery令牌爆炸,唯一的方法就是在浏览器上吹掉cookie.
对于版本1的beta版本,在我为我读回cookie时出错了所以我曾经在请求验证令牌之前擦除它,但在发布时已修复.
现在我想我会回到修复beta问题的代码,但我不禁想到我错过了什么.有没有一个更简单的解决方案,我应该放弃他们的助手并从头开始创建一个新的?我觉得很多问题是它与旧的ASP.Net管道如此紧密地联系在一起,并试图将其用于做一些它不是真正设计的事情.
我查看了ASP.Net MVC 2 RC的源代码,看起来代码没有太大变化,所以虽然我没有尝试过,但我认为没有任何答案.
这是异常的堆栈跟踪的相关部分.
编辑:我刚刚意识到我没有提到这只是试图在GET请求上插入令牌.这不是您开始执行POST时发生的验证.
System.Web.Mvc.HttpAntiForgeryException: A required anti-forgery token was not
supplied or was invalid.
---> System.Web.HttpException: Validation of viewstate MAC failed. If this
application is hosted by a Web Farm or cluster, ensure that <machineKey>
configuration specifies the same validationKey and validation algorithm.
AutoGenerate cannot be used in a cluster.
---> System.Web.UI.ViewStateException: Invalid viewstate.
Client IP: 127.0.0.1
Port: 4991
User-Agent: scrubbed
ViewState: scrubbed
Referer: blah
Path: /oursite/Account/Login
---> System.Security.Cryptography.CryptographicException: Padding is invalid …Run Code Online (Sandbox Code Playgroud) csrf ×10
.net ×1
api ×1
asp.net ×1
asp.net-mvc ×1
auth0 ×1
backbone.js ×1
curl ×1
django ×1
django-csrf ×1
django-forms ×1
header ×1
javascript ×1
jwt ×1
php ×1
postman ×1
python ×1
rest ×1
security ×1
spring ×1
symfony ×1
twig ×1