Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > проблемма с сесиями


Автор: Flat 7.8.2009, 19:50
разбираюсь с сессими... вроде все заработало но вот ошибка достала )

 
Код
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at Z:\home\test1.ru\www\index.php:14) in Z:\home\test1.ru\www\index.php on line 21


как я понимаю ошибка что второй раз делаю старт сессий? ... вроде проверку вставил... правда все остальное что к сессиям привязано вроде робит... елсли эта ошибка не критична как ее убрать? 

вот index.php 
Код

<table border="0" width="100%" cellpadding="0" cellspacing="0">
    <tr>
        <td valign="top" align="left" width="100%" colspan=3 background="images/mainbg.jpg"> <img src="images/main.jpg" width="300" height="150" border="0" >            
        </td>
    </tr>
    <tr>
        <TD width="200" valign="top">
            <? 
                if(session_id() == '')
                session_start();
                include 'left.php';
                ?>
        <TD width=80% valign="top">
            <? 
            $do=$_GET['do'];
            if (!$do) 
                { include 'news.php';}    
            else
                { include "$do";}
            ?>
        </TD>
        <TD width=200 valign="top">
            верх
        </TD> 
    </tr>
    <tr>
        <TD width=100% colspan=3>
            низ
        </TD>    
    
    </tr>
</table>

Автор: Ипатьев 7.8.2009, 20:11
Сессия отправляет НТТР заголовки.
Структура НТТР ответа такова, что в нем сначала идут заголовки, а потом - текст ответа. 
Если уже начался текст, то заголовок, разумеется, выдать уже нельзя. О чем тебе и пишет: headers already sent.
Вообще странно, что сессии работает. Разве что сессия изначально начинается в каком-то другом месте, где преждевременный вывод не мешает установить куку.

Вообще, этот фрагмент кода нарушает два правила
1. вся работа с заголовками должна веститсь до вывода в браузер.
2. в индексном файле не должно быть html кода.

Автор: Flat 7.8.2009, 20:19
да начинаеться вдругом месте ... которое инклюдиться в индекс.... авторизация ... хм.. а как средствами пхп создать таблицу? через echo? или лучше инклюдить еще 1 файл с разметкой таблицы?

мысль в том что весь контент будет выводиться через index.php.... да... щас сам задумался об индексации .... придеться переделывать

Автор: Ипатьев 7.8.2009, 20:51
Да, надо инклюдить файл с разметкой страницы.

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

Переменная $do, небось, передается через адрес? 

Автор: Flat 7.8.2009, 20:56
вощем вывод сдела эхами и все заробило спасибо

угу через $do через адрес... а что .. что то с этим не так? 

 

Автор: Ипатьев 7.8.2009, 21:34
Странно. Как могла переделка на вывод эхами решить проблему. И зачем было вместо нормального хтмл делать непонятно что.
Ну да ладно. Что с $do не так? Да дыра это. Хрестоматийная.


Автор: Flat 8.8.2009, 07:24
простите за тупизну... я еще только учусь... 
еще несколько вопросов

1 Что за дыра? обьясните пожалуста для понимания?
если  $do передавать через базу дыра исчезнет?


2. как ты и говорил сделал сесии до вывода html

Щас Index.php выглядит так 

Код

<?php
error_reporting (E_ALL);

if(session_id() == '')
session_start();

echo "
<html>

<head>
<meta http-equiv=Content-Type content=text/html; charset=windows-1251>
<title>Лучший софт</title>

<link rel=StyleSheet href=main.css type=text/css />


<body>

<table border=0 width=100% cellpadding=0 cellspacing=0>
    <tr>";
            include 'header.php';
    echo "</tr>
    <tr>
        <TD width=200 valign=top>
";

                include 'left.php';

        echo "<TD width=80% valign=top>";
            
            $do=$_GET['do'];
            if (!$do) 
                { include 'news.php';}    
            else
                { include "$do";}
            
        echo"</TD>
        <TD width=200 valign=top>
            верх
        </TD> 
    </tr>
    <tr>
        <TD width=100% colspan=3>
            низ
        </TD>    
    
    </tr>
</table>

</body>

</html>";

?>


Автор: bars80080 8.8.2009, 12:01
дыра в $do в том, что ты открыто передаёшь имя подключаемого модуля, а затем инклудишь его.
пример: допустим, у тебя где-то есть возможность загружать файлы на сервер и злодей загружает не обычную картинку, а свой файл с кодом. затем он подменяет в адресе &do=имя_своего_файла и подключает его в код. в итоге он может что-угодно сделать. либо ещё проще, он просто подставляет имя какого-нибудь конфига или другого, обычно закрытого файла, и в итоге может получить некую информацию, которую в теории могут видеть только администраторы

передавать надо id модуля, в идеале - число: &do=5
потом в БД находить по id адрес этого модуля и инклудить, применяя все нужные проверки на доступ пользователя к этому модулю

Автор: Ипатьев 8.8.2009, 12:49
Цитата(Flat @  8.8.2009,  07:24 Найти цитируемый пост)
если  $do передавать через базу дыра исчезнет?

Нет, не исчезнет.
Передаваемый параметр надо проверять в любом случае, какой бы механизм не использовался.
И вообще, передать что-либо через базу данных невозможно. В браузере у пользователя базы данных нету. И она из браузера ничего не передаст.

Это же касается и п.2

Цитата(Flat @  8.8.2009,  07:24 Найти цитируемый пост)
Щас Index.php выглядит так 

Ну и зачем было переделывать все на echo? Неужели серый HTML без кавычек воспринимается и работает лучше?
Речь шла совсем о другом.

Автор: Flat 8.8.2009, 12:49

Добавлено @ 12:57
Цитата(Ипатьев @ 8.8.2009,  12:49)
Цитата(Flat @  8.8.2009,  07:24 Найти цитируемый пост)
если  $do передавать через базу дыра исчезнет?

Нет, не исчезнет.
Передаваемый параметр надо проверять в любом случае, какой бы механизм не использовался.
И вообще, передать что-либо через базу данных невозможно. В браузере у пользователя базы данных нету. И она из браузера ничего не передаст.

Это же касается и п.2

Цитата(Flat @  8.8.2009,  07:24 Найти цитируемый пост)
Щас Index.php выглядит так 

Ну и зачем было переделывать все на echo? Неужели серый HTML без кавычек воспринимается и работает лучше?
Речь шла совсем о другом.

1 дошло по первому вопросу... будет отдельная база страниц а передаваться тока ID на эту страницу... 

2 не лучше читаеться конечно... но так проще разорвать его, чтобы например мета-теги вставить ... но то что ты преложил тоже дошло... 

3 щас думаю как индентификатор сессии передать не через строку и не через кукис ) 

Автор: Ипатьев 8.8.2009, 13:02
Цитата(Flat @  8.8.2009,  12:49 Найти цитируемый пост)
будет отдельная база страниц а передаваться тока ID на эту страницу... 

Ну, если страницы представляют собой только текст, то их изначально следовало хранить в базе.
Но если это php код, то ему-то что в базе делать?

Цитата(Flat @  8.8.2009,  12:49 Найти цитируемый пост)
но так проще разорвать его

Это шутка?
Писать кучу эхо с частоколом слешей проще, чем написать ?><?
?
Цитата(Flat @  8.8.2009,  12:49 Найти цитируемый пост)
но то что ты преложил тоже дошло... 

я не совсем в этом уверен

Цитата(Flat @  8.8.2009,  12:49 Найти цитируемый пост)
щас думаю как индентификатор сессии передать не через строку и не через кукис ) 

Думать, вообще, всегда полезно, но в данном случае результат будет нулевым. Никак.

Автор: Flat 8.8.2009, 15:13
Цитата(Ипатьев @ 8.8.2009,  13:02)
Цитата(Flat @  8.8.2009,  12:49 Найти цитируемый пост)
будет отдельная база страниц а передаваться тока ID на эту страницу... 

Ну, если страницы представляют собой только текст, то их изначально следовало хранить в базе.
Но если это php код, то ему-то что в базе делать?


Это шутка?
Писать кучу эхо с частоколом слешей проще, чем написать ?><?
?
Цитата(Flat @  8.8.2009,  12:49 Найти цитируемый пост)
но то что ты преложил тоже дошло... 

я не совсем в этом уверен

Цитата(Flat @  8.8.2009,  12:49 Найти цитируемый пост)
щас думаю как индентификатор сессии передать не через строку и не через кукис ) 

Думать, вообще, всегда полезно, но в данном случае результат будет нулевым. Никак.

1. база будет не из самих страниц... а из ссылок на страницы... 
 те страницы которые будут содержать только тексты будут храница в также базе

2 вечером переделаю

3. .... пока мыслей нет... 

4. спасибо за помощь и тебе и bars80080
  

Автор: Ипатьев 8.8.2009, 15:27
Цитата(Flat @  8.8.2009,  15:13 Найти цитируемый пост)
база будет не из самих страниц... а из ссылок на страницы... 

А какой смысл в таком извращении?

Цитата(Flat @  8.8.2009,  15:13 Найти цитируемый пост)
3. .... пока мыслей нет... 

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)