<?
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 - опишу самую популярную уязвимость.
И так к примеру у нас есть запрос с БД для авторизации юзера:
И далее идет отображение того, что вернул запрос.
Теперь злой хацкер в место своего логина воодит вот это:
admin';#
Таким образом запрос выглядит так:
Все что после решетки - комментарий. SQl просто проигнорирует все что после решетки. Вот и получается, что плохой дядя авторизовался под админом, с помощью такой вот штуки.
Теперь что касается mysql_real_escape_string(). Она ищет в строке которую мы ей передаем спец. символы(см. выше) и добавляет к ним слеш(\). Таким образом, после обработки этой функцией, наш запрос выглядит так:
Т.е. SQL, в данном случае, ориентируется по кавычкам
Обрати внимание что теперь переменная $login содержит admin\';#
Так как кавычка(') была экранирована, она теперь не спец символ, а обычный символ.
Для наглядности, поэкспериментируй. Сделай скрипт который из инпута вставляет данные прямо в запрос. И сразу увидишь как можно с этим "играть".
А потом попробуй данные из этого инпута экранировать и увидишь, что уже ничего не можешь сделать.
P.S. Если интересно могу и про htmlspecialchars рассказать.
И так к примеру у нас есть запрос с БД для авторизации юзера:
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=\"Отправить\">
И допиши
И ещё вместо echo "Регистрация прошла успешно";
напиши лучше
При таком раскладе у тебя будет постоянно выводиться "Была допущена ошибка".
Замени в форме кнопку на это
<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 написал(а):
Вот так переделал код:
Теперь надо о защите.
Я добавил md5 что можно ещё вставить? И надо проверки: есть в базе такой логин, емаил; пароль не меньше 5 знаков; в емаил что бы нельзя было вводить "sadfwef", а что бы был вида xpund@xpund.ru.
<?
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';
как этот код правильно замостить в мой скрипт?
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)