PHP: помощь в защите / фильтрации вызовов ajax

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

function is_ajax(){//Help Secure Ajax Calls if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest') return; else die;//no ajax } 

Моя мечта – разрешить только файл внутри моего сервера (htm или php) для доступа к другому файлу php через ajax.

Интересно, не поможет ли код ниже:

 if(strpos($_SERVER['REQUEST_URI'],'http://')) die;//Help Secure From URL Include Attacks 

Благодарю.

Поскольку вызов AJAX всегда выполняется из браузера, запрос не поступает с вашего собственного сервера, а на клиентскую машину. Даже если вы устанавливаете пользовательские заголовки, их можно легко манипулировать на стороне клиента.

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

Быстрый и грязный пример:

Сценарий, запрашивающий ресурс AJAX:

 $secret ="ABC1232"; $item = array( "time"=>time(), "token_id"=>"<page_url>" ); $signed = base64_encode(hash_hmac("sha256",json_encode($item),$secret)); $item = base64_encode(json_encode($item)); $ajax_url = "myscript.php?signed=$signed&item=$item"; 

Ресурс AJAX, проверка маркера действительна

 $item = json_decode(base64_decode($_REQUEST["item"])); $timeout = 3600; if($item->time < (time()-$timeout)){ die("Invalid token - timeout"); } if($item->token_id !== "<page_url>"){ die("Invalid token - page url"); } $secret ="ABC1232"; $valid = ($_REQUEST["signed"] === base64_encode(hash_hmac("sha256",json_encode($item),$secret)); if(!$valid){ die("Invalid token"); } 

Ваш Ajax столь же безопасен, как и ваш прикладной уровень. Ajax – это только код на стороне клиента, который обращается к серверному коду. Вероятно, нет способа защитить его так, как вы хотите, поскольку каждый может эмулировать вызовы Ajax с любого языка, просто изменяя заголовки запросов. Еще одна вещь, которую большинство аяксифицированных фреймворков включает HTTP_X_REQUESTED_WITH, но не на 100% надежной.

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

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

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

 $valid = (base64_decode($_REQUEST["signed"]) === "blahblahblah that you copied from php");