2013-03-12 2 views
1

Мне нужно определить, проходит ли страница на нашем внутреннем сайте. Нам нужно перенаправить, если страница поступает из внешнего домена.Просмотр входящей страницы и определение формы отправки

Коллега придумал этот код:

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

Я не думаю, что он использует isDefined() правильно, потому что isDefined() ищет переменную. Нам нужно искать форму. Я также рассмотрел structKeyExists(), но опять же, это ищет переменные в форме. Как я могу искать форму?

+0

Вы не можете зависеть от cgi.http_referer, содержащего ваше доменное имя - оно может быть пустым, даже если пользователь пришел с вашего сайта, может быть изменен клиентским программным обеспечением и - потому что вы выполняете общую проверку на наличие чем выполнение проверки равенства), можно легко подделать и другими веб-сайтами. –

ответ

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> 

Кроме того, вы знаете, что редирект не будет нести какой-либо из полей формы над с ним? Я предполагаю, что это то, чего вы хотите, но это стоит упомянуть.

+0

Спасибо. Я думал, что это будет что-то вроде этого. Я буду реализовывать что-то похожее на то, что вы разместили выше. – Biggtriksta

+0

Мне нравится полнота этого ответа, но две мелкие детали отключены. 1. Использование StructKeyExists является предпочтительным методом использования IsDefined() для повышения производительности. StructKeyExists оценивается быстрее. 2. Вы не должны использовать FindNoCase как логическое, потому что он не возвращает истинное логическое значение, это значение индекса (числовое). Вы должны проверить его, используя ListFindNoCase (...) GT 0 или установить возвращаемое значение переменной и использовать его, # varname # GT 0. –

+0

Вы также можете использовать! StructIsEmpyty (form) И NOT findnocase ("our_domain", CGI .http_referer) –

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> 

Если вы знаете, что имена полей, то вы можете уточнить условное для проверки значений FIELDNAME, как хорошо и пройти или не это таким образом; хотя я, скорее всего, буду использовать флаг и в этом случае проверить условные обозначения.

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 пользователь может передать в переменную URL-адрес называется HTTP_REFERER подделать страницу. Похоже, что это не повлияет на этот сценарий, но по-прежнему остается хорошей практикой.

+1

Переменная CGI предоставляется клиентом так полностью подделанной. (Он также закрыт некоторым программным обеспечением безопасности.) –

0

Проверка упомянутого домена всегда является проблемой, так как ее легко обмануть. Один из способов, которыми вы можете воспользоваться, - передать переменную в форме, которая генерируется вашим сайтом, поэтому может существовать только в том случае, если форма была отправлена ​​вашим сайтом. Fot пример. Создайте uuid каждый раз, когда страница загружается. Сохраните ее в сеансе посетителей, а также поместите в форму.

При отправке формы формы, сравните форму с командой session.page.uuid, только если они соответствуют форме, представленной на вашем собственном сайте.