我有
<form action="?#cgi.query_string#" method="post" ...
cgi.query_string
带有无限数量的变量。我尝试使用
<form action="?#EncodeForURL(cgi.query_string)#" method="post" ...
我应该做任何逃避吗?
答案 0 :(得分:1)
您在表单标记中使用method="POST"
。因此,您尝试使用包含查询字符串(URL范围)和表单正文(FORM范围)的页面,是否正确?
我不确定这是最佳做法,甚至不被某些浏览器所允许(我在其他地方读过,他们会在POST操作中删除查询字符串)。
最佳解决方案可能是将操作设为GET或POST,并循环查询字符串,使每个项目成为隐藏输入?
<cfloop list="#CGI.query_string#" delimiters="&" index="i">
<input
type='hidden'
name='#listFirst(i, "=")#'
value='#listLast(i, "=")#'
/>
</cfloop>
正如你所说,你不能这样做。你的具体问题是你是否应该逃避。答案就是&#34;是&#34;并且位置将在后端,解析查询字符串。
<cfoutput>
<form action='?#CGI.query_string#' method='POST' class='form-horizontal bordered-group' role='form' id='test'>
<input
class='form-control'
type='text'
name='formvar'
/>
<input
class="btn btn-primary btn-lg btn-block"
type="submit"
value="Submit"
/>
</form>
</cfoutput>
将表单提交到同一页面,其中包含FORM范围,URL范围以及定义的CGI.query_string。 CGI.query_string将具有url格式(%20表示空格等)。 FORM和URL范围已经被解码(%20转换为空格等)。
您的问题的关键似乎是关于安全和消毒。在这种情况下,您需要检查encodeForHTML()
(Adobe Docs for encodeForHTML())。
显然,这并非100%万无一失,因为我不知道您的代码的详细信息以及您对输入的处理方式。但那些消毒功能应该是一个良好的开端。
一般来说,如果您使用网址范围,请使用encodeForHTML()
,如果您使用#CGI.query_string#
,则会使用网址编码。