2010-01-06 3 views
0

Этот вопрос похож на тот, который я задал here. Но это связано с тем, что я хочу добиться такого же эффекта. Я хочу, чтобы пользователи ограничивались доступом к другим страницам на сайте через главную страницу. Первая страница содержит фрейм для навигации, а затем кадр для содержимого страницы, на которую они перемещаются. Я хочу, чтобы он был настроен так, что единственный способ получить доступ к страницам контента - это использовать эту главную страницу. Так что если главная страница http://intranet/index.html, то они не могут добраться до http://intranet/other_page.html, не используя ссылку, указанную в index.html. Возможно ли это, и если да, то какой будет лучшая техника? Я использую apache для обслуживания сайта, и у меня есть php и javascript.ограничить доступ к странице, разрешенной только с определенной страницы.

+0

Не могли бы вы объяснить, почему вы хотите это сделать? –

+0

@Jordan: см. Мой комментарий к ответу Andrzej Doyle –

ответ

1

Проверьте заголовок запроса Referer - это будет препятствовать случайным пользователям с их браузерами. Это может быть подделано, но вы не обманете решительного атакующего.

Возможны ложные срабатывания. Иногда Referer не установлен.

+0

Я предполагаю, что вам нужно сделать это на каждой странице, загруженной в этот фрейм, и вы можете сделать это с помощью php? И спасибо, что, наконец, не взорвали меня в проверке входных данных и всего этого. Все остальные ответы полностью игнорировали тот факт, что я сказал, что входные данные дезинфицированы, и я просто пытаюсь не допустить, чтобы обычные пользователи joe играли с ним. Они не будут иметь доступа к любому из тех инструментов, на которые они ссылаются! –

+0

Да, для каждой страницы. Я рекомендую включить PHP для выполнения задания. Значение заголовка доступно как $ _SERVER ['HTTP_REFERER'] –

+0

спасибо. Ваш второй комментарий был тем, что я искал! –

4

Этот короткий ответ - нет, это не возможно, строго говорить.

Долгий ответ: да, вы, вероятно, можете придумать разумное , но вы должны знать об ограничениях.

По существу, HTTP не имеет гражданства. Независимо от того, какие конкретные действия происходят, ваш веб-сервер увидит один запрос для /other_page.html и ему нужно будет решить, обслуживать его или нет. Чтобы иметь какое-то разумное ограничение, первый шаг заключается в том, что вы будете иметь, чтобы иметь некоторый способ поддержания состояния на стороне сервера. Без этого вы не сможете сопоставить любой входящий запрос для other_page.html с предыдущими запросами. Хорошей новостью является то, что PHP имеет встроенную поддержку сеансов на стороне сервера.

(Без сеансов на стороне сервера вы можете попытаться добиться этого с помощью куки сеанса на стороне клиента или проверить заголовок реферера, но тогда для клиентов просто фальшивка, так как это просто строки, которые они отправляют вам, и вы принимаете их слово для этого).

Теперь вам нужно будет использовать этот сеанс для отслеживания того, был ли пользователь на первой странице, прежде чем перейти на другую страницу - вы можете установить переменную в сеансе, когда запрашивается первая страница, и на каждом request /other_page.html, убедитесь, что эта переменная задана в сеансе перед ее обслуживанием. Это, по крайней мере, дает вам разумную идею о том, что они посетили первую страницу текущего сеанса.

Однако у вас нет абсолютно никакого способа узнать, какая ссылка была нажата в браузере, чтобы запросить конкретный URL-адрес, или даже если браузер был задействован вообще. Весь ваш сервер видит запрос для определенного ресурса вместе с некоторыми заголовками. Один из способов потенциально имитировать это - создать случайную строку при обслуживании /index.html и добавить это как параметр запроса к ссылке на этой странице. Затем сохраните его в сеансе, а когда другой_странице попросят проверить, что запрос включает параметр запроса с той же случайной строкой.


Но в этот момент пришло время сделать шаг назад и сказать - почему вы хотите сделать это? Я не могу придумать никакой веской причины, почему это будет сделано. Это не соответствующая мера безопасности - вам нужно будет обеспечить безопасность должным образом, и если это ваша мотивация, вы должны ее попросить.Это не очень хороший способ обеспечить конкретный рабочий процесс для посетителей - будь то хорошая идея вообще дискуссионная, но вместо того, чтобы думать о том, как заставить людей перейти на страницу А перед страницей В, подумайте о точно, почему это вам нужно, чтобы они это делали, каковы ваши ограничивающие факторы и каков наименее навязчивый способ их достижения.

Не забывайте - http://intranet/other_page.html - это Единый указатель ресурсов, который соответствует содержимому, которое вы обслуживаете на этой странице. Если кто-то однажды посещает этот адрес и видит полезный ресурс, почему бы им не позволить им увидеть его снова, когда они вернутся? Я настоятельно рекомендую вам подумать о том, почему вы хотите умышленно обмануть опыт своих пользователей и пойти против общего способа работы Интернета с вашим сайтом.

+0

Причина, по которой я пытаюсь это сделать, заключается в том, что они хотят, чтобы дизайн интрасети использовал фреймы, чтобы конечный пользователь видел только главную страницу (/index.html) в адресной строке независимо от того, на какой странице они находятся. Но я не хочу, чтобы пользователи могли «просматривать источник страницы», видя, что они хотят, находятся в «/other_page.html» и просто введите это в адресную строку –

+0

, и пока вы не сможете вернуться к ней другой день. Это интранет, доступный только пользователям, прошедшим проверку подлинности. Пользователи будут иметь возможность изменять данные, передаваемые на страницы, используя адресную панель, поэтому я считаю, что для простоты получение этой функции помешает людям с этими ограниченными инструментами отслеживать сайты. –

+1

Если вы беспокоитесь только о том, что они хотят см. URL-адрес как /index.html, самый простой способ сделать это - использовать mod_rewrite от apache – eCaroth

Смежные вопросы