首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ColdFusion CSRF XSS攻击防护

ColdFusion CSRF XSS攻击防护
EN

Stack Overflow用户
提问于 2019-02-03 06:25:10
回答 1查看 632关注 0票数 4

我已经实现了csrfGenerateToken和csrfVerifyToken函数来防止CSRF攻击。

我已经用这些设置了网页页眉:

代码语言:javascript
复制
set X-XSS-Protection "1; mode=block"
always set X-Frame-Options SAMEORIGIN
X-Content-Type-Options nosniff
Strict-Transport-Security "max-age=63072000" env=HTTPS

我已经做了一些研究,并按照Adobe的建议进行了如下操作:

代码语言:javascript
复制
<cfset tokenVar = 't' & lCase( hash( createUUID() & randRange( 1000, 100000 ), 'MD5', 'UTF-8', 250 ) )>
<form action="updateprofile.cfm" method="post">
    <input type="hidden" name="f#hash( 'tokenVar', 'SHA-256', 'UTF-8')#" value="#tokenVar#">
    <input type="hidden" name="f#hash( 'formToken', 'SHA-256', 'UTF-8')#" value="#csrfGenerateToken( tokenVar, true )#">
    <input type="text" name="emailAddress" value="#EmailAddress#">
    <input type="text" name="phoneNumber" value="#PhoneNumber#">
    <input type="submit" name="btnSubmit" value="Change Profile Info">
</form>

Updateprofile.cfm会有:

代码语言:javascript
复制
<cfparam name="FORM[ 'f' & hash( 'tokenVar', 'SHA-256', 'UTF-8')]" default="0">
<cfparam name="FORM[ 'f' & hash( 'formToken', 'SHA-256', 'UTF-8')]" default="0">
<cfif not csrfVerifyToken( FORM[ 'f' & hash( 'formToken', 'SHA-256', 'UTF-8')], FORM[ 'f' & hash( 'tokenVar', 'SHA-256', 'UTF-8')] )>
    <!--- CSRF attack. Clear cookies and kick user out --->
    <cfinclude template="clearcookies.cfm">
    <cflocation url="signin.htm" addToken = "no">
</cfif>

如果两个帐户在相同的浏览器上登录,并且其中一个帐户尝试更新另一个帐户,则此操作将起作用。但是,当我简单地保存其中一个文件的html副本并将其保存为csrf-attack.htm时:

代码语言:javascript
复制
<html><body>
<script>history.pushState('', '', '/')</script>
<form action="http://www.exsample.com/updateprofile.cfm" method="post">
    <input type="hidden" name="f41BE6B4E09CBA69BDB76DBB69B493E8D49F5DD9ED230085913397B4C751D4E60" value="t93315a7c3ecb43d4d1b9422da97ffb09">
    <input type="hidden" name="f08DFC2607D4119D7B16B4C01DC5C00F54B044DC937257ABC411F9A7E55BB4191" value="A0EED67C55F5E17683E2E1B21FF3454FE690E0B1">
    <input type="text" name="emailAddress" value="test@test.com">
    <input type="text" name="phoneNumber" value="1-222-3333">
    <input type="submit" name="btnSubmit" value="Change Profile Info">
</form>
</body><html>

我处理了原始表单,将电话号码更新为1-333-4444。然后我又回到了表单上。此时,应该已经创建了一个新的CSRFToken,因为ForceNew被设置为true。

然后我转到我已经保存的静态超文本标记语言页面,简单地将电子邮件地址的值改为test2@test.com,而不是使用旧令牌的test@test.com,然后单击“更改配置文件信息”按钮,我就能够将其更新到站点!!

是我做错了什么,还是它是如何工作的?如果我可以简单地复制令牌值并操作内容,然后发布它,那么令牌似乎是无用的。我如何在接收页面上缓解这样的问题?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2019-02-07 04:11:45

csrfVerifyToken结果仍然会传递,直到您使用相同的密钥生成另一个CSRF令牌,此时它将失效。因此,如果您正在制作一次性令牌,则需要在调用csrfVerifyToken之后使用相同的tokenVar调用csrfGenerateToken,从而使旧令牌无效

我写了一篇博客文章,用一个代码示例来说明这一点:https://www.petefreitag.com/item/856.cfm

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54498116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档