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. Что мне нужно сделать, чтобы он работал правильно? Как новичок, я понятия не имею.
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!';
}
Я надеюсь, что это решение приемлемо в отношении безопасности и стабильности. Пожалуйста, дайте мне знать, можно ли его улучшить или есть ли какие-либо другие лучшие подходы.
Ваша проблема в том, что бэкэнд и интерфейсный сеанс имеют два разных имени.
Когда ваше приложение использует session_name('admin')
, оно может получить доступ к серверному сеансу и убедиться, что пользователь вошел в систему.
Mage::app()
выполняется по умолчанию в интерфейсе, поэтому вы не можете получить доступ к сеансу администратора. Хакерское решение можно найти здесь: https://stackoverflow.com/a/16034942/1480397
Вы можете попробовать с помощью:
Mage::app('admin')
Затем сеанс может быть прочитан автоматически.