ColdFusion:#URLSessionFormat(";index.cfm?foo=bar";)#->;禁用Cookie时URL中的两个问号

ColdFusion:#URLSessionFormat(";index.cfm?foo=bar";)#->;禁用Cookie时URL中的两个问号,url,coldfusion,session-variables,session-cookies,Url,Coldfusion,Session Variables,Session Cookies,我的表单如下所示: <form name="foo_contact" action="<CFOUTPUT>#URLSessionFormat("index.cfm?foo=bar")#</CFOUTPUT>"> 当我禁用Cookie并提交表单时,我的URL如下所示: index.cfm?foo=bar?CFID=12345&CFTOKEN=12312312这不是我所期望的。它应该是index.cfm?foo=bar&CFID=12345&CFTOKEN

我的表单如下所示:

 <form name="foo_contact" action="<CFOUTPUT>#URLSessionFormat("index.cfm?foo=bar")#</CFOUTPUT>">

当我禁用Cookie并提交表单时,我的URL如下所示:
index.cfm?foo=bar?CFID=12345&CFTOKEN=12312312
这不是我所期望的。它应该是
index.cfm?foo=bar&CFID=12345&CFTOKEN=12312312


我做错什么了吗?我是否需要自己编写一个函数来修复它,还是缺少了一个简单的解决方案?

您应该这样编写:

#URLSessionFormat("index.cfm")#&foo=bar

简单选项-改用隐藏的表单变量

<form name="foo_contact" action="<CFOUTPUT>#URLSessionFormat("index.cfm")#</CFOUTPUT>">
    <input type="hidden" name="foo" value="bar" />

.replaceFirst
使用带有负查找的正则表达式(
(?…
部分)来查找第一个
,它不在
index.cfm
前面,并将其替换。

使用CFID和CFTOKEN时,您需要注意潜在的安全问题。这些问题可以通过简单地使用J2EE会话管理来解决。以下是一段摘录自:

客户端标识符和安全性

以下客户端标识符问题可能会带来安全隐患:

  • 确保CFToken标识符的唯一性和复杂性
  • 限制会话标识符的可用性
下一节将讨论这些问题

确保CFToken的唯一性和安全性

默认情况下,ColdFusion在CFToken标识符中使用八位随机数。在大多数情况下,此CFToken格式为用户提供唯一、安全的标识符。(在ColdFusion中,生成此数字的方法使用加密强度随机数生成器,该生成器仅在服务器启动时进行种子设定。)

但是,在ColdFusion管理员中,可以启用设置页面以生成更复杂的CFToken标识符。如果启用Use UUID for cftoken选项,则ColdFusion将通过在ColdFusion UUID前面加上16位随机十六进制数来创建cftoken值。生成的CFToken标识符类似于以下内容:

3ee6c307a7278c7b-5278BEA6-1030-C351-3E33390F2EAD02B9
提供会话安全性

ColdFusion对客户机范围和标准会话范围使用相同的客户机标识符。由于CFToken和CFID值用于在一段时间内识别客户端,因此它们通常保存为用户浏览器上的cookie。这些cookie会一直存在,直到客户端浏览器删除它们为止,这可能需要相当长的时间。因此,与ColdFusion在每个会话中使用不同的用户标识符相比,黑客可以更多地访问这些变量

拥有用户CFToken和CFID cookies的黑客可以通过在用户会话期间使用被盗的CFToken和CFID cookies访问网页来访问用户数据。虽然这种情况不太可能发生,但理论上是可能的

通过选择ColdFusion管理员内存变量页面上的使用J2EE会话变量选项,可以删除此漏洞。J2EE会话管理机制为每个会话创建一个新的会话标识符,并且不使用CFToken或CFID cookie值

与安全相关的更改

升级到ColdFusion 9升级1时,以下安全相关规范适用:

  • CFID、CFTOKEN和jsessionid标记为httpOnly。这降低了会话信息在跨站点脚本(XSS)攻击中被破坏的可能性
  • 将会话Cookie的以下系统属性设置为httpOnly:Dcoldfusion.sessioncookie.httpOnly=true
  • 对会话cookie的支持仅取决于您使用的应用程序服务器:

    • 对于Tomcat/JBoss,JSESSIONID不支持httpOnly
    • 在JRun上,在jvm.config文件中添加系统属性Dcoldfusion.sessioncokie.httponly=true
    • 对于其他应用程序服务器,请参阅相关文档以了解有关httpOnly支持会话cookie的详细信息

index.cfm&foo=bar
不是有效的URL
index.cfm&foo=bar
不是有效的URL。仅在不接受Cookie的情况下修改URL。URLSessionFormat不会因为Cookie被禁用而对其进行相同的处理吗?相同的处理是什么?每个客户端启用/禁用的cookie各不相同。(没有提到这是一个具有受控客户端的intranet应用程序-鉴于表单名称为foo_contact,这似乎更可能是一个面向公众的网站上的联系人表单。)问题指出“当禁用Cookie时”当cookies被禁用或不被接受时,URLSessionFormat是否不起作用?非常感谢您的回答。我将尝试第二个选项,因为表单已经在使用,我不想弄乱我同事的代码。在
index.cfm?foo=bar
页面上是另一个表单,如果我在action属性中使用
URLSessionFormat
,则第三个页面的URL不仅会添加CFID/CFTOKEN,还会添加
;jsessionid=123123
,这再次扰乱了URL的结构。知道为什么会添加jsessionid吗?为了进一步澄清我的问题:第二个表单操作的问题是URLSessionFormat生成的URL参数的顺序被破坏了。它的内容是:
index.cfm;jsessionid=8412312382728123123426E0C5542714E14?CFID=123123&CFTOKEN=123123123
很确定CF仍然会接受该URL吗?(在Tomcat和JRun中,分号被接受为路径信息分隔符)。如果没有,则更换
;jessionid[^?]+
使用blank将其删除。最后我将其剥离出来,只使用CFID/CFTOKEN(会话仍在工作,URL中没有jsessionid,所以没关系)再次感谢!
3ee6c307a7278c7b-5278BEA6-1030-C351-3E33390F2EAD02B9