[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Разбор полётов reg.php
Xpund
<?
include 'config.php';
mysql_connect($host,$user,$pass);
mysql_select_db($db);

$form = "<form action=\"reg.php\" method=\"post\">
<input type=text name=login>
<input type=text name=email>
<input type=password name=pass>
<input type=submit value=Отправить>
</form>"
;

$login = $_POST['login'];
$email = $_POST['email'];
$pass = $_POST['pass'];

$query = mysql_query("INSERT INTO `user` (login, pass, mail)
VALUES ('"
. mysql_real_escape_string($login) . "',
'"
. mysql_real_escape_string($pass) . "',
'"
. mysql_real_escape_string($email) . "')
"
);
if $query
{
echo "Регистрация прошла успешно";
}
else
{
echo "Была допущена ошибка";
}

?>

Вот предыдущюю тему закрыли.
Так щас буду спрашивать.
mysql_real_escape_string - вот эта функция зачем? И почему нельзя без неё?

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



Спустя 5 минут, 9 секунд (1.09.2010 - 19:28) Guest написал(а):
mysql_real_escape_string -- Экранирует специальные символы в строках для использования в выражениях SQL

Спустя 25 секунд (1.09.2010 - 19:28) Winston написал(а):
Цитата
mysql_real_escape_string() вызывает библиотечную функцмю MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " and \x1a.

Эта функция должна всегда (за несколькими исключениями) использоваться для того, чтобы обезопасить данные, вставляемые в запрос перед отправкой его в MySQL.

Если в поле логин напишут <script>alert('lol');</script> то в базу попадет
<script>alert(\'lol\');</script> или другой вредоносный код, спец символы будут экранироваться.
А при выводе лучше писать так echo htmlspecialchars($row['login']);

Спустя 28 минут, 25 секунд (1.09.2010 - 19:57) ApuktaChehov написал(а):
Xpund - опишу самую популярную уязвимость.

И так к примеру у нас есть запрос с БД для авторизации юзера:
SELECT id FROM `users` WHERE login = '$login' AND pass = '$pass':

И далее идет отображение того, что вернул запрос.

Теперь злой хацкер в место своего логина воодит вот это:
admin';#
Таким образом запрос выглядит так:
SELECT id FROM `users` WHERE login = 'admin';#' AND pass = '$pass'


Все что после решетки - комментарий. SQl просто проигнорирует все что после решетки. Вот и получается, что плохой дядя авторизовался под админом, с помощью такой вот штуки.

Теперь что касается mysql_real_escape_string(). Она ищет в строке которую мы ей передаем спец. символы(см. выше) и добавляет к ним слеш(\). Таким образом, после обработки этой функцией, наш запрос выглядит так:
SELECT id FROM `users` WHERE login = 'admin\';#' AND pass = '$pass'

Т.е. SQL, в данном случае, ориентируется по кавычкам

Обрати внимание что теперь переменная $login содержит admin\';#
Так как кавычка(') была экранирована, она теперь не спец символ, а обычный символ.

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

P.S. Если интересно могу и про htmlspecialchars рассказать.

Спустя 1 час, 3 минуты, 27 секунд (1.09.2010 - 21:00) Xpund написал(а):
Спасибо попробую, если что напишу сюда что непонятно.

Спустя 35 минут, 19 секунд (1.09.2010 - 21:36) Xpund написал(а):
http://xpund.ru/reg.php
Вот вообще не открывает страницу. Код сейчас такой
<?
include 'config.php';


$form = "<form action=\"reg.php\" method=\"post\">
<input type=
\"text\" name=\"login\">
<input type=
\"text\" name=\"email\">
<input type=
\"password\" name=\"pass\">
<input type=
\"submit\" value=\"Отправить\">
</form>"
;

$login = $_POST['login'];
$email = $_POST['email'];
$pass = $_POST['pass'];

$query = mysql_query("INSERT INTO `user` (login, pass, mail)
VALUES ('"
. mysql_real_escape_string($login) . "',
'"
. mysql_real_escape_string($pass) . "',
'"
. mysql_real_escape_string($email) . "')
"
);
if $query
{
echo "Регистрация прошла успешно";
}
else
{
echo "Была допущена ошибка";
}

?>

Спустя 7 минут, 33 секунды (1.09.2010 - 21:43) Nord написал(а):
В условии разве можно опускать скобки?

if ($query)
{
echo "Регистрация прошла успешно";
}

Спустя 1 час, 12 минут, 43 секунды (1.09.2010 - 22:56) Winston написал(а):
Xpund
При таком раскладе у тебя будет постоянно выводиться "Была допущена ошибка".
Замени в форме кнопку на это
<input type=\"submit\" name=\"go\" value=\"Отправить\">
И допиши
Свернутый текст
$login = $_POST['login'];
$email = $_POST['email'];
$pass = $_POST['pass'];
$go = $_POST['go'];

if ($go)
{
$query = mysql_query("INSERT INTO `user` (login, pass, mail)
VALUES ('"
. mysql_real_escape_string($login) . "',
'"
. mysql_real_escape_string($pass) . "',
'"
. mysql_real_escape_string($email) . "')
"
);
if ($query)
{
echo "Регистрация прошла успешно";
}
else
{
echo "Была допущена ошибка";
}
}


И ещё вместо echo "Регистрация прошла успешно";
напиши лучше
header("Location: http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);

Спустя 6 часов, 48 минут, 57 секунд (2.09.2010 - 05:45) Xpund написал(а):
Вот так переделал код:
<?
include 'config.php';

?><table>

<
form action=reg.php method=post><br>
<
tr><td>Login:<br></td>
<
td><input type=text name=login><br></td></tr>
<
tr><td>Password:<br></td>
<
td><input type=password name=pass><br></td></tr>
<
tr><td>Password 2:<br></td>
<
td><input type=password name=pass2><br></td></tr>
<
tr><td>E-mail:<br></td>
<
td><input type=text name=email><br></td></tr>
<
tr><td><input type=submit name=go value=Register><br></td></tr>

</
form>
</
table>
<?
$login = $_POST['login'];
$pass2 = $_POST['pass2'];
$email = $_POST['email'];
$pass = $_POST['pass'];
$go = $_POST['go'];

if ($pass != $pass2)
{
echo "Password != Password2";
}
else
{
if ($go)
{
$query = mysql_query("INSERT INTO `user` (login, pass, mail)
VALUES ('"
. mysql_real_escape_string($login) . "',
'"
. mysql_real_escape_string(md5($pass)) . "',
'"
. mysql_real_escape_string($email) . "')
"
);
if ($query)
{
echo "Register good";
}
else
{
echo "Sorry, you don register";
}
}
}

?>

Теперь надо о защите.
Я добавил md5 что можно ещё вставить? И надо проверки: есть в базе такой логин, емаил; пароль не меньше 5 знаков; в емаил что бы нельзя было вводить "sadfwef", а что бы был вида xpund@xpund.ru.

Спустя 11 часов, 16 минут, 34 секунды (2.09.2010 - 17:01) Xpund написал(а):
Ну что кто может помочь?

Спустя 4 минуты, 24 секунды (2.09.2010 - 17:06) Winston написал(а):
Цитата (Xpund @ 2.09.2010 - 04:45)
И надо проверки: есть в базе такой логин, емаил;

Я делал так: Доставал все логины из базы, и записывал их в массив, а потом с помощью in_array проверял есть ли в массиве такой логин.
Цитата (Xpund @ 2.09.2010 - 04:45)
пароль не меньше 5 знаков

if (strlen($pass) < 5)
echo 'error';

Цитата (Xpund @ 2.09.2010 - 04:45)
в емаил что бы нельзя было вводить "sadfwef", а что бы был вида xpund@xpund.ru.

Просмотры конкурс на валидатор, там есть проверки мыла.

Спустя 1 час, 53 минуты, 19 секунд (2.09.2010 - 18:59) Xpund написал(а):
PHPprogramer
if (strlen($pass) < 5)
echo 'error';
if (strlen($login) < 5)
echo 'error';
как этот код правильно замостить в мой скрипт?

Спустя 25 минут, 8 секунд (2.09.2010 - 19:24) Winston написал(а):
Попробуй так:
Свернутый текст

<?php
$login = !empty($_POST['login']) ? $_POST['login'] : NULL;
$pass = !empty($_POST['pass']) ? $_POST['pass'] : NULL;
$pass2 = !empty($_POST['pass2']) ? $_POST['pass2'] : NULL;
$email = !empty($_POST['email']) ? $_POST['email'] : NULL;
$go = isset($_POST['go']) ? $_POST['go'] : NULL;

if ($pass != $pass2)
echo "Password != Password2";

else
{
if (strlen($login) < 4 || strlen($pass) < 5)
echo 'You have a short login or pass !';
elseif ($go && $login && $pass && $pass2 && $email)
{
$query = mysql_query("INSERT INTO `user` (login, pass, mail)
VALUES ('"
. mysql_real_escape_string($login) . "',
'"
. md5($pass) . "',
'"
. mysql_real_escape_string($email) . "')
"
);
if ($query)
{
header('Location: http://'. $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
exit;
}
else
echo "Sorry, you don register";
}
}

?>


_____________
минус, конечно, иногда полезен, но плюс мне нравиться больше :)
Женский журнал - Жена сказала раскрутить сайт любой ценой (Sorry)
Быстрый ответ:

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