2015-03-20 2 views
1

Я что-то делает это в нижней части всех моих взглядов:

<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); 
     } 
+1

Учтите, что в будущем конфиденциальная информация может храниться в сеансе. Любая причина, по которой вам необходимо получить доступ ко всем данным сеанса из вашей JS? Не лучше ли было бы выборочно предоставлять эту информацию? – rjdown

+0

Yup! Я обновил свою логику ajax, чтобы сделать именно это. Спасибо, парни! – user3630824

ответ

0

Вы можете хранить, что данные сессии в браузере с sesssionStorage в последовательную строку JSON и манипулировать его оттуда. Многие рекомендуют этот подход с использованием печенья W3Schools

Cheers.

1

От того, как вы описываете, вы используете сеанс, я не вижу в нем никакого вреда, но я все же считаю, что это опасно. Представьте, что вы в будущем работаете над другим проектом, а затем возвращаетесь к этому. Будете ли вы по-прежнему помнить, что не храните конфиденциальную информацию внутри сеанса? Основным правилом является никогда не хранить конфиденциальную информацию в сеансе, если только это не единственное решение, которое редко бывает. Но иногда делаются ошибки, и они могут причинить вам боль!

Я бы изменил это на что-то, что выглядит/работает одинаково, но предлагает вам больше развязки из сеанса. Если вы загружаете весь сеанс, вы обязаны получить некоторую информацию, которая никогда не будет использоваться или никогда не будет доступна для клиентской стороны (через Javascript). Я бы создал одну страницу, которую вы запрашиваете, которая может предоставить только необходимую информацию. Таким образом, вы также можете гарантировать, что только запрашиваемая информация будет отображаться на стороне клиента.

Поэтому вместо запроса общего файла ajax.php, я бы создал страницу с именем (или что-то в этом роде) userInfo.php. Таким образом, вы также можете исключить переменную type, которую вы отправляете вместе с ней.

Надеюсь, это может вам помочь, счастливое кодирование!

+0

Спасибо! Я обновил свой пост – user3630824

Смежные вопросы