[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: защита странички
Druids
Даны 2 странички.
Скажем на 1й страничке регистрации, где мы вводим (логин, пароль, email)
А на второй страничке выбираем персонажа. и завершаем регистрацию.

Как сделать так чтобы на 2ю страничку можно было попасть только с 1й, а прямиком на 2ю нельзя было?
Как прописать условие, что если мы не заполнили все поля на 1й страничке, а уже перешли на вторую, чтобы был возврат обратно на 1ю?

Если что-то не так описал, спросите =)



Спустя 9 минут, 26 секунд (9.07.2011 - 05:03) bulgakov написал(а):
Проверя post с первой страницы если он не заполнен то редирект через header() на первую страницу со второй

Спустя 2 часа, 26 минут, 15 секунд (9.07.2011 - 07:29) Druids написал(а):
как это сделать7 можно пример кода?

Спустя 5 минут, 1 секунда (9.07.2011 - 07:34) YVSIK написал(а):
Цитата
Как сделать так чтобы на 2ю страничку можно было попасть только с 1й, а прямиком на 2ю нельзя было?

вот так тоже пример,
страница закрыта навсегда
на неё могут попасть только региные пользователи
которых определять, он с находятся или куках или с сессиях
нет его, так вообще не пускать

Спустя 5 минут, 19 секунд (9.07.2011 - 07:39) Druids написал(а):
Цитата (YVSIK @ 9.07.2011 - 04:34)
Цитата
Как сделать так чтобы на 2ю страничку можно было попасть только с 1й, а прямиком на 2ю нельзя было?

вот так тоже пример,
страница закрыта навсегда
на неё могут попасть только региные пользователи
которых определять, он с находятся или куках или с сессиях
нет его, так вообще не пускать

Проверка на наличие пользователя в базе не подходит т.к. регистрация ещё не будет в этот момент завершена =(

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

Спустя 2 минуты, 11 секунд (9.07.2011 - 07:41) YVSIK написал(а):
скрипт который перенаправляет на страницу регистрации
такой
<?php   
if(!$_SESSION['loginl'])
{
include'reg.php';
exit();
}

где reg.php и есть страница ; как несложно догадаться ;
регистрации.
а так ?
при регистрации загоняешь его сразу в ссесию
а на второй вот это что вверху

Спустя 33 минуты, 39 секунд (9.07.2011 - 08:15) Игорь_Vasinsky написал(а):
Цитата
Проверя post с первой страницы если он не заполнен то редирект через header() на первую страницу со второй


Спустя 3 часа, 39 минут, 58 секунд (9.07.2011 - 11:55) killer8080 написал(а):
Например так

step1.php
<?php

session_start();

$login = !empty($_SESSION['post_fields']['login']) ? $_SESSION['post_fields']['login'] : '';
$email = !empty($_SESSION['post_fields']['email']) ? $_SESSION['post_fields']['email'] : '';
unset($_SESSION['post_fields']);
$_SESSION['step'] = 1;

?>
<form action="/step2.php" method="post">
<
input type="text" name="login" value="<?php echo $login; ?>" />
<
input type="text" name="email" value="<?php echo $email; ?>" />
<
input type="password" name="pass" />
<
input type="submit" />

</
form>


step2.php
<?php

session_start();
if(empty($_SESSION['step'])){
header("Location:/step1.php");
exit();
}

$post_fields = array('login', 'email', 'pass'); // поля формы обязательные для заполнения

foreach($post_fields as $field){
if(empty($_POST[$field])){
header("Location:/step1.php");
$_SESSION['post_fields'] = $_POST;
exit();
}
}

$_SESSION['step'] = 2;
?>

...

Спустя 29 минут, 38 секунд (9.07.2011 - 12:25) Druids написал(а):
спасибо вам большое wink.gif
использовал метод киллера.

Спустя 38 минут, 51 секунда (9.07.2011 - 13:04) Игорь_Vasinsky написал(а):
Цитата
session_start();
if(empty($_SESSION['step'])){
header("Location:/step1.php");



и что - редирект сработал?????? blink.gif
не должен был.

Спустя 4 минуты, 45 секунд (9.07.2011 - 13:08) killer8080 написал(а):
Цитата (Игорь_Vasinsky @ 9.07.2011 - 13:04)
и что - редирект сработал??????
не должен был.

Почему?

Спустя 2 минуты, 28 секунд (9.07.2011 - 13:11) Игорь_Vasinsky написал(а):
почтому что сессия
и должен быть warning - не возможно отправить заголовок.

Спустя 2 минуты, 21 секунда (9.07.2011 - 13:13) killer8080 написал(а):
Цитата (Игорь_Vasinsky @ 9.07.2011 - 13:11)
и должен быть warning - не возможно отправить заголовок.

С чего бы это smile.gif

Спустя 4 минуты, 9 секунд (9.07.2011 - 13:17) Игорь_Vasinsky написал(а):
blink.gif

Спустя 1 минута, 1 секунда (9.07.2011 - 13:18) Druids написал(а):
метод киллера работает. только что проверил. сделал всё только на примере своего скрипта.

Спустя 59 секунд (9.07.2011 - 13:19) killer8080 написал(а):
session_start() запускает буферизацию, и даже если перед header() сделать echo всё равно сработает редирект! wink.gif



Спустя 2 минуты, 16 секунд killer8080 написал(а):
Цитата (Druids @ 9.07.2011 - 13:18)
метод киллера работает. только что проверил. сделал всё только на примере своего скрипта.

и правильно, я привел всего лишь сам принцип, а в готовом решении нужно ещё проверять логин на уникальность, возможно и E-mail, и прочие проверки.

Спустя 19 минут, 33 секунды (9.07.2011 - 13:39) Druids написал(а):
Цитата (killer8080 @ 9.07.2011 - 10:22)
Цитата (Druids @ 9.07.2011 - 13:18)
метод киллера работает. только что проверил. сделал всё только на примере своего скрипта.

и правильно, я привел всего лишь сам принцип, а в готовом решении нужно ещё проверять логин на уникальность, возможно и E-mail, и прочие проверки.

в моём случае. это проверка есть ли такие логины уже в базе, и проверка правильности ввода.

Спустя 52 минуты, 59 секунд (9.07.2011 - 14:32) quickxyan написал(а):
Druids
ну вообщето еще YVSIK описал сам принцип, но не подкрепил кодом.

а как по мне, то лучше решение bulgakov - не надо сессии включать. юзеру не покажется страница пока он не заполнит все поля, т.е. как по мне намного проще чем с сессиями smile.gif

Спустя 12 минут, 52 секунды (9.07.2011 - 14:45) killer8080 написал(а):
Цитата (quickxyan @ 9.07.2011 - 14:32)
а как по мне, то лучше решение bulgakov

так это по сути оно и есть wink.gif а сессии нужны, чтобы юзер заново не заполнял все поля, если что то пропустил.

Спустя 29 минут, 7 секунд (9.07.2011 - 15:14) quickxyan написал(а):
killer8080
согласен, со всем!
но ТС не уточняет нужно ему ли это smile.gif

ну вобщем я думаю тут уже все ему ясно так, что все хорошо smile.gif

Спустя 32 минуты, 4 секунды (9.07.2011 - 15:46) Druids написал(а):
Решил не создавать новую тему и написать в этой.

как правильно составить вывод из базы в переменную?
делаю проверку на совпадение login и email (2 проверки)
пользователь вводит в поле логин свой логин, в поле мыло своё мыло.
надо проверить есть они или нет. уже часа 2 голову ломаю =(
$sql = "SELECT name FROM USERS WHERE name='".$name."'";
$result = mysql_query ($sql);


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

Спустя 20 минут, 21 секунда (9.07.2011 - 16:06) killer8080 написал(а):
$result = (mysql_num_rows(mysql_query("SELECT name FROM USERS WHERE name='".$name."'")) === 0);

если $result===true, значит логин свободен :)

Спустя 7 минут, 39 секунд (9.07.2011 - 16:14) Druids написал(а):
Цитата (killer8080 @ 9.07.2011 - 13:06)
$result = (mysql_num_rows(mysql_query("SELECT name FROM USERS WHERE name='".$name."'")) === 0);

если $result===true, значит логин свободен :)

а какой из наших вариантов будет лучше?

$sql = "SELECT name FROM USERS WHERE email='".$email."'";
$result = mysql_query ($sql);
if (mysql_num_rows ($result))
{
$error=true;
$errortext .= 'такой email есть в базе';
}


применил такой =) сам догадался :D

Спустя 8 минут, 8 секунд (9.07.2011 - 16:22) killer8080 написал(а):
Цитата (Druids @ 9.07.2011 - 16:14)
а какой из наших вариантов будет лучше?

да в общем то без разницы, хотя выносить запрос в отдельную переменную смысла нет, если только это не нужно для протоколирования ошибок.
$sql = "SELECT name FROM USERS WHERE email='".$email."'";
$result = mysql_query ($sql) or die('Error: '.mysql_error().'<br/>Query: '.$sql);

Спустя 2 часа, 3 минуты, 26 секунд (9.07.2011 - 18:25) quickxyan написал(а):
Druids
что за странная авторизация по логину и мылу?!

поля и имена таблицы в запросах лучше помещать в косые кавычки, например: `table`

Спустя 1 час, 46 минут, 30 секунд (9.07.2011 - 20:12) Druids написал(а):
Цитата (quickxyan @ 9.07.2011 - 15:25)
Druids
что за странная авторизация по логину и мылу?!

поля и имена таблицы в запросах лучше помещать в косые кавычки, например: `table`

авторизация по логину и паролю..
тут весь разговор о регистрации =)

Спустя 8 часов, 34 минуты, 50 секунд (10.07.2011 - 04:47) Druids написал(а):
столкнулся сейчас с такой проблемой подправьте плиз.
При первой регистрации если все поля верны, нас не перебрасывает на 2ю страничку.
И при выполнении 2го сркипта, нас вовзащает на 1. страчку, а должно переидывать на станичку /game.php

скрипт 1.

<?php

session_start();

$login = !empty($_SESSION['post_fields']['name']) ? $_SESSION['post_fields']['name'] : '';
$email = !empty($_SESSION['post_fields']['email']) ? $_SESSION['post_fields']['email'] : '';
unset($_SESSION['post_fields']);
$_SESSION['step'] = 1;

?>
Регистрация<br>
<
form action="" method="post">
Логин:<br>

<
input maxlength="15" type="text" name="name" value=""><br>
Пароль:<br>
<
input maxlength="16" type="password" name="pass"><br>

Повторите пароль:<br>
<
input type="password" name="repass"><br>

E-Mail:<br>
<
input maxlength="32" type="text" name="email" value=""><br>

Пол:<br>
<
input type=radio name=sex value=male checked>Мужской
<input type=radio name=sex value=famale>Женский<br>


ICQ:<br>
<
input maxlength="10" type="int" name="icq" value=""><br>

Станичка в vKontakte:<br>
<
input maxlength="32" type="text" name="vk" value="http://"><br>


Страничка в FaceBook:<br>

<
input maxlength="32" type="text" name="fb" value="http://"><br>
О себе:<br>
<
textarea maxlength="512" name=about [cols=50] [rows=8] wrap=Physical>
</
textarea><br>

<
input type="hidden" name="role" value="user">
<
input type="submit" name=‘reg’ value="Зарегистрироваться">
</
form>



<?php

if ($_POST)
{
//--------------------------------------------------------------
//Получение Ip при регистрации

function GetRealIp()
{
if (!empty($_SERVER['HTTP_CLIENT_IP']))
{
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
{
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else
{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}



//---------------------------------------------------------------
$ip=(getRealIp());
$name = trim($_POST['name']);
$pass = trim($_POST['pass']);
$repass = trim($_POST['repass']);
$email = trim($_POST['email']);
$icq = trim ($_POST['icq']);
$vk = trim ($_POST['vk']);
$fb = trim ($_POST['fb']);
$role = trim ($_POST['role']);
$sex = ($_POST['sex']);
$about = ($_POST['about']);
$date_reg = (date('y.m.d'));
//---------------------------------------------------------------
//Проверка логина на ошибки

$error = false;
$errortext = '';
if (empty($name))
{
$error = true;
$errortext .= 'Логин не введен<br>';
}
if (strlen($name)<5 || strlen($name)>15)
{
$error = true;
$errortext .= 'Длина логина должна быть от 5 до 15 символов<br>';
}
require_once("connect.php");
$sql = "SELECT name FROM USERS WHERE name='".$name."'";
$result = mysql_query ($sql);
if (mysql_num_rows ($result))
{
$error=true;
$errortext .= 'такой логин есть в базе';
}

//---------------------------------------------------------------
//Проверяем пароль на ошибки

if (empty($pass))
{
$error=true;
$errortext .= "Pass не введен<br>";
}

if (strlen($pass)<6 || strlen($pass)>16)
{
$error=true;
$errortext .='Длина Pass должна быть от 6 до 16 символов<br>';
}

if ($pass!=$repass)
{
$error=true;
$errortext .='Пароли не совпадают<br>';
}

//---------------------------------------------------------------
//Проверяем мыло на ошибки

if (empty($email))
{
$error = true;
$errortext .= 'Вы не заполнили поле E-Mail<br>';
}

if(!preg_match("|[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,6}|i", $email))
{
$error = true;
$errortext .= "Не правильно заполнено поле E-Mail. E-mail должен иметь вид user@somehost.com<br>";
}
$sql = "SELECT name FROM USERS WHERE email='".$email."'";
$result = mysql_query ($sql);
if (mysql_num_rows ($result))
{
$error=true;
$errortext .= 'такой email есть в базе';
}
//---------------------------------------------------------------
//Проверка поля about

if (strlen($about)>512)
{
$error = true;
$errortext .= 'Вы ввели слишком много символов в поле "о Себе"';
}
//---------------------------------------------------------------
if ($error)
{
echo($errortext);//Выводим текст ошибок.
}


else
{
$pass = md5($pass);
$sql="INSERT INTO USERS SET name='".$name."', pass='".$pass."', email='".$email."', icq='".$icq."', vk='".$vk."', fb='".$fb."', role='".$role."', ip='".$ip."', sex='".$sex."', date_reg='".$date_reg."', about='".$about."'";
$result = mysql_query ($sql);
echo("<script>location.href='reg2.php'</script>");
// Пропишем заголовки http-запроса, которые нам нужно будет отправить с письмом.

// Версия протокола MIME по которому сформировано сообщение.

$headers = 'MIME-Version: 1.0' . "\r\n";
//Формат представления содержимого сообщения.
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n";
// Указываем отправителя, то бишь my_bomb_site.ru
$headers .= 'From: Администрация Игры' . "\r\n";

//Здесь укажите электронный адрес, куда будут уходить сообщения
$mailto = $email;
$subject = "Подтверждение регистарции на сайте _название сайта_";
$message = 'Для активации аккаунта пройдите по ссылке
<a href=
"http://www.localhost/reg.php?confirmation='
.
$cnfrm_id.'"target="_blank">http://localhost/reg.php?confirmation='.
$cnfrm_id.'</a>'; $message .= 'или откройтее ее в новом окне.';
//Отправляем весточку

if(mail($mailto,$subject,$message,$headers) == false)
{
echo "Не работает почта.";
}

if (!$result)
{
echo "Не удалось выполнить запрос по причине: ".mysql_error();
}


else
{
echo("<script>location.href='reg2.php'</script>");
}
}
}

?>


скрипт 2

<?php

session_start();
if(empty($_SESSION['step'])){
header("Location:/reg.php");
exit();
}

$post_fields = array('name', 'email', 'pass'); // поля формы обязательные для заполнения

foreach($post_fields as $field){
if(empty($_POST[$field])){
header("Location:/reg.php");
$_SESSION['post_fields'] = $_POST;
exit();
}
}

$_SESSION['step'] = 2;
?>

<form enctype="multipart/form-data" method="POST" action="">

<
b>Фото:</b><br />
<
input type="file" name="myfile" style="width:304px; height:18px" id="myfile" />

<
br /><br />
<
input style="height: 35px;" type="submit" value="Добавить фото" name="submit">

</
form>


<?php

// Подключаемься к базе данных

require_once ("connect.php");

//================Настройки============= //
$maxwidth = "300px"; // максимальная ширина картинок на превью
$fotos_dir = "fotos/"; // Директория для фотографий товаров
$foto_name = $fotos_dir.time()."_".basename($_FILES['myfile']['name']); // Полное имя файла вместе с путем
$foto_light_name = time()."_".basename($_FILES['myfile']['name']); // Имя файла исключая путь
$foto_tag = "<img src=\"$foto_name\" border=\"0\">"; // Готовый тэг для вставки картинки на страницу
$foto_tag_preview = "<img src=\"$foto_name\" border=\"0\" width=\"$maxwidth\">"; // Тот же тэг, но для превью

// Текст ошибок

$error_by_mysql = "<span style=\"font: bold 15px tahoma; color: red;\">Ошибка при добавлении данных в базу</span>";
$error_by_file = "<span style=\"font: bold 15px tahoma; color: red;\">Невозможно загрузить файл в директорию. Возможно её не существует</span>";



// Начало
if(isset($_FILES["myfile"]))
{
$myfile = $_FILES["myfile"]["tmp_name"];
$myfile_name = $_FILES["myfile"]["name"];
$myfile_size = $_FILES["myfile"]["size"];
$myfile_type = $_FILES["myfile"]["type"];
$error_flag = $_FILES["myfile"]["error"];

// Если ошибок не было
if($error_flag == 0)
{


$DOCUMENT_ROOT = $_SERVER['DOCMENT_ROOT'];
$upfile = getcwd()."\\fotos\\" . time()."_".basename($_FILES["myfile"]["name"]);
if ($_FILES['myfile']['tmp_name'])
{


//Если не удалось загрузить файл

if (!move_uploaded_file($_FILES['myfile']['tmp_name'], $upfile))
{
echo "$error_by_file";
exit;
}

}

else
{
echo 'Проблема: возможна атака через загрузку файла. ';
echo $_FILES['myfile']['name'];
exit;
}


// После удачной обработки файла, выводим сообщение
echo "<br /><small>Аватар:</small> <br />$foto_tag_preview<br /><br />";



// Заносим путь картинки в базу данных
$q = "INSERT INTO USERS SET avatar='".$foto_name."'";
$query = mysql_query($q);


// Данные успешно внесены в базу данных, выводим сообщение
if ($query == 'true') {
echo "<br /><b>Аватар успешно загружен</b>";
}

// В противном случае, выводим ошибку при добавлении в базу данных
else {
echo "$error_by_mysql";

}

}


elseif ($myfile_size == 0) {
echo "Пустая форма!";
}
}


?>

<form action="/game.php" method="post">
Расса:<br>
<
input type=radio name=rassa value=isterling checked>Истерлинги
<input type=radio name=rassa value=agmar>Агмарцы<br>
<
input type=radio name=rassa value=hobbit>Хоббиты
<input type=radio name=rassa value=gnom>Черные гномы<br>
<
input type="submit" name=‘reg2’ value="Завершить регистрацию">
</
form>

<?php
require_once("connect.php");
$rassa = ($_POST['rassa']);
$sql="INSERT INTO USERS SET rassa='".$rassa."'";
$result = mysql_query ($sql);

?>

Спустя 1 день, 5 часов, 3 минуты, 6 секунд (11.07.2011 - 09:50) killer8080 написал(а):
Druids
в моём примере подразумевалось, что данные с первой страницы будут обрабатываться вторым скриптом, и если запрос пришёл пустым, то кидает назад, на первую. Ну если нужно форму обработать им же, тогда делать надо по другому, выкинь это
$login = !empty($_SESSION['post_fields']['name']) ? $_SESSION['post_fields']['name'] : '';
$email = !empty($_SESSION['post_fields']['email']) ? $_SESSION['post_fields']['email'] : '';
unset($_SESSION['post_fields']);
$_SESSION['step'] = 1;
и это
$post_fields = array('name', 'email', 'pass'); // поля формы обязательные для заполнения

foreach($post_fields as $field){
if(empty($_POST[$field])){
header("Location:/reg.php");
$_SESSION['post_fields'] = $_POST;
exit();
}
}

$_SESSION['step'] = 2;

просто устанавливай $_SESSION['step1'] = 'passed'; если запись добавлена в базу, а во втором проверяй
session_start();
if(empty($_SESSION['step1'])){
header("Location:/reg.php");
exit();
}

ну и несколько замечаний по коду:
1. указан не существующий тип инпута
<input maxlength="10" type="int" name="icq" value="">

2. уязвимость к sql инъекциям, нужно обрабатывать все входные данные перед вставкой в sql запрос
$name = mysql_real_escape_string(trim($_POST['name']));

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

4 $cnfrm_id я так и не понял, откуда она берётся, видимо ты не весь код привёл :)

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

6. редирект лучше делать через http заголовки, в данном случае пользы от JS ноль.

7. если скрипт обрабатывает данные формы, то лучше сначала делать обработку, а потом выводить контент, если надо (в случае редиректа и выводить ничего не придётся)

Ну вот вкратце что заметил.

Спустя 15 часов, 42 минуты, 57 секунд (12.07.2011 - 01:33) YVSIK написал(а):
killer8080вот твоя цитата
Цитата
просто устанавливай $_SESSION['step1'] = 'passed'; если запись добавлена в базу, а во втором проверяй

и код
session_start();
if(empty($_SESSION['step1'])){
header("Location:/reg.php");
exit();
}

да не надо всё в базу кидать
кинул с первой страници в сессию скажем логин
на второй пришел он из сессии , не пришел БРЫСЬ ОТСЮДА пока не дашь что прощу
да хоть все в сессию закинь без разницы
и не надо ничего придумыват .... туды-сюды--обратно просто БРЫСЬ
killer8080 так чем твой код лучше моего ???
<?php   
if(!$_SESSION['loginl'])
{
include'reg.php';
exit();
}

ставь его на второй странице в самом начале всё АЛЕС!!!)

Спустя 7 часов, 45 минут, 47 секунд (12.07.2011 - 09:19) killer8080 написал(а):
Цитата (YVSIK @ 12.07.2011 - 01:33)
да не надо всё в базу кидать

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

Спустя 2 дня, 7 часов, 5 минут, 21 секунда (14.07.2011 - 16:24) Skesh написал(а):
С первой странички передавать значение пременной, любойе, не важно какое, проверяй на второй и все.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.