1

ページが内部サイトにフォームを渡しているかどうかを判断する必要があります。ページが外部ドメインからのものである場合、リダイレクトする必要があります。

同僚がこのコードを思いつきました:

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

変数を探すisDefined()ので、彼が適切に使用しているとは思いません。isDefined()フォーム自体を探す必要があります。も調べましstructKeyExists()たが、これもフォーム内の変数を探します。フォーム自体を探すにはどうすればよいですか?

4

4 に答える 4

4

2つの方法があります。CGI.REQUEST_METHOD をチェックして、POST が送信されているかどうかを確認できます。

structKeyExists(form,"fieldNames")フォームが実際に送信された場合にのみ発生するかどうかを確認することもできます。

問題ではありませんが、スコープなしで http_referer を参照することも避けます。読みやすいので、CGI.http_referer を使用します。FORM のテストと外部リファラーを 1 つのステートメントに結合することもできます。

<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()実際にはすべてのスコープ、変数、フォーム、URL、アプリケーション、セッション、クライアントがすべて存在する場合に調べますが、この場合は使用することで使用したいstructKeyExists特定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 に答える