Forms 查看传入页面并确定是否正在传递表单

Forms 查看传入页面并确定是否正在传递表单,forms,coldfusion,struct,cfml,Forms,Coldfusion,Struct,Cfml,我需要确定页面是否正在向我们的内部站点传递表单。如果页面来自外部域,我们需要重定向 一位同事想出了以下代码: <cfif isDefined("form")> <cfif not findnocase("our_domain", http_referer)> <cflocation url="redirect_link"> </cfif> </cfif> 我认为他没有正确使用isDefined,因为isDefined查

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

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

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

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

他在表单作用域上定义的使用方式将始终通过,因为表单作用域是所有页面的预定义CF作用域。您需要检查是否正在使用表单中的特定变量。如果您知道表单将传递哪些字段(换句话说,如果此登录页上始终需要相同的表单),那么这将更有帮助。如果所有这些都为true,则可以使用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>

如果您知道字段名是什么,那么您可以优化条件以检查字段名值是否也是,并以这种方式通过或失败;尽管在这种情况下,我可能会使用一个标志并按语法检查条件句。

他在表单范围上使用的方式是定义的,因为表单范围是所有页面的预定义CF范围。您需要检查是否正在使用表单中的特定变量。如果您知道表单将传递哪些字段(换句话说,如果此登录页上始终需要相同的表单),那么这将更有帮助。如果所有这些都为true,则可以使用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>

如果您知道字段名是什么,那么您可以优化条件以检查字段名值是否也是,并以这种方式通过或失败;尽管在这种情况下,我可能会使用一个标志并按语法检查条件句。

有两种方法。您可以检查CGI.REQUEST\u方法以检查是否正在发送帖子

您还可以检查structKeyExistsform和字段名,这仅在实际提交表单时才会出现

<cfif NOT structKeyExists(form, 'fieldnames') AND NOT findnocase("our_domain", http_referer)>
     <cflocation url="someurl" addtoken="false" />
<cfelse>
     <!--- Page Processing actions go here --->
</cfif>
虽然这不是问题,但我也会避免引用没有作用域的http_referer。使用CGI.http\u referer,因为它更容易阅读。您还可以将表单测试和外部引用合并到一个语句中:

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

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

有两种方法。您可以检查CGI.REQUEST\u方法以检查是否正在发送帖子

您还可以检查structKeyExistsform和字段名,这仅在实际提交表单时才会出现

<cfif NOT structKeyExists(form, 'fieldnames') AND NOT findnocase("our_domain", http_referer)>
     <cflocation url="someurl" addtoken="false" />
<cfelse>
     <!--- Page Processing actions go here --->
</cfif>
虽然这不是问题,但我也会避免引用没有作用域的http_referer。使用CGI.http\u referer,因为它更容易阅读。您还可以将表单测试和外部引用合并到一个语句中:

<cfif structKeyExists(form,"fieldNames") AND NOT findnocase("our_domain", CGI.http_referer)>
   <cflocation url="redirect_link">
</cfif>
另外,您知道重定向不会携带任何表单字段吗?我猜这就是你想要的,但值得一提

isDefined实际上查找所有作用域、变量、表单、url、应用程序、会话、客户端(如果它们都存在),但在本例中,您希望通过执行structKeyExistsform、'FieldName'来使用structKeyExists,您还可以检查特定的表单字段

<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\u referer的作用域,用户可以传入一个名为http\u referer的url变量来欺骗页面。在这种情况下,它似乎不会有什么不同,但仍然是一种很好的做法。

已定义实际上会在所有范围、变量、表单、url、应用程序、会话、客户端(如果它们都存在)中查找,但在这种情况下,您希望通过执行structKeyExistsform来使用structKeyExists,“字段名”您还可以检查特定的表单字段

<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\u referer的作用域,用户可以传入一个名为http\u referer的url变量来欺骗页面。在这种情况下,这似乎不会有什么不同,但仍然是一种很好的做法。

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


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

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

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

谢谢。我以为会是这样的。我将实现一些类似于你上面发布的东西。我喜欢这个答案的完整性,但有两个小细节是关闭的。1.使用StructKeyExists是优于使用IsDefined for performance的首选方法。StructKeyExists的计算速度更快。2.您不应该将FindLocase用作布尔值,因为它不返回真正的布尔值,而是一个索引数值。您应该使用ListFindLocase检查它。。。GT 0或将返回值设置为变量并使用它,varname GT 0。您也可以使用!structIsEmpyty form,而不是findnocaseYour_域,CGI.http_referer谢谢。我以为会是这样的。我将实现一些类似于你上面发布的东西。我喜欢这个答案的完整性,但有两个小细节是关闭的。1.使用StructKeyExists是优于使用IsDefined for performance的首选方法。StructKeyExists的计算速度更快。2.您不应该将FindLocase用作布尔值,因为它不返回真正的布尔值,而是一个索引数值。您应该使用ListFindLocase检查它。。。GT 0或将返回值设置为变量并使用它,varname GT 0。您也可以使用!structIsEmpyty form,而不是findLocaseour_域,CGI.http_referer CGI变量是客户端提供的,因此无论如何都是伪造的。它也被一些安全软件屏蔽了。CGI变量是客户端提供的,所以无论如何都是假的。它也被一些安全软件屏蔽。你不能依赖包含你的域名的cgi.http\u referer-它可能是空的,即使用户来自你的网站,也可以通过客户端软件进行更改,而且-由于您正在执行一般的查找检查而不是平等检查,也很容易被其他网站欺骗。您不能依赖包含您的域名的cgi.http\u referer-即使用户来自您的网站,它也可能为空,可以通过客户端软件进行更改,而且-因为你做的是一般的查找检查,而不是平等性检查,也很容易被其他网站欺骗。