Я что-то делает это в нижней части всех моих взглядов:
<script type='text/javascript'>
$.post('php/ajax.php', {type:'session'}).done(function(data){
var session = JSON.parse(data);
$(document).ready(function(){
$.getScript('resources/redactor/redactor.js');
$.getScript('javascript/year_long_calendar.js');
$.getScript('javascript/edit_lesson_modal.js');
});
});
</script>
Это работает очень хорошо для меня. Все мои скрипты загружаются внутри одного документа docReady, и для всех моих ajax требуется токен, который генерируется при регистрации и хранится в $ _SESSION. Это останавливает людей от удара моей логики ajax с использованием поддельных заголовков. Делая это, мои Ajax звонков выглядеть так:
$.post(url:'ajax.php', {token:session.token, id:id}).done(function(data){ ... });
Я могу также получить доступ к другим переменным сессиям
var user_id = session.user_id;
Так как я делал это с самого начала проекта, я намеренно держать любого чувствительной информации, такой как пароли, из переменной сеанса. Что вы думаете об этом? Любое из этого поражает вас как небезопасное или ужасно неэффективное? Я понимаю, что $ .getScript часто используется как ленивый способ загрузки библиотек, но я думаю, что нашел для него довольно эффективное использование.
Ни одна из данных в $ _SESSION не чувствительна, кроме токена, и вы должны войти в систему, чтобы получить ее. Если кто-то не злой хмель на машине, пока настоящий пользователь ушел, и точно знает, где моя логика ajax, как это работает, как я храню свою сессию и подделывает быстрый заголовок PostMan для удаления всех моих таблиц, я не вижу это проблема.
EDIT: @AnotherGuy помог мне реализовать гораздо лучшее решение. Мой ajax.php файл теперь выглядит следующим образом:
<?php session_start();
include('connect.php');
include('functions.php');
// check to see if http request is ajax (easy to fake but hey might as well)
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'){
// when the user logs in, a random number is generated and saved to $_SESSION['token'].
// this block is used to pass the token to a javascript variable securely
if($_POST['type'] == 'session'){
$session = [
'token'=>$_SESSION['token'],
'user_id'=>$_SESSION['user_id']
];
echo json_encode($session);
}
// all post requests must pass the correct token variable to step into this block and access the ajax logic
if(isset($_POST['token']) && $_POST['token'] == $_SESSION['token']){
if($_POST['type'] == 'get'){
$where = null;
if(isset($_POST['where'])){
$where = json_decode($_POST['where']);
}
$order_by = null;
if(isset($_POST['order_by'])){
$order_by = json_decode($_POST['order_by']);
}
echo json_encode(get($_POST['db'], $_POST['table'], $where, $order_by)->fetchAll());
}
if($_POST['type'] == 'put'){
$set = json_decode($_POST['set']);
echo put($_POST['db'], $_POST['table'], $set);
}
if($_POST['type'] == 'update'){
$set = json_decode($_POST['set']);
$where = json_decode($_POST['where']);
update($_POST['db'], $_POST['table'], $set, $where);
}
if($_POST['type'] == 'delete'){
$where = json_decode($_POST['where']);
delete($_POST['db'], $_POST['from'], $where);
}
Учтите, что в будущем конфиденциальная информация может храниться в сеансе. Любая причина, по которой вам необходимо получить доступ ко всем данным сеанса из вашей JS? Не лучше ли было бы выборочно предоставлять эту информацию? – rjdown
Yup! Я обновил свою логику ajax, чтобы сделать именно это. Спасибо, парни! – user3630824