iframe в бэкэнде: проверьте, вошел ли пользователь бэкэнда в систему


Я использую Magento 1.9.

Я создал модуль и добавил страницу в бэкэнд, доступ к которой можно получить через меню. Эта страница содержит iframe (объявленный в файле phtml), который загружает собственное приложение. php-файлы этого приложения находятся на том же сервере.

Пока все работает нормально. Однако у меня есть проблема с безопасностью. К приложению в iframe можно получить доступ, вызвав php-скрипт напрямую, если известен URL-адрес. И это не должно быть возможным.

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

Я сделал следующее в файле phtml:

<iframe src="/path/to/app.php" frameborder="0" width="100%" height="1000px"></iframe>

И в app.php :

require_once('../../app/Mage.php'); 
Mage::app();
$session = Mage::getSingleton('admin/session');
$session->isLoggedIn();

Но isLoggedIn всегда возвращает false. Что мне нужно сделать, чтобы он работал правильно? Как новичок, я понятия не имею.

Author: robsch, 2014-08-27

2 answers

Я создал следующее решение, которое, похоже, работает с Magento 1.9 (по крайней мере, оно работает для меня). Это решение также можно найти в других местах сети. Но я переписал его, так как эти другие списки не работали для меня.

require_once('../app/Mage.php');

function isBackendUserLoggedIn() {
    if (!array_key_exists('adminhtml', $_COOKIE)) return false;

    if(!session_id()) session_start();
    $oldSession = $_SESSION;

    Mage::app();

    $sessionFilePath = Mage::getBaseDir('session') . DS . 'sess_' . $_COOKIE['adminhtml'];
    $sessionContent  = file_get_contents($sessionFilePath);

    session_decode($sessionContent);

    /** @var Mage_Admin_Model_Session $session */
    $session  = Mage::getSingleton('admin/session');
    $loggedIn = $session->isLoggedIn();

    //set old session back to current session
    $_SESSION = $oldSession;

    return $loggedIn;
}

if(isBackendUserLoggedIn()) {
    echo 'Welcome!';
} else {
    echo 'Go away!';
}

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

 3
Author: robsch, 2015-09-10 08:29:49

Ваша проблема в том, что бэкэнд и интерфейсный сеанс имеют два разных имени.

Когда ваше приложение использует session_name('admin'), оно может получить доступ к серверному сеансу и убедиться, что пользователь вошел в систему.

Mage::app() выполняется по умолчанию в интерфейсе, поэтому вы не можете получить доступ к сеансу администратора. Хакерское решение можно найти здесь: https://stackoverflow.com/a/16034942/1480397

Вы можете попробовать с помощью:

Mage::app('admin')

Затем сеанс может быть прочитан автоматически.

 2
Author: Fabian Blechschmidt, 2017-05-23 12:37:14