代码之家  ›  专栏  ›  技术社区  ›  James A Mohler Nika

用于用查询字符串重新过帐

  •  0
  • James A Mohler Nika  · 技术社区  · 7 年前

    我有

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

    这个 cgi.query_string 带有不确定数量的变量。我试着用

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

    我应该逃走吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Sean Hogge    7 年前

    你在用 method="POST" 在你的表格标签上。所以您试图让一个页面同时包含一个查询字符串(url范围)和一个表单体(表单范围),对吗?

    我不确定这是否是最佳实践,甚至是某些浏览器所允许的(我在其他地方读到过,它们会在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>
    

    将表单提交到同一页,并定义表单作用域、url作用域和cgi.query_字符串。cgi.query_字符串将具有url格式(空间等为%20)。表单和url作用域将已被解码(20已转换为空格等)。

    看来你问题的关键是安全和卫生处理。在这种情况下,你需要检查 encodeForHTML() ( Adobe Docs for encodeForHTML() )

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

    所以通常,如果使用url范围,请使用 编码HTML() ,如果您使用 #CGI.query_string# ,它将被url编码。