|
|
|
| Здравствуйте!У меня пояаился вопрос, который,может,не смогу разумно изложить,но прошу ответить,если поймете.
Вот к примеру у меня страница с формой, в которую я ввожу данные.Если я ввел данные правильно/неправильно, то у меня до сих пор пользователь попадал на пустую страницу с сообщением типа "Ваши данные успешно добавлены".И ВСЕ.И это явно неправильно.Как можно сделать так, чтоб когда пользователь, к примеру,да и в других случаях, когда ввел данные, то попадал опять к этой форме к этой странице, но уже с итоговым сообщением.Короче,чтоб все было как у людей.Спасибо | |
|
|
|
|
|
|
|
для: Эдик12
(12.01.2010 в 22:11)
| | Ну допустим(пишу по ходу сразу тут(важна только идея)):
<?
function form($name.........)
{
$form='<form action=......>
<input name=login......value="'.$name.'">
..........................
</form>';
return $form;
}
|
И дальше все соответственно
if(empty(какой-то параметр))
{
echo "Вы не ввели такой то параметр<br>".form($name.........);
}
|
Вообщем идея: если что то не так выводим форму и заполненые поля в соответствии с функцией и выводим ошибки которые сделал пользователь при заполнении формы | |
|
|
|
|
|
|
|
для: Эдик12
(12.01.2010 в 22:11)
| | Отделите форму в отдельный файл form.php
Делайте проверку введенных данных, загоняете ошибки в массив или переменную (пусть $error)
Затем:
<?php
if ( !empty($error) ) {
echo $error; // выводим ошибки
include ('form.php');
} else {
echo 'Ваши данные успешно добавлены';
}
|
| |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 22:45)
| | С функцией все-таки будет удобней, хотя похоже на ваше, но есть возможность оставить все правильные поля в форме | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 22:49)
| | Что мешает в форму (не спроста файл с расширением .php) вставлять данные?
<input type="text" name="name" value="<?php if(!empty($_POST['name'])) echo $_POST['name']; ?>"> | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 22:57)
| | Ну хотя бы как вы написали мы имеем доступ в тело html кода, хоть это и не критично но все-таки( не знаю как это можно применить, но советуют так не делать). К тому же как меня кода-то научили - любой includ() это потенциальная дыра в коде сайта. | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:06)
| | Будем считать, что я не читал вашего поста.
А в следующем вы расскажите, почему против первого метода, и какие нахрен дыры открывает include, если подключаемый файл обозначен четко, без всяких переменных. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:12)
| | Вообщем цитирую из того по чему я учился если разуверите меня в этом буду рад :)
...Если в вашем коде есть обращение к другому файлу, вы должны быть четко уверены(должно быть проверено), что вы подключаете именно тот файл который предполагаеться в вашем коде. Данное условие можно выполнить
следующими путями:..............
И дальше куча всякой хрени
|
Вообщем в любом случае я бы не стал лишний раз прибегать к includ() когда можно обойтись без него. | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:15)
| | Ключевое слово - хрени.
А теперь давайте вместе подумаем, в каких случаях опасен include?
В случаях, когда в эту функцию значение подставляется динамически.
<?php include ($_GET['file']);
|
Какая может быть дыра в
<?php include ('file.php');
|
?
Я указываю конкретный файл, который мне нужен. С какой стороны сюда может попасть вредоносный код? Только если злоумышленник имеет доступ к самим файлам, например, через ftp. А в этом случаи надо думать уже о том, кто, как и когда мог спереть доступы к сайту.
А про форму - неужели вы считаете более рациональным способом загрузить целую форму в переменную и потом её вывести? Да еще и функции создавать..
Если вы боитесь использовать include(), то я представляю, как выглядит ваш файл index.php, который, судя по всему, содержит код целого сайта.
так и вижу, как на хостинге вашего сайта хранится файл index.php в 2 мегабайта и .htaccess с правилами реврайта (кстати тоже очень опасная штука, стоит ли ЧПУ такой угрозы безопасности?) | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:20)
| | >Только если злоумышленник имеет доступ к самим файлам, например, через ftp
Я вот тут делал парочку сайтов и как не пытался клиентам доказать что lunix круче они основываясь на своих познаниях взяли хостинг на windows а там права на все что можно 777. так что если вы даже используете
<?php include ('file.php');
|
Это может скрывать в себе скрытую угрозу.А потом обьясни пойди заказчику что он сам виноват
Нет я не боюсь его использовать, просто стараюсь чтоб это было как можно реже встречалось у меня в коде | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:24)
| | Вообщем это уже не суть темы :) просто я не люблю инклуды и все | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:27)
| | Давайте откровенно - вы просто не до конца понимаете, где встречаются подводные камни, поэтому боитесь их (инклуды) использовать.
Не любить инклуды - звучит..кхм.. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:28)
| | >Давайте откровенно - вы просто не до конца понимаете, где встречаются подводные камни, поэтому боитесь их (инклуды) использовать.
Да, собственно говоря так и есть, до конца я так и не понял где именно есть опастность, но все-таки если есть возможность не использовать подключение файла почему бы к этой возможности не прибегнуть? | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:24)
| | Онебеса
Ну объясните..нет, покажите мне пример использования этой "дыры". | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:27)
| | ну как я один раз делал:
У меня был стандартный движок. Я нашел сайты которые использовали этот же движок(а нашел я этот движок благодаря ссылкам которые просят не удалять авторы скриптов)). Дальше проверил где отркыт доступ к нужной мне папке. А дальше тупо получил доступ к нужному мне файлу(заменил этот файл на свой shell). Ну а дальше все зависило от меня. Но это возможно было только когда на нужную мне папку и файл открыт доступ(большинство windos серверов) | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:32)
| | Не надо мне о левом.
Вы привели пример кода:
<?php include ('file.php');
|
Покажите, где здесь дыра и как её использовать | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:34)
| | Нет я не спорю, если на указанный файл стоят нормальные права то дыры нет, но повторюсь заказчики всегда "умнее" исполнителя и за свою "умность" к кому они будут притензии предъявлять? | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:37)
| | Я работаю под виндоус, соответственно, все действия разрешены. И я с удовольствием скопирую код, использующий дыру в
<?php include ('file.php');
|
который вы конечно же можете написать, и посмотрю, какие последствия могут быть. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:40)
| | нет уж код ищите сами в инете, но если у вас в корне сайта можно заменить этот файл то извините, если все действия разрешены, то о чем может быть речь
Вы в php шарите судя по моим наблюдениям очень даже отлично, но includ() это не есть гуд в любом случае и если есть возможность к нему не прибегать, то лучше к нему не прибегать | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:41)
| | Я сторонник того, что именно такое использование инклудов
<?php include ('file.php');
|
А не такое:
<?php include ($_GET['file']);
|
безопасно, и никаких дыр не имеет.
А то, что вы не можете привести код, говорит лишь о том, что вы неправы, ибо такого кода в принципе нет.
По поводу доступа к корню сайта я уже сказал - за такие дыры надо по шапке давать и искать утечку конфеденциальных данных типа пароля. | |
|
|
|
|
|
|
|
для: neadekvat
(12.01.2010 в 23:46)
| | Ладно согласен :), но все-таки я не стал бы использовать лишний раз инклуд(не люблю я его).
Кстати а почему имя темы такое? | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:47)
| | Ну просто я объяснял, что у меня был переход на страницу с сообщенем, а в норм человеческом коде отобр. эта же страница с соотв. сообщением.Кстати, нашел более приемлемый код
Это если все правильно
header('Location: index.php?act=ok');
exit;
|
если неправильно
header('Location: index.php?act=err);
exit;
|
Ин а страницу с формой
if(isset($_GET['act'])){
if($_GET['act']=='ok'){
echo 'Ваши данные успешно добавлены';
}elseif($_GET['act']=='err'){
echo 'произошла ошибка!';
}
}
|
| |
|
|
|
|
|
|
|
для: Эдик12
(13.01.2010 в 00:13)
| | Кстати, добавил на одну страницу, а у мя пишет стандартную ошибку
Warning: Cannot modify header information - headers already sent by (output started at Z:\home\shop.ru\www\indexjura.php:11) in Z:\home\shop.ru\www\indexjura.php on line 24
Вроде все в начале файлов без пробелов.А в чем дело... | |
|
|
|
|
|
|
|
для: Эдик12
(13.01.2010 в 00:16)
| | Если ошибка есть - значит не все нормально. | |
|
|
|
|
|
|
|
для: Эдик12
(13.01.2010 в 00:13)
| | Порой так не хватает Fractured#, который может себе позволить прямым текстом сказать то, что думает об увиденном. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 00:17)
| | Чего не хватает?Можно пояснить пожаста.И как его исп? | |
|
|
|
|
|
|
|
для: Эдик12
(13.01.2010 в 00:35)
| | Я ближе к началу тему сказал, как делаю сам.
Через заголовки и редиректы такие вещи решать - имхо, нерационально. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 00:37)
| | Блин, удалил ссылку на скрипт, который разрушает сессию, которая стояла выше header-а, и все заработало.Тока вот почему | |
|
|
|
|
|
|
|
для: Эдик12
(13.01.2010 в 00:46)
| | А если подумать?
Имеем: подключаемый файл, заголовок. Когда файл подключается - вылазит ошибка о том, что заголовки уже отправлены (читать в браузер выведены какие-то символы), а когда файл не подключается - ошибки нет.
Какой можно сделать вывод? | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 00:53)
| | Если мне память не изменяет, то все заголовки должны быть отправлены до старта сессии (соответственно и любых действий с ней), вот какой.
Если вы не уверены, то лучше не гадайте, логика в программировании работает только при безупречном знании предметной области. | |
|
|
|
|
|
|
|
для: @ndry
(13.01.2010 в 20:59)
| | Если вы не уверены, то лучше не гадайте, логика в программировании работает только при безупречном знании предметной области.
Это, я так понимаю, вы сказали сами себе на первую часть поста "Если мне память не изменяет"
Что, по вашему, есть сессии? | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 21:01)
| | Если вы не в курсе, то когда стартует сессия должен быть передан кук с её идентефикатором, куки передаются в хедере. Научитесь читать мануал что-ли, http://ua2.php.net/manual/en/function.session-start.php.
Note: This function will send out several HTTP headers depending on the configuration. See session_cache_limiter() to customize these headers.
|
B если вы знаете PHP на таком уровне, то прошу без ссылок в качестве доказательств не спорить со мной вообще. | |
|
|
|
|
|
|
|
для: @ndry
(13.01.2010 в 21:17)
| | Ок, значит, вот так:
header("Cache-Control: no-cache, must-revalidate"); (1)
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); (2)
сделать уже нельзя, ведь заголовок (1) уже отправлен... Да, вы так считаете? | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 21:34)
| | Зависит от версии PHP, у меня на зенд сервере вообще и такое прокатывает без любых ошибок, хотя не должно (5.3):
sadasd<?php
header('Location: index.php');
?>
|
Раньше уверен, что сессия с хедером должны были идти в строго указанном порядке. | |
|
|
|
|
|
|
|
для: @ndry
(13.01.2010 в 21:45)
| | 5.3 имеет статус бета, нет? Смотрю на код и не верю, что будет работать.
Да будьте уверены, мне то что. Суть в том, что сессию открывать можно после хедера, если это, конечно, не такой хедер:
header('Location: index.php');
exit() | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 21:50)
| | exit зачем вы тут приплели?) Структура заголовка такова, что cookies (если делать всё правильно) должны идти после блока, в котором может быть Location, но это нужно перепроверить в спецификациях, я их слишком давно читал.
Может PHP теперь накапливает заголовки...
> 5.3 имеет статус бета, нет?
Ну и вопрос. =) http://php.net/
Current PHP 5.3 Stable: 5.3.1
Current PHP 5.2 Stable: 5.2.12
|
| |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 21:50)
| | P.S. Причём добавлю, что репортинг ошибок стоит полный, чтобы не подумали. | |
|
|
|
|
|
|
|
для: @ndry
(13.01.2010 в 21:45)
| | Здесь Вы пишете чушь - есть у меня такое подозрение...
Функция header не отправляет заголовки.
Юридически более точно - функция header не отправляет заголовок.
Равно как и прочие родственные (session_start, setcookie и т.п.) функции. | |
|
|
|
|
|
|
|
для: Trianon
(13.01.2010 в 23:36)
| | http://ua2.php.net/manual/en/function.header.php
header() is used to send a raw HTTP header. See the » HTTP/1.1 specification for more information on HTTP headers.
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.
|
Она накопляет заголовки и отправляет их (если код ещё не отравлял никакие заголовки), а в чём заключалась проблема с кукис я уже описал, но это было достаточно давно (ещё до 5ых версий) и я подозреваю, что проблема решена (хотя и не понимаю почему у меня всё работает даже с специально вызваными грубыми ошибками оО).
Ещё следует учти, что заголовок одного типа может быть передан лишь 1 раз (по идее они должны заменять друг друга). | |
|
|
|
|
|
|
|
для: @ndry
(14.01.2010 в 06:05)
| | 1. Заголовок у отклика (как и у запроса) один. То, что называют заголовками, правильно называется поля заголовка
2. Эта функция и иже с ней , конечно is used to send (применяется с целью отправки) , но ни одного поля она не отправляет. Она их готовит. Или как Вы говорите - накапливает.
Но не отправляет в любом случае. Безо всяких если.
Впрочем, она может диагностировать ошибку, если момент подготовки уже упущен.
3. Отправляется заголовок (сформированный из накопленных полей) при первом реальном (т.е. небуферизированном) факте вывода в поток тела отклика.
А за цитирование в теге [code] из-за которого у меня рвет скроллбаром окно, Вы вкупе с разработчиками форума можете разделить луч анального поноса. | |
|
|
|
|
|
|
|
для: Trianon
(14.01.2010 в 06:26)
| | Вы повторили мои же слова прибавил номера пунктиков и более точные формулировки, и? | |
|
|
|
|
|
|
|
для: @ndry
(14.01.2010 в 06:29)
| | Сравнивайте.
Ваше: и отправляет их (если код ещё не отравлял никакие заголовки)
Мое: не отправляет ничего и никогда. | |
|
|
|
|
|
|
|
для: Trianon
(14.01.2010 в 06:30)
| | Даже если код не выводит никакого текста, но ему установили хедер - он будет отправлен. Это я и имел ввиду, заголовок так или иначе будет передан браузеру пользователя. | |
|
|
|
|
|
|
|
для: @ndry
(14.01.2010 в 06:44)
| | Заголовок так или иначе будет передан. Но не в момент вызова функции.
Об этом Вы в частности спорили с neadekvat'ом вчера в (13.01.2010 в 20:59)
старт сессии не приводит к выдаче полей, равно как и не требует отправлять поля до. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 00:17)
| | >Порой так не хватает Fractured#, который может себе позволить прямым текстом сказать то, что думает
>об увиденном.
Нет уж, лучше всегда держаться в рамках культурного общения | |
|
|
|
|
|
|
|
для: tvv123456
(13.01.2010 в 01:26)
| | В тот момент по стечению обстоятельств был близок к бескультурию. | |
|
|
|
|
|
|
|
для: Эдик12
(13.01.2010 в 00:13)
| | Это не правильный подход, в идеале у вас должна выбрасываться ошибка, которую подхватит скрипт и красиво выведет пользователю. | |
|
|
|
|
|
|
|
для: tvv123456
(12.01.2010 в 23:15)
| | по поводу включений не переживай. Любая более-менее сложная прога состоит из множества включений. Если бы включалось что-то типа так: include($_GET['flle']) - базара нет, сунуть можно, все, что угодно. Но если
include('собственноручно_написанный_файл_с_собственного_сайта');
какие могут быть сомнения? | |
|
|
|
|
|
|
|
для: kosta_in_net
(13.01.2010 в 01:26)
| | Да все дело в том что этот 'собственноручно_написанный_файл_с_собственного_сайта может не правильно экслпулатироваться и быть заменен на нужный хакеру файл. Все мои притензии относяться к тому что раз подлкючаешь файл - следи за этим файлом, и я тоже инлкуды использую, но стараюсь это делать только в случаях крайней необходимости | |
|
|
|
|
|
|
|
для: tvv123456
(13.01.2010 в 01:31)
| | Представим каталог /temp
и в нем два файла: /temp/index.php и /temp/news.php
Пусть index.php подключает news.php
Итак, доступ к news.php у взломщика. Но почему нет доступа к index.php?
По-моему, логично, что подключать файлы надо исключительно со своего сайта (относительные пути), и доступ к сайту беречь как зеницу ока - проблем не будет.
Никаких других способов изменить код news.php нет. | |
|
|
|
|
|
|
|
для: neadekvat
(13.01.2010 в 01:34)
| | >По-моему, логично, что подключать файлы надо исключительно со своего сайта
>(относительные пути), и доступ к сайту беречь как зеницу ока - проблем не будет.
Вот про оКо я и имел ввиду. Может немного коряво мысли излагал, просто на виндоус где есть доступ к файлам в корневой директории это плохо, так ведь?.
Думаю тему про инклуды дальше обсуждать не стоит. Я пользуюсь этим только в крайних случаях, разубеждать меня в этом думаю особо не стоит, но если инклуд не обязателен но возможен, какие могут быть причины заставить меня им воспользоваться? | |
|
|
|
|
|
|
|
для: tvv123456
(13.01.2010 в 01:38)
| | Мы просто попытались объяснить тебе, что ты напрасно их опасаешся. А будешь ты использовать или нет - это твое личное дело.Никто не агитирует. Делай как удобно. Но опасаться не стоит ;) | |
|
|
|
|
|
|
|
для: tvv123456
(13.01.2010 в 01:38)
| | > Думаю тему про инклуды дальше обсуждать не стоит. Я пользуюсь этим только в крайних случаях, разубеждать меня в этом думаю особо не стоит, но если инклуд не обязателен но возможен, какие могут быть причины заставить меня им воспользоваться?
У вас продакшн сервер на Windows (впрочем это тоже не проблема)? Или вы защищаетесь сами себя (а вдруг захотите хакнуть localhost)? | |
|
|
|
|
|
|
|
для: tvv123456
(13.01.2010 в 01:31)
| | Сущий бред, в таком случае файл, который исполняется изначально, тоже может быть заменён на другой и лучше всего будет вам не использовать интернет вообще (впрочем и это, в теории, не спасёт). | |
|
|
|