Как я могу быть уверен, что запросы ajax и curl получены от одного и того же запрашивающего?

Я попытаюсь объяснить мою проблему.
Я использую php curl для получения ответа от URL в кросс-домене, я передаю в этом URL ключ, который я проверяю в моем контроллере Symfony, если он существует в моей БД. Затем я возвращаю ответ в JSON. этот ответ позволяет выполнить сценарий ajax, этот сценарий пытается получить другой URL-адрес в jsonp, который возвращает представление.

2 виртуальных хоста: mysite.dev & partnersite.api

//in partnersite.api
//httpPost & httpGet are curl functions
//$privateKey => get the key in a DB
$response = httpPost("http://mysite.dev/app_dev.php/api/permission/key", array('private_key' => $privateKey));
// or
$response = httpGet("http://mysite.dev/app_dev.php/api/permission/".$privateKey);
$jsonResp = array();
$jsonResp = json_decode($response, true);
if ($jsonRespP['access'] == 'granted'){
echo '<script src="'.$jsonRespP['resp'].'" type="text/javascript"></script>';
//there are some things here ...
echo '<script>SlAPI({slug : "thing-to-display"});</script>';
}

//in mysite.dev (first controller)
public function getApiPermissionAction() {
$response = new JsonResponse();
//check if key exists in DB and if exists :
return  $response->setContent(json_encode(array(
'access' => "granted",
'resp' => "http://mysite.dev/app_dev.php/api/get_api",
//this is ajax script contained in js.html.twig and returning the views of the api
)));
}

//in js.html.twig
function SlAPI(settings) {
glob = settings;
var SlAPI = {
init: function() {
if (glob.slug){
{%  set url = urlSite ~ "/app_dev.php/api/thing/" %}
url = "{{ url }}"+glob.slug; //==http://mysite.dev/app_dev.php/api/thing/thing-to-display
}
ajaxLoadUrl(url);
}
}
SlAPI.init();
}

function ajaxLoadUrl(url, dataValue) {
var dataValue = (dataValue == undefined ? "" : dataValue); //not used in this case but in others
url += "?callback=?" ;
JQuery.ajax({
url: url,
dataType: "jsonp",
data: dataValue,
xhrFields: {withCredentials: true},
jsonpCallback: "successCallback",
});
}

//in mysite.dev, 2nd controller
// Creating callback response
//$view is a way to a twig
public function callbackResponse($view, $params){
$request = $this->getRequest();
$response = new Response('', 200, array('content-type' => 'text/javascript'));
$response->headers->set('Access-Control-Allow-Origin', '*');
$response->send();

if ($request->get('callback')) {
$arrayNew = array("success" => $this->render($view, $params)->getContent());
$jsonStr = json_encode($arrayNew);
echo "{$request->get('callback')}( $jsonStr );";
exit;
}
}

//this works
//in partnersite.api I can see my view

Я должен быть уверен, что оба звонка поступают от одного человека / компьютера.

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

Я пытался использовать сеансы, но если я создаю сеанс в первом контроллере, я не могу получить тот же сеанс во втором. Идентификаторы разные (я пытался изменить его, не работал). При втором вызове с помощью ajax передается phpsessid, поэтому сессия в $ request во втором контроллере является такой же.

Другая информация: phpsessid не меняется, это то же самое, когда я обновляюсь и использую другой виртуальный хост (может быть, это происходит из-за cookie), тогда как созданные сеансы меняются, но это нормально, но это может быть интересно для вас, чтобы помочь мне.

//following things are examples
//I added an other virtualhost partnersite2.api

//in partnersite.api
//I can start a session
session_start();
echo session_id(); // hs8teh8qqqksdmj9030buvfpj7
echo '<br />'.$_COOKIE['PHPSESSID']; // hs8teh8qqqksdmj9030buvfpj7
// same

//in curl fonction
//I added CURLOPT_COOKIE => 'PHPSESSID=' . $_COOKIE['PHPSESSID']

//in mysite.dev (1st controller)
$session = $request->getSession();
$param = $session->getId(); // hs8teh8qqqksdmj9030buvfpj7

//in mysite.dev ajax get (2nd controller)
$session = $request->getSession();
$param = $session->getId(); // 8hmdf2r1imvoc55ioshojdd7i0
$param2 = $request->__toString(); // PHPSESSID: 8hmdf2r1imvoc55ioshojdd7i0

//in partnersite2.api
session_start();
echo session_id(); // 9crfkb8tnmab04r75gv980dhb7
echo '<br />'.$_COOKIE['PHPSESSID']; // 9crfkb8tnmab04r75gv980dhb7
//it's different of when I call from partnersite.api

//in mysite.dev (1st controller)
$session = $request->getSession();
$param = $session->getId(); // 9crfkb8tnmab04r75gv980dhb7

//in mysite.dev ajax get (2nd controller)
$session = $request->getSession();
$param = $session->getId(); // 8hmdf2r1imvoc55ioshojdd7i0
$param2 = $request->__toString(); // PHPSESSID: 8hmdf2r1imvoc55ioshojdd7i0
//it's same of when I call from partnersite.api

//Im not sure session is a good way I don't know but may be something processing like a session in server side
// that I can identifie in the both controllers and makes me sure the both requests are from the same computer

Итак, мой вопрос: существует ли что-то вроде сеанса, что я могу инициализировать в первом контроллере, например, с идентификатором и некоторыми параметрами, и после того, как я могу получить по идентификатору, чтобы проверить, является ли тот же клиент, который выполнил оба запроса ?

Я знаю, что могу пройти мимо БД, но я не предпочитаю этот путь, но если я должен, я сделаю это.
Например, добавьте в db метку времени, затем отправьте ее как открытый ключ и передайте в запросе ajax, затем проверьте в db, существует ли она в db, и удалите ее. Мне не нравится stock в db, потому что она временная. Что ты об этом думаешь ? может быть, все, что я сделал, это неправильно, скажите мне, пл. Техас

Я надеюсь, вы поймете мою проблему и извините мою грамматику. Я не англичанин ^^ tx

0

Решение

За некоторыми редкими исключениями, сеансы сохраняются на стороне клиента с файлами cookie. Эти файлы cookie управляются с помощью расширенных заголовков HTTP Set-Cookie а также Cookie, Это необходимо, потому что HTTP изначально не имеет состояния.

Трудно сказать, не видя никакого кода, но любые запросы AJAX, инициированные страницей, которую возвращает ваш сервер, должны также отправлять любые файлы cookie в Cookie заголовок этого AJAX-запроса, что, в свою очередь, означает, что даже AJAX-запросы должны поддерживать свое состояние на основе файлов cookie с сервером.

Итак, я не совсем уверен, что понимаю вашу проблему, но вы говорите что-то вроде того, как вы пытаетесь использовать сеансы для этого, но не можете или что это не работает — я думаю, что именно здесь должна начаться ваша отладка , Если ваше основное состояние сеанса не работает должным образом, у вас, скорее всего, будут другие проблемы с вашим приложением, кроме этого AJAX.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector