Всем привет. Передо мной стоит задача найти проблемные синтаксические/логические проблемы в небольшом говнокоде. Прошу сердечно указать и пояснить. Сам кое-что где-то кое-как нашел, но этого мало. Код (Text): <?php session_start(); require_once 'login.php'; $connect = mysql_connect($db_hostname,$db_username,$db_password) or die (mysql_error()); mysql_select_db($db_database); if(!empty($_POST['register'])) { $username = $_POST["username"]; $pass = $_POST["pass"]; $r_pass = $_POST ["r_pass"]; if ($pass == $r_pass){ $query = mysql_query("INSERT INTO user VALUES ('','$username','$pass')") or die (mysql_error()); } else { die("пароли должны совпадать"); } } if (isset($_POST['enter'])){ $e_login=$_POST["e_username"]; $e_pass=$_POST["e_pass"]; $query=mysql_query("SELECT * FROM user WHERE user = '$e_login'"); $user_data= mysql_fetch_array($query); if ($user_data ['pass']== $e_pass){ echo "vi zalogineni"; $_SESSION['user'] = $e_login; } else { echo "ne verniy parol"; } } ?> И обработчик: Код (Text): <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <form method ="POST" action="index.php"> <input type="text" name="username" placeholder="Username" required /> <br> <input type="text" name="pass" placeholder="Password" required="Важно для заполнения" /> <br> <input type="text" name="r_pass" placeholder="RE Password" required="еще важне для заполнения" /> <br> <input type="submit" name="register" value="reg" /> </form> </head> <?php if(isset($_SESSION['user'])) { echo "vi zaregestrirovani"; } else { echo ' <form method ="POST" action="index.php"> <input type="text" name="e_username" placeholder="Username" required /> <br> <input type="text" name="e_pass" placeholder="Password" required="Важно для заполнения" /> <br> <input type="submit" name="enter" value="enter" /> </form> '; } ?> UP: код не мой, хотя я далеко не ушел.
не надо так делать, не надо всем мимокрокодилам говорить, в каком столбце какой таблицы какие данные не так зашли. Добавлено спустя 46 секунд: не надо так делать, будешь похакан в два счета. Да да, те самые SQL-инъекции. Добавлено спустя 1 минуту 27 секунд: не надо так делать, не надо всю страницу схлопывать, вместе с формой и тд, ради того, чтобы показать одну надпись.
а что скажете про ниже выложенные фрагменты кода? мне кажется, или $_POST['enter'] попросту не будет существовать, для его существования строка должна было проходить через функцию eval? Код (Text): if(isset($_SESSION['user'])) { echo "vi zaregestrirovani"; } else { echo ' <form method ="POST" action="index.php"> <input type="text" name="e_username" placeholder="Username" required /> <br> <input type="text" name="e_pass" placeholder="Password" required="Важно для заполнения" /> <br> <input type="submit" name="enter" value="enter" /> </form> '; } и Код (Text): if (isset($_POST['enter'])){ $e_login=$_POST["e_username"]; $e_pass=$_POST["e_pass"]; $query=mysql_query("SELECT * FROM user WHERE user = '$e_login'"); $user_data= mysql_fetch_array($query); if ($user_data ['pass']== $e_pass){ echo "vi zalogineni"; $_SESSION['user'] = $e_login; } else { echo "ne verniy parol"; } }
не надо так делать, не надо хранить пароли в открытом виде в БД. Добавлено спустя 2 минуты 6 секунд: ооо, да ты сам несколько плаваешь. Доучивайся. В общем там все плохо. Честно. Перечеркни и делай заново. Для сдачи задачки слепому преподу - прокатит. В реальной жизни или с преподом, которому не плевать, хлебнешь горя с таким кодом.
верю, что все плохо, но код не мой - переделывать нечего и да, - я тоже очень сильно плаваю, но вот пытаюсь вместе с вами разобраться, так сказать, походу дела
А чем это плохо? Понятно, что если кто-то получит доступ к БД, то он сможет подсмотреть пароли всех пользователей. Но раз уж он получил этот доступ, то что ему мешает выполнить "UPDATE" и вбить желаемый пароль?
Чтобы если доступ есть только для чтения, усложнить использование паролей. Хешировать пароли нужно с солью.
99% пользователей юзают один-два пароля на все свои аккаунты и почты. Смекаешь? Если тебя похакали и вскрыли твой сайт, то ты уже в заднице. Но тащить туда за собой пользователей, подставляя их сдачей паролей не нужно. Не нужно так делать. Обратная сторона медали - себя не надо вводить в искушение посмотреть чужие пароли и подергать их почты, соцаккаунты, steam, paypal... Кроме того - ты вот весь честный и не будешь это делать. А ты уверен во всех своих администраторах будешь? Даже не имея доступа к БД, админ на сайте сможет пофиксить профиль участника, вбить ему свое мыло и получить на него пароль из твоей БД, если, конечно, ты не сделаешь восстановление пароля по ссылке, без раскрытия такового, в отличие от некоторых сайтов.
А при аутентификации пользователя по той же схеме с той же солью делать хэш от того, что тебе сам пользователь даст и сравнивать с тем хэшем, который лежит в БД. Вуаля - ты пароли не хранишь, но, при этом, однозначно идентифицируешь пользователя.
Думаю достаточно оставить это здесь http://php.ru/manual/security.database.sql-injection.html Немножко некрофилии: http://php.ru/manual/security.magicquotes.html Ну и про пароли: http://habrahabr.ru/post/139974/ Ещё автору рекомендую заглянуть сюда http://php.ru/manual/intro.pdo.html