Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Передача PHPSESSID Ajax-скрипту и безопасность
 
 автор: DJ Paltus   (24.01.2013 в 13:51)   письмо автору
 
 

Думаю, с этим сталкивался любой, кто пытался сделать более-менее динамичную "корзину" в интернет-магазине без использования cookies. Хотя, PHPSESSID тоже в куках хранится...
В общем, проблема в том, что скрипт, отображающий количество наименований в "корзине", подгружается аджаксом каждый раз, когда посетитель тычет в "купить" на витрине. А вот при переходе на другие страницы сайта неплохо бы содержимое корзины не растерять. Почему оно должно потеряться? А потому, что корзиночный скрипт и весь остальной сайт используют разные сессии.
И я решил подружить их в рамках одной из сессий, а именно, запускаемой основным телом сайта. Способ был выбран тривиальный – где-то в коде помещается примерно такая штука:
<?
echo "<span id=psid rel='".session_id()."'></span>";
?>

При вызове "корзины", делается примерно так:
var psid = $("#psid").attr("rel"); //забираем значение

$.post('scripts/cart.php', {
"action":action, 
"psid":psid,  //и среди прочих переменных отдаем его "корзинке".
"id":rel}, 
function(data) {
    $('#mycart').html(data);
})

После этого остается только загнать корзинку в ту же сессию:
<?
    
if(session_id()=="") { //проверка на случай, если скрипт подгружается ф-цией include()
        
session_start();
        
session_id($_POST['psid']);
        }

И вот "корзина" влилась в общую работу.

А теперь, собственно, вопрос. Этот метод не является ли какой-нибудь зияющей дырой в безопасности сайта?

  Ответить  
 
 автор: Sfinks   (26.01.2013 в 09:05)   письмо автору
 
   для: DJ Paltus   (24.01.2013 в 13:51)
 

По моему никаких проблем. Даже если чел начнет изменять значения атрибутов, то никому кроме себя он не навредит.

  Ответить  
 
 автор: confirm   (26.01.2013 в 13:12)   письмо автору
 
   для: DJ Paltus   (24.01.2013 в 13:51)
 

И какова цель использования разных сессий?

  Ответить  
 
 автор: DJ Paltus   (26.01.2013 в 13:30)   письмо автору
 
   для: confirm   (26.01.2013 в 13:12)
 

Цель-то как раз два скрипта в одну PHP-сессию загнать. Две сессии получаются из-за того, что скрипт не грузится в include, а подгружается с помощью ajax-вызова, тем самым у него по умолчанию открывается новая сессия.

  Ответить  
 
 автор: confirm   (26.01.2013 в 13:36)   письмо автору
 
   для: DJ Paltus   (26.01.2013 в 13:30)
 

Что-то слишком заумно. Зачем вообще два скрипта, и почему это асинхронный запрос должен "потерять" сессию?

  Ответить  
 
 автор: DJ Paltus   (26.01.2013 в 13:41)   письмо автору
 
   для: confirm   (26.01.2013 в 13:36)
 

Потому что пхп-сессия живет для конкретного скрипта. А ajax-запрос - это вроде бы дополнительный http-вызов. И как без двух скриптов, если надо обсчитывать несколько величин и класть их в серверную сессию без перезагрузки страницы?

  Ответить  
 
 автор: confirm   (26.01.2013 в 14:07)   письмо автору
 
   для: DJ Paltus   (26.01.2013 в 13:41)
 

<?php
session_start
();
$_SESSION['set'] = 1;
?>
<html>
<head>
  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js"></script>
<script>
$(function(){
   $('button').click(function(){
      $.post('new.php',{p:1},function(d){
         $('#as').text(d);
      },'text');
   });
});    
</script>
</head>
<body>
<div id="as"></div>
<button>SEND</button>
</body>
</html>

new.php
<?php
session_start
();
$_SESSION['set']++;
echo 
$_SESSION['set'];
?>

Открывайте отладчик и следите за параметрами запроса и ответа, поймете почему то, что вы пишите не возможно в ситуации, которую вы описываете.

А что касается корзины, то это не такая и сложнейшая задача, чтобы ее обрабатывать кучей скриптов, вполне хватит одного скрипта.

  Ответить  
 
 автор: DJ Paltus   (26.01.2013 в 14:50)   письмо автору
 
   для: confirm   (26.01.2013 в 14:07)
 

Совсем с толку сбился. Работает, но орет ворнинг на то, что заголовки уже приняты.
Сейчас скачаю проект на домашний комп и буду искать 10 отличий.

  Ответить  
 
 автор: confirm   (26.01.2013 в 15:04)   письмо автору
 
   для: DJ Paltus   (26.01.2013 в 14:50)
 

Значит у вас уже была их выдача, проверяйте. Но сути это не меняет.

  Ответить  
 
 автор: DJ Paltus   (26.01.2013 в 15:56)   письмо автору
 
   для: confirm   (26.01.2013 в 15:04)
 

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

(пока не удается сравнить скрипт из проекта и этот, отложим до понедельника)

  Ответить  
 
 автор: confirm   (26.01.2013 в 17:24)   письмо автору
 
   для: DJ Paltus   (26.01.2013 в 15:56)
 

Нет, если ваш сервер сам не отправляет неких заголовков - в том что я представил, сам этот файл никаких заголовков не передает, а то что передавал первый файл, они уже отработали.
В контексте вашей темы главное это то, что браузер по запуску первого скрипта знает id сессии, и передает ее второму скрипту во время асинхронного запроса, поэтому сессия никак не прервется, если ее продлевать, что и делается в скрипте new.php.

По большому счету можно вообще написать один единственный скрипт, который будет обрабатывать сценарий всего сайта. Или несколько скриптов, но все запросы поступают к индексному файлу, который подключает другие необходимые. Если при этом грамотно организовать структуру индексного файла, выделить в нем области обрабатывающие те или иные запросы, то передача в некой его части заголовков, или простой выдачи контента в браузер никак не будет мешать и вызывать ошибок. К примеру, в индексном файле, если он обрабатывает асинхронные запросы, да и любые другие запросы, которые не должны вызывать перезагрузку страницы, эти сегменты кода надо помещать в самое начало его.
<?
if($_POST['ajax']) {
  
//обработка асинхронного запроса
  //и выдача результата клиенту
  
exit; //обязательный выход
}

if(
$_GET['download']){
  
//обработка запроса на выдачу файла
  //и выдача результата клиенту
  
exit; //обязательный выход  
}
//и т.п. запросы
?>
<html>
.....

При этом, если подразумевается работа со сессией, то старт сессии должен быть прописан перед этими сегментами кода. То же самое, если предполагается, что индексный файл, а также асинхронные и прочие запросы к нему будут использовать одни и те же результаты запроса к базе, то подключение к базе, а возможно и некоторые необходимые запросы к ней лучше помещать также перед этими сегментами кода.
Любые же передаваемые заголовки в частях (условиях) этого сегмента кода, а естественно и вывод в браузер (выдача результата) независимы, и причиной ошибок быть не могут.

  Ответить  
 
 автор: DJ Paltus   (30.01.2013 в 17:20)   письмо автору
 
   для: confirm   (26.01.2013 в 17:24)
 

И правда. Ошибка в чем-то другом была, а я как всегда забрало опустил и поскакал сражаться с вымышленными трудностями. Заремил строку с принудительным присвоением идентификатора сессии, а все продолжает работать правильно.
Спасибо за урок )

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования