(PHP) Валидация формы + проблемы безопасности

slmark
Дата: 10.07.2006 10:16:33
Здравствуйте!
Ребята, очень нужна помощь...
1.
Есть такой скрипт:
<?
$err='';
if ((empty($title)) or (empty($content))){
$err = 'Форма не заполнена';
}else{ //sql запрос}
?>
<form action="<? echo (@$_SERVER['PHP_SELF'].'?action=newsadd'); ?>" method="post">		
...
<td><input type="text" size="100" name="title"></td>
...
<td><textarea cols="120" rows="20" name="content"></textarea></td>
...
<?if (!empty($err)) echo '<tr><td><font  color="red">'.$err.'</font></td></tr>';?>
</form>	


И при загрузке страницы вскакивает та самая $err. Как сделать так, чтобы форма проверялась при ее сабмите и не проверялась при загрузке страницы?

2. Как запретить юзеру проходить по прямым ссылкам, т.е.
есть линк:
http://localhost/news.php?action=add, и если его ввести в браузере, то минуя аутентификацию, отображается нужная страница, правда выдает ошибку, что переменная $action не определена, но рефреш страницы успешно решает эту проблему.

3. И еще... Может посоветуете какую-нибудь самую простенькую cms (PHP+MySQL) для сайта (добавление, удаление, редактирование записей, аутентификация и т.д.), чтоб в ней я как новичок мог разобраться. Огромное спасибо за помощь!
Пчеловод
Дата: 10.07.2006 10:33:15
1. яваскриптом
2. при обращении к некой странице можешь проверять некий параметр, хранящийся в сессии. например логин пользователя или что-нибудь другое.
чтобы не выдавалась ошибка по поводу неопределенной переменной, поставь проверку наличия параметра ДО проверки переменной $action. если твой параметр отсутствует, значит юзер пришел на страницу напрямую, тогда тихо отправляешь его на главную страницу, например методом
Header("Location: index.php");
exit;
либо копни еще в сторону REFERER (это из области http-заголовков вроде...)
3. не посоветую, ищи в инете, я сам все пишу...
slmark
Дата: 10.07.2006 11:05:14
автор
1. яваскриптом

а не могли бы вы пояснить, как сделать это при помощи PHP (в частности, мой пример)
автор
2. при обращении к некой странице можешь проверять некий параметр, хранящийся в сессии. например логин пользователя или что-нибудь другое.
чтобы не выдавалась ошибка по поводу неопределенной переменной, поставь проверку наличия параметра ДО проверки переменной $action. если твой параметр отсутствует, значит юзер пришел на страницу напрямую, тогда тихо отправляешь его на главную страницу, например методом
Header("Location: index.php");
exit;
либо копни еще в сторону REFERER (это из области http-заголовков вроде...)

если не сложно, опишите, пожалуйста, какой-нибудь элементарный примерчик с комментами.
Огромное спасибо!
4m@t!c
Дата: 10.07.2006 11:13:16
Вы определитесь, что вам нужно либо:
автор
Как сделать так, чтобы форма проверялась при ее сабмите и не проверялась при загрузке страницы?

либо:
автор
а не могли бы вы пояснить, как сделать это при помощи PHP (в частности, мой пример)

Либо и то и другое.
----------------------------------------
Артисты не приехали, приехали цыгане
slmark
Дата: 10.07.2006 11:14:59
Яваскриптом сделать не проблема, но меня больше интересует как это сделать на PHP.
Извините за изначальный некорректный вопрос.
Спасибо!
Пчеловод
Дата: 10.07.2006 11:21:11
было:
<?
$err='';
if ((empty($title)) or (empty($content))){
$err = 'Форма не заполнена';
}else{ //sql запрос}
?>

лучше передавать данные из формы методом ПОСТ, тогда ваш код поменяется на:
<?
$err='';
if (("POST"==$_SERVER["REQUEST_METHOD"]) && (empty($title) or empty($content)) ){
$err = 'Форма не заполнена';
}else{ //sql запрос}
?>

т.е. если данные пришли из формы (методом ПОСТ), то смотрим, заполнены ли все поля. Если страницу загрузили первый раз, то переменную $err даже и не трогаем, она останется пустой...

а по второму вопросу думай сам, решение будет зависеть от условий задачи.
если на некой странице (например, индекс.пхп) ты авторизуешь пользователя и в случае успешной авторизации перенаправляешь на административную страницу (например, админ.пхп) то алгоритм такой:
- на странице индекс.пхп проверяешь логин с паролем
- если логин и пароль правильные в сессию пишешь значение типа $_SESSION["auth"]="ok";
- на странице админ.пхп проверяешь значение переменной сессии $_SESSION["auth"], и если она равна ОК, то показываешь пользователю админскую страницу
- в противном случае делаешь header("location: index.php"); exit;
slmark
Дата: 10.07.2006 11:30:55
Спасибо огромное!
Будем пробовать.

А еще вопрос есть... Чисто технический...
Удаление, добавление, редактирование записей БД. Прорисовка формы и само действие лучше желать на одной странице, либо через форму отсылать данные в отдельный файл?
Спасибо!
Пчеловод
Дата: 10.07.2006 13:40:00
лично я стараюсь делать на одной странице во избежание роста количесва файлов в проекте.
slmark
Дата: 10.07.2006 13:53:35
Вот у меня есть проблема с этим самым одним файлом.
Есть файл - в нем отображается таблица с новостями (из бд), для каждой новости есть кнопка edit.
При ее нажатии пявляется форма как при добавлении новости но с заполненными полями соответственно выбранной новости. Тут же мы ее изменяем, сликаем сабмит, и редиректимся на первоначальную страницу с таблицей.

Отюда посыпались вопросы: стоит ли все это делать на одной странице?
Тогда: (1)select в таблицу, (2)select в форму апдейта новости, (3)update новости. Или лучше разбить на 2 файла - который с таблицей и который с формой апдейта?
Спасибо!
slmark
Дата: 10.07.2006 15:26:32
и может какой примерчик подкинете, как сие чудо реализовать.
Спасибо.