用于使用查询字符串回发自身

For posting back on itself with query string

我有

<form action="?#cgi.query_string#" method="post" ...

cgi.query_string 带有不确定数量的变量。我尝试使用

<form action="?#EncodeForURL(cgi.query_string)#" method="post" ...

我应该进行任何类型的转义吗?

您正在表单标签中使用 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>

正如你所说,你不能这样做。您的具体问题是您是否应该进行任何转义。答案是 "yes",位置将在后端,解析查询字符串。

<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 格式(space 为 %20,等等)。 FORM 和 URL 作用域已经被解码(%20 转换为 space,等等)。

看来您问题的症结在于安全和消毒。在这种情况下,您需要检查 encodeForHTML() (Adobe Docs for encodeForHTML()).

显然,这不是 100% 万无一失的,因为我不知道您的代码细节以及您对输入的处理方式。但是那些消毒功能应该是一个好的开始。

所以一般来说,如果你使用URL范围,就使用encodeForHTML(),如果你使用#CGI.query_string#,它将被URL编码。