Ошибка безопасности при отправке POST запроса

Spark108

Проверенные
Сообщения
486
Реакции
948
Баллы
5,675
Пишу плагин и когда пришел момент оттестировать его работу, делаю POST запрос по адресу http://site.ru/vote/votename/ форум мне возвращает ошибку безопасности. Что в этом плане делать? И да, что нужно искать для помощи в устранение проблемы?

Пост запрос отправлялся через cUrl:
PHP:
if($curl = curl_init())
{
    curl_setopt($curl, CURLOPT_URL, 'http://site.ru/vote/votename/');
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $cUrlPost);
    echo curl_exec($curl);
    curl_close($curl);
}

P.S. Ошибка только при POST запросе, если же сделать обычный запрос без указания POST или же GET запрос, то все проходит удачно. Я бы делал GET запрос и не заморачиваться, но это внешний адрес, который должен использовать сторонний сайт и он передает параметры в POST.
 
Последнее редактирование:
У ксена есть CSRF защита. Нужно делать запрос на страницу, от туда извлекать токен и передавать его в пост запросе.
Так в том то и дело, что так не прокатит. POST запрос должен сделать сторонний сайт, а он делает сразу запрос без той последовательности, которую вы описали.

Можно ли в таком случае сделать "белый лист сайтов" для этой защиты?

Я уже думаю создавать отдельный файл в корне сайта, где буду получать этот POST запрос и уже от локального имени делать запрос к XenForo, то есть типа Proxy.
 
Последнее редактирование:
Я уже думаю создавать отдельный файл в корне сайта, где буду получать этот POST запрос и уже от локального имени делать запрос к XenForo, то есть типа Proxy.
Создайте файл. В нем подключите ксен и работайте с контроллерами из кода.

PHP:
$startTime = microtime(true);
$fileDir = dirname(__FILE__);

require($fileDir . '/library/XenForo/Autoloader.php');
XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');

XenForo_Application::initialize($fileDir . '/library', $fileDir);
XenForo_Application::set('page_start_time', $startTime);

$deps = new XenForo_Dependencies_Public();
$deps->preLoadData();

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

Как можно запросить xfToken вообще? Куда нужно запрос послать?
Токен находится в теле формы как скрытый инпут. Он есть везде где юзер может совершить какое-то действие.
 
Не забудьте запретить доступ к файлу всем кроме тех кто с ним работает.
Ну запрещать доступ к файлу наверно не будет смысла, ведь он будет возвращать на страницу тоже что и та страница куда должен был идти изначально запрос, там должна вернутся json.

Создайте файл. В нем подключите ксен и работайте с контроллерами из кода.

PHP:
$startTime = microtime(true);
$fileDir = dirname(__FILE__);

require($fileDir . '/library/XenForo/Autoloader.php');
XenForo_Autoloader::getInstance()->setupAutoloader($fileDir . '/library');

XenForo_Application::initialize($fileDir . '/library', $fileDir);
XenForo_Application::set('page_start_time', $startTime);

$deps = new XenForo_Dependencies_Public();
$deps->preLoadData();

После этого сможете использовать контроллеры, модели и прочее. Не забудьте запретить доступ к файлу всем кроме тех кто с ним работает.
И кстати, это код из 1 ветки, во 2 ветки иначе.
 
Ну запрещать доступ к файлу наверно не будет смысла, ведь он будет возвращать на страницу тоже что и та страница куда должен был идти изначально запрос, там должна вернутся json.
Вам виднее.

И кстати, это код из 1 ветки, во 2 ветки иначе.
Да, там проще. Но суть та же.

PHP:
$dir = __DIR__;
require ($dir . '/src/XF.php');

XF::start($dir);
$app = XF::setupApp('XF\Pub\App');
 
Вам виднее.


Да, там проще. Но суть та же.

PHP:
$dir = __DIR__;
require ($dir . '/src/XF.php');

XF::start($dir);
$app = XF::setupApp('XF\Pub\App');
Ага, проще. Я уже законектился. Спасибо за помощь, пока буду сам искать как лучше сделать тут уже.
 
Современный облачный хостинг провайдер | Aéza
Назад
Сверху Снизу