2017-03-02 599 views
1

我在我的javascripts中使用了几个地方的window.location.href。有没有任何通用的方法来将CSRF令牌添加到所有这些令牌?为window.location.href添加CSRF令牌

由于window.location的是一个对象,window.location.href是其属性的一个 ,我们不能将其覆盖。

编写一个像下面这样的通用函数,并且路由所有的 实例将会更加人工和耗时。

addCSRFAndProceed(url); 
function addCSRFAndProceed (url) { 
    window.location.href = url + getCSRFTokenAndValue(); 
} 

后端代码 这里是从我的后端设置CSRF cookie中的代码。

$_COOKIE['CSRFTOKEN'] = '123456'; 

HTML代码

<div class="redirect-button" onclick="TriggerRequest()"> 

Javascript代码

function TriggerRequest() { 
    window.location.href="www.mysite.com/?index.php&from=desktop"; 
} 

我有使用window.location.href和期待一个通用的解决方案,以追加标记将网址,因为这将不同的功能忙于手动追加所有功能。

+0

你应该产生在后端的CSRF令牌(假设你是不是在谈论Node.js的),你如果你想有一个“标准”的地方来获得令牌,可以把它放在标题中。但是,你需要csrf重定向吗?将它用于表单不是更好吗? –

+0

我使用的是纯javascript。我已经创建了CSRF令牌并将其保存在cookie中。我同意**最好使用表单,并且我们可能不需要CSRF重定向**。 但不幸的是,我的后端逻辑来检查CSRF令牌没有更多的智能来分离不同类型的请求,并最终从前端修复。 – Barath

+0

但客户端如何生成csrf令牌保护你? *“永远不要相信客户端”* –

回答

0

让我从一个laravel讲话作为后端的情况下(只是在我的例子中有关1号线,因为令牌有来自某处)

<meta id="csrf" name="csrf-token" content="{{ csrf_token() }}"> 

会在元标记与输出CSRF令牌id csrf对不对?

好使用和修改重定向代码将工作,如:

addCSRFAndProceed(url); 
function addCSRFAndProceed (url) { 
    window.location.href = url + '?token=' + getCSRFTokenAndValue(); 
} 

function getCSRFTokenAndValue() { 
    return document.getElementById("csrf").getAttribute('content'); 
} 

你也应该为你的后台,检查查询字符串参数token并且只返回请求的页面,然后编写代码。 (服务器端验证)

伪代码(仍然不知道你的后端)

if ($query_string_array['token'] == 'accepted token') { 
    return view:page; 
} else { 
    return error: token does not match; 
} 
+0

我确定这会工作,但我需要重定向许多地方使用'addCSRFAndProceed()'。是否有任何其他通用和动态的方式来执行像'window.location.href = window.location.href + getCSRFTokenAndValue()'? – Barath

+0

使用Ajax调用?这样你就可以得到多个 –