1

我需要确定页面是否将表单传递到我们的内部站点。如果页面来自外部域,我们需要重定向。

一位同事想出了以下代码:

<cfif isDefined("form")>
  <cfif not findnocase("our_domain", http_referer)>
    <cflocation url="redirect_link">
  </cfif>
</cfif>

我认为他没有isDefined()正确使用,因为isDefined()寻找变量。我们需要寻找表格本身。我也研究过structKeyExists(),但同样,这会在表单中查找变量。如何查找表单本身?

4

4 回答 4

4

有两种方法。您可以检查 CGI.REQUEST_METHOD 以检查是否正在发送 POST。

您还可以检查structKeyExists(form,"fieldNames")仅在实际提交表单时才会出现这种情况。

虽然不在问题中,但我也会避免在没有范围的情况下引用 http_referer。使用 CGI.http_referer 因为它更容易阅读。您还可以将 FORM 的测试和外部引用者合并到一个语句中:

<cfif structKeyExists(form,"fieldNames") AND NOT findnocase("our_domain", CGI.http_referer)>
   <cflocation url="redirect_link">
</cfif>

另外,您知道重定向不会携带任何表单字段吗?我猜这就是你想要的,但值得一提。

于 2013-03-12T16:01:22.733 回答
2

isDefined()structKeyExists实际上会查看所有范围、变量、表单、url、应用程序、会话、客户端(如果它们都存在),但在这种情况下,您希望通过执行操作来使用structKeyExists(form,'fieldnames')您还可以检查特定的表单字段。

<cfif structKeyExists(form,'fieldnames')>
    <cfif not findnocase("our_domain", cgi.http_referer)> // scope http_referer
        <cflocation url="redirect_link" addtoken="false">
    </cfif>
</cfif>

如果你不限定 cgi.http_referer 用户可以传入一个名为 http_referer 的 url 变量来欺骗页面。在这种情况下似乎不会有所作为,但仍然是一个很好的做法。

于 2013-03-12T16:01:57.730 回答
0

他在表单范围上使用 isDefined 的方式将始终通过,因为表单范围是所有页面的预定义 CF 范围。您需要检查是否正在使用表单中的特定变量。如果您知道将从表单中传递哪些字段(换句话说,如果此登录页面上始终需要相同的表单),则会更有帮助。如果所有这些都为真,您可以使用 fieldnames 表单值,该值是在提交表单时附加到 ColdFusion 表单的值。

<cfif NOT structKeyExists(form, 'fieldnames') AND NOT findnocase("our_domain", http_referer)>
     <cflocation url="someurl" addtoken="false" />
<cfelse>
     <!--- Page Processing actions go here --->
</cfif>

如果您知道字段名称是什么,那么您可以细化条件以检查字段名称值,然后以这种方式通过或失败;尽管在这种情况下我可能会使用标志并以编程方式检查条件。

于 2013-03-12T16:01:14.277 回答
0

检查引用的域总是一个问题,因为它很容易被欺骗。您可以使用的一种方法是在您的站点生成的表单中传递一个变量,因此只有在您的站点提交表单时才能存在。脚的例子。每次加载页面时创建一个 uuid 将其存储在访问者会话中,并将其放入表单中。

提交表单时,将 form.uuid 与 session.page.uuid 进行比较,前提是它们匹配的是从您自己的站点提交的表单。

于 2013-03-13T10:10:33.810 回答