2008-10-09 3 views
16

Как предотвратить доступ моих пользователей к прямым страницам, предназначенным только для вызовов ajax?Предотвращение прямого доступа к странице PHP

Передача ключа во время вызова ajax кажется решением, тогда как доступ без ключа не будет обрабатываться. Но также легко изготовить ключ, нет? Curse of View Source ...

p/s: Использование Apache в качестве веб-сервера.

EDIT: Чтобы ответить на вопрос, у меня есть jQuery ui-tabs в моем index.php, и внутри этих вкладок есть формы со скриптами, которые не будут работать, если к ним обращаются напрямую. Почему пользователь хотел бы это сделать, я не знаю, я просто считаю, что я был бы более удобным для пользователя, предотвращая прямой доступ к формам без скриптов проверки.

+2

Не беспокойтесь о дружественности к пользователю в этом случае. На самом деле, я бы сказал, что тебе лучше рано вставать, чем пытаться сделать это приятным. Например, скажите, что вы перенаправляете на index.php для посещения без AJAX. Результат: у кого-то гарантированно будет закладка сценария AJAX, так как он доставит их на домашнюю страницу. – 2008-10-09 13:38:06

+0

Печенье можно подделать также – AlBeebe 2009-09-13 02:35:16

ответ

21

Как уже говорили, запрос Ajax можно эмулировать, создавая соответствующие заголовки. Если вы хотите иметь базовую проверку, чтобы увидеть, если запрос является запрос Ajax вы можете использовать:

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
    //Request identified as ajax request 
} 

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

34

Невозможно гарантировать, что они обращаются к нему через AJAX. Как прямой доступ, так и доступ AJAX поступают от клиента, поэтому его легко подделать.

Почему вы так или иначе хотите?

Если это потому, что код PHP не очень безопасен, сделайте код PHP более безопасным. (Например, если ваш AJAX передает идентификатор пользователя в файл PHP, напишите код в файле PHP, чтобы убедиться, что это правильный идентификатор пользователя.)

+4

Ничего больше нельзя сказать. Никогда не верите, что клиент отправляет вам. Поскольку методы AJAX предназначены для возврата материала в браузер, убедитесь, что в бэкэнд можно вернуть только разрешенные данные. – 2008-10-09 00:47:21

+0

Мое единственное сожаление в том, что у меня есть только один голос, чтобы дать ответ. – 2008-10-09 04:26:24

+4

Мое единственное сожаление в том, что у меня есть кости. – scronide 2008-10-09 06:41:20

8

Похоже, что вы ошибетесь. Вызов AJAX похож на стандартный запрос страницы, только по соглашению ответ не предназначен для отображения пользователю.

Это, тем не менее, запрос клиента, и поэтому вы должны быть счастливы, если клиент сможет увидеть ответ. Обфускание доступа с помощью «ключа» таким образом только усложняет ситуацию.

Я бы сказал, что «проклятие» источника взгляда - это небольшое оружие в борьбе с безопасностью через неясность.

Итак, в чем причина вашего желания?

4

Если браузер перезвонит вашу страницу, либо по обычным запросам, либо по ajax, тогда кто-то может позвонить ей вручную. На самом деле не существует четко определенной разницы между обычными и ajax-запросами, поскольку происходит обмен данными между сервером и клиентом.

Общий случай - передать заголовок серверу, который говорит, что «этот запрос был выполнен ajax». Если вы используете Prototype, он автоматически устанавливает HTTP-заголовок «X-Requested-With» в «XMLHttpRequest», а также некоторые другие заголовки, включая версию прототипа. (См. Больше на http://www.prototypejs.org/api/ajax/options на странице "requestHeaders")

Добавить: Если вы используете другую библиотеку AJAX, вы можете добавить свой собственный заголовок. Это полезно для того, чтобы узнать, какой тип запроса был на стороне сервера, и для избежания простых случаев, когда в браузере запрашивается страница ajax. Он не защищает ваш запрос от всех, потому что вы не можете.

0

Не знаете об этом, но, возможно, проверьте заголовок реферера? Я думаю, что если кто-то вручную напечатал ваш url, у него не было бы заголовка referrer, а вызовы AJAX (по крайней мере, в быстром тестировании, которое я только что сделал в своей системе).

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

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

0

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

1

ЦИФРЫ НЕ БЕЗОПАСНЫ ... попробуйте $ _SESSION. Это в значительной степени одна из немногих вещей, на которые вы можете положиться на перекрестную страницу, которую нельзя подделать. Потому что, конечно, он по существу никогда не покидает ваш контроль.

0

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

1

спасибо, хотя я использую

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 

if(IS_AJAX) { 
    //Request identified as ajax request 
} 

ура!

0

В файле JavaScript, который вызывает сценарий:

var url = "http://website.com/ajax.php?say=hello+world"; 
xmlHttp.open("GET", url, true); 
xmlHttp.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 

затем в PHP файл ajax.php:

if($_SERVER['HTTP_X_REQUESTED_WITH'] != "XMLHttpRequest") { 
    header("Location: http://website.com"); 
    die(); 
} 

Geeks все еще может вызывать сценарий ajax.php ковку заголовка, но остальная часть моего скрипта требует сеансов, поэтому выполнение завершается, когда не обнаружен действительный сеанс. Мне нужно, чтобы это работало, чтобы перенаправить людей с истекшими гибридными сеансами на главный сайт, чтобы снова войти в систему, потому что они были перенаправлены на сценарий ajax.

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