2013-06-18 3 views
0

Я делаю запрос AJAX на скрипт под названием return.php, который будет выглядеть следующим образом:PHP проверка случайного ключа

http://www.example.com/return.php?type=3&filter=2 

Это происходит, когда пользователь просмотра хитов кнопки на example.com

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

Итак, я думал отправить некоторый тип случайно сгенерированного ключа вместе с запросом. Какую методологию я бы использовал для проверки на return.php, что был отправлен правильный ключ?

Могу ли я сгенерировать ключ и сохранить его в переменной сеанса, которая затем доступна в return.php?

псевдо-код:

if ($random_key_sent == what it should){ 
     //go ahead and execute code 
    } 
else{ 
    //sorry can't help 
    } 

И В конечном итоге мой запрос будет выглядеть примерно так:

http://www.example.com/return.php?type=3&filter=2&key=8fu5jtugy489kgvuri09984ufjlgi (or whatever the key would be) 

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

+0

Я бы добавил в него ключ сеанса и хранения, ключи ['send-form'], key ['login-form'] и т. Д. Его легко очистить, если вы перейдете на другую страницу. также вы можете добавить использование ajax_keys для ajax-запросов – ccd580ac6753941c6f84fe2e19f229

+1

Это в основном [токен CSRF] (http://en.wikipedia.org/wiki/Cross-site_request_forgery) – Blender

+0

@blender, спасибо за то, что я искал. ..Я знал, что это общая проблема, но не знакома с терминологией. – absentx

ответ

1

Вы ищете cross-site request forgery (CSRF или XSRF) защиты.

Как правило, вы генерируете и сохраняете токен анти-CSRF в данных сеанса пользователя и помещаете его в скрытое поле формы (используя GET или POST), или для обычных ссылок вы помещаете токен в параметр запроса. На стороне сервера вы проверяете, что токен анти-CSRF соответствует таковому в данных сеанса пользователя.

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

-2

Если у вас не будет списка предустановленных ключей, которые ваш код PHP проверяет и браузер может получить, чтобы затем отправить URL-адрес, было бы нецелесообразно проверять ключ для определенного значения. Вы могли бы просто проверить, если значение $_GET["key"] массива устанавливаются:

if(isset($_GET["key"])){ 
    // go ahead and execute code 
}else{ 
    // sorry can't help 
} 

В качестве альтернативы, вы можете рассмотреть вопрос о необходимости браузера, чтобы установить некоторые POST данных, посылаемые вместе с запросом на веб-страницу, но не могут быть введены в адресная строка. Затем просто используйте $_POST["key"}, а не $_GET["key"] для проверки.

+0

isset ($ _ GET ["key"]) ??? – ccd580ac6753941c6f84fe2e19f229

+0

@Kuraiinazuma ['isset()'] (http://php.net/manual/en/function.isset.php) вернет true, была установлена ​​переменная. ['$ _GET [" key "]'] (http://php.net/manual/en/reserved.variables.get.php) вернет содержимое '& key =' части URL. Поэтому 'isset ($ _ GET [" key "])' будет возвращать значение true, если к URL-адресу добавлено '& key = some_characters'. –

+0

вы не получите – ccd580ac6753941c6f84fe2e19f229

1

Если вы беспокоитесь о «прямых вводах», но все же должны использовать запросы GET, вы можете проверить заголовки запросов на PHP, чтобы разрешать только запросы Ajax, используя $_SERVER['HTTP_X_REQUESTED_WITH'].

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    // Do what you need to do 
} else { 
    die("Ajax Only"); 
} 

(Измененный David Walsh)

+0

Это легко подделать. – Blender

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