PHP и AJAX безопасность

Фанат

oncle terrible
Команда форума
нужно сделать так чтобы, запрос через форму (form action="test.php" method="post") запрос нормально работал ( то есть он получал данные, обрабатывал их как то и отсылал обратно)
Но если просто вписать http://mysite.ru/test.php просто в адресную строку - то скрипт не выполнялся, а просто прекращался функцией die();
ну, это длается, допустим, таким кодом:
if ($_SERVER['REQUEST_METHOD'] != "POST") die();
но я не вижу в этом ни малейшего смысла.

Слышал есть метод, при котором мы в файле откуда происходит запрос прописываем define('JEXEC', 'TEST');
а это совсем бред.
Такой метод не работает вообще ни при каких запросах.
данная "защита" используется только для файлов, не предназначенных для того, чтобы к ним можно было обратиться извне. То есть, к обработке форм заведомо не может иметь никакого отношения.
как определить то, что запрос пришел именно с нашей формы,
Добавить в форму скрытое поле и записать его значение в сессию
 

FRIE

Новичок
Stragler
Ты не буробь на фаната, он хоть и умничает зато советы дельные даёт

сам столкнулся недавно с такой ситуёвиной что session_id() через аякс не передается якобы, но дело всё в том что в скрипте который стоит за аякс запросом, тебе чтобы узнать id сессии
надо делать не так:

echo session_id();

а вот так

echo $_SESSION['PHPSESSID']; - это не точно, скорее даже не правильно, я домой седня приду посмотрю точно и отпишусь,
короче вместо session_id() нужно писать что-то другое

-~{}~ 08.06.10 22:58:

вот посмотрел попробуй в phpшном скрипте которому передает переменные аякс сделать вот так

$sessid=$_REQUEST[session_name()];
echo $sessid;

и ты увидишь сессию
 

KR

alive in new life
<off-topic>
Уважаемый ТС, мозг дан Человеку, чтобы думать, а глаза, чтобы Видеть.
Если Вы считаете, что Вам дают не совсем умные советы, то по крайней мере потрудитесь проявить элементарное уважение к старожилам форума.

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

Степень их полезности каждый определяет сам для себя. Даже если Вам _кажется_, что их советы бесполезны, то самым простым решением, на мой взгляд, является простое игнорирование, а не вступление в бесполезные, и ни к чему не приводящие дебаты.

Ну и напоследок очень хочется вспомнить известную поговорку про маму-курицу, яйца и процесс обучения.
</off-topic>
 

eltoko

Новичок
вы знаете почему "новички" не любят форумы программеров?

потому что самый распространенный ответ на вопрос: "читай мануал".

вы думаете, что все кто спрашивает, не читали мануал? ошибаетесь, читали.

вот ответьте, вы сразу всё поняли прочитав мануал? неужели и вправду - достаточно прочитать мануал, чтобы стать профессионалом? )) конечно же нет.

всё познается в практике. а изобретение велосипеда - лучший способ изучения "темы вопроса"...

да, в мануале всё есть, но часто это написано так, что только автор может понять о чем речь с первого прочтения... также, в мануале часто не пишут главное (для автора мануала это аксиома, а новичок не в курсе)...

да, часто, прочитав мануал снова (по ссылке которую ему дали), человек может найти ответ на свой вопрос.. но не всегда. и это не значит что он тупой... ))

а обвинения в тупости - вторая причина - почему не любят форумы ))

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

eltoko

Новичок
baev
а чем эта тема не подходяща для исповеди? ))
тут вроде "конфликт" старичков и новичков произошел.. вот и отписался.

за ссылку спасибо, но она не для меня. :) я на форуме вопросы практически не задаю - лень ждать, когда ответят ))
 

craz

Нестандартное звание
вы вот так пишите, как будто высшую математику тоже должны преподавать как будто сказку читают в детском саду
 

eltoko

Новичок
craz
если добавить "жила-была", а в конце "мед, пиво пил..", то получится сказка.
 

pilot911

Новичок
Автор оригинала: Stragler
Так ладно попробуем еще раз:
нужно сделать так чтобы, запрос через форму (form action="test.php" method="post") запрос нормально работал ( то есть он получал данные, обрабатывал их как то и отсылал обратно)
Но если просто вписать http://mysite.ru/test.php просто в адресную строку - то скрипт не выполнялся, а просто прекращался функцией die();

Слышал есть метод, при котором мы в файле откуда происходит запрос прописываем define('JEXEC', 'TEST');

А в файле который обрабатывает запрос ( в нашем случае test.php) - прописываем defined('_JEXEC') or die('Restricted access');

Но такой метод не работает почемуто при запросах через ajax.

Либо вопрос можно так поставить - как определить то, что запрос пришел именно с нашей формы, а не откуда то еще - в противном случае сделать die

-~{}~ 05.06.10 16:16:

dimagolov
Фильтрация данных мне кажется это совсем другой разговор, я просто фильтрую все данные с помощью регулярок
конструкцию

defined('_JEXEC') or die('Restricted access');

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

в основном файле необходимо определить

define('_JEXEC', 1)
 

CoderX

Новичок
Тоже столкнулся с данным вопросом. Я конечно сейчас в процессе чтения мануалов и т.д. :). Но все же может кто сможет ответить:
Как сделать чтобы при обращении к пхп скрипту напрямую он не выполнялся, а когда он вызывается через аякс то чтобы отрабатывал? (собственно это наверно и ТС пытался узнать)
 

Ragazzo

TDD interested
CoderX
вопрос поставлен странно, но узнать что это аякс запрос можно так
PHP:
    /**
     * Checks if the current request is a AJAX request
     * @return bool true if current request is AJAX, or false either
     */
    public function isAjaxRequest()
    {
		return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest';
    }
 

CoderX

Новичок
CoderX
вопрос поставлен странно, но узнать что это аякс запрос можно так
PHP:
    /**
     * Checks if the current request is a AJAX request
     * @return bool true if current request is AJAX, or false either
     */
    public function isAjaxRequest()
    {
		return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']==='XMLHttpRequest';
    }
чето не работает у меня.
на данный момент сделал так
if ($_SERVER['HTTP_REFERER'] != 'http://адрес_сраницы_реферера_с_аяксом') {
die ("суда низза просто так э");
}
как считаете есть ли в этого споособа недостатки?
 

CoderX

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

С.

Продвинутый новичок
Для того чтобы не было доступа к чужим данным, есть обычная система авторизации. Защищать от аякса/неаякса не надо.
 

CoderX

Новичок
возможно. но тем не менее надо/ненадо вопрос не стоял так как логику работы вызываемого пхпскрипта я не объяснял.
вопрос стоял как сделать отработку только в случае вызова через аякс, и на данный момент я решил это с помощью сравнения реферера.
 

С.

Продвинутый новичок
Так чем чреват вызов скрипта напрямую?
 

Фанат

oncle terrible
Команда форума
Милок.
Логику работы вызываемого пхпскрипта объяснять не надо.
Если она завязана на ту проверку, которую ты здесь просишь, то логика эта кривая и ни от чего не защищает.

Мне ОЧЕНЬ печально сознавать, что будучи от горшка два вершка, и не понимая вообще ничего в обсуждаемой теме, ты ещё пытаешься спорить и навязывать свое мнение. Вместо того, чтобы слушать и пытаться узнать, как сделать ПРАВИЛЬНО.
Если ты не изменишь своё отношение, то, боюсь, твое общение на этом форуме не сложится.
 

CoderX

Новичок
ту С. -> уже ничем
задача ставилась так, потому как не охота было переписывать сделанное ранее, но подумав немного все же логика скрипта изменена и теперь смысла в защите от прямого вызова действительно нет.
Всем спс. Фанат я с Вами не спорю, я уважаю людей знающих, разбирающихся в своих сферах деятельности. Однако обратите внимание, что Вы лично слишком категоричны в своем отношении к другим. (по другому - если вы всем видом показываете что вы тут босс и только поэтому вопросов задавать нельзя, при этом упоминая "два горшка" и т.д. то мне лично насрать на ваше мнение и на этот форум, сам разберусь)
 

Фанат

oncle terrible
Команда форума
Я рад, что категоричность сработала.
- если не помогли все объяснения, которые уже были в этом топике
- если не помогли два недвусмысленно отрицательных ответа уже на твой вопрос
Только категоричность и остаётся. Или человек одумается, или обидится.
В любом случае мы избежим бессмысленной траты времени.
 
Сверху