За последние 24 часа нас посетили 62730 программистов и 1677 роботов. Сейчас ищут 984 программиста ...

Ищем проблемы в говнокоде

Тема в разделе "PHP для новичков", создана пользователем iNEEdhLw, 22 дек 2014.

  1. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    Всем привет. Передо мной стоит задача найти проблемные синтаксические/логические проблемы в небольшом говнокоде. Прошу сердечно указать и пояснить. Сам кое-что где-то кое-как нашел, но этого мало.
    Код (Text):
    1. <?php
    2. session_start();
    3. require_once 'login.php';
    4.  
    5. $connect = mysql_connect($db_hostname,$db_username,$db_password) or die (mysql_error());
    6. mysql_select_db($db_database);
    7.  
    8. if(!empty($_POST['register'])) {
    9. $username = $_POST["username"];
    10. $pass = $_POST["pass"];
    11. $r_pass = $_POST ["r_pass"];
    12. if ($pass == $r_pass){
    13. $query = mysql_query("INSERT INTO user VALUES ('','$username','$pass')") or die (mysql_error());
    14. }
    15.  
    16. else {
    17. die("пароли должны совпадать");
    18. }
    19. }
    20.  
    21. if (isset($_POST['enter'])){
    22.  
    23. $e_login=$_POST["e_username"];
    24. $e_pass=$_POST["e_pass"];
    25.  
    26. $query=mysql_query("SELECT * FROM user WHERE user = '$e_login'");
    27. $user_data= mysql_fetch_array($query);
    28.  
    29. if ($user_data ['pass']== $e_pass){
    30. echo "vi zalogineni";
    31.  
    32.  
    33. $_SESSION['user'] = $e_login;
    34. }
    35. else {
    36. echo "ne verniy parol";
    37. }
    38.  
    39. }
    40.  
    41.  
    42. ?>
    И обработчик:
    Код (Text):
    1.  
    2. <head>
    3.  
    4. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    5.  
    6. <form method ="POST" action="index.php">
    7.  
    8. <input type="text" name="username" placeholder="Username" required /> <br>
    9. <input type="text" name="pass" placeholder="Password" required="Важно для заполнения" /> <br>
    10. <input type="text" name="r_pass" placeholder="RE Password" required="еще важне для заполнения" /> <br>
    11. <input type="submit" name="register" value="reg" />
    12.  
    13. </form>
    14. </head>
    15.  
    16. <?php
    17.  
    18. if(isset($_SESSION['user']))
    19. {
    20. echo "vi zaregestrirovani";
    21. }
    22. else
    23.  
    24. {
    25.  
    26. echo '
    27. <form method ="POST" action="index.php">
    28.  
    29. <input type="text" name="e_username" placeholder="Username" required /> <br>
    30. <input type="text" name="e_pass" placeholder="Password" required="Важно для заполнения" /> <br>
    31. <input type="submit" name="enter" value="enter" />
    32.  
    33. </form> ';
    34. }
    35. ?>
    UP: код не мой, хотя я далеко не ушел.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    mysql_* устарели
    sql инъекции возможны
    нет форматирования кода
     
  3. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    про mysql_* я уже подметил, а вот что за sql-инъекции? можно подробнее? спасибо :)
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Да можно по подробней: вбей в поисковую машину неизвестные слова
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    не надо так делать, не надо всем мимокрокодилам говорить, в каком столбце какой таблицы какие данные не так зашли.

    Добавлено спустя 46 секунд:
    не надо так делать, будешь похакан в два счета. Да да, те самые SQL-инъекции.

    Добавлено спустя 1 минуту 27 секунд:
    не надо так делать, не надо всю страницу схлопывать, вместе с формой и тд, ради того, чтобы показать одну надпись.
     
  6. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    а что скажете про ниже выложенные фрагменты кода?
    мне кажется, или $_POST['enter'] попросту не будет существовать, для его существования строка должна было проходить через функцию eval?
    Код (Text):
    1. if(isset($_SESSION['user']))
    2. {
    3. echo "vi zaregestrirovani";
    4. }
    5. else
    6.  
    7. {
    8.  
    9. echo '
    10. <form method ="POST" action="index.php">
    11.  
    12. <input type="text" name="e_username" placeholder="Username" required /> <br>
    13. <input type="text" name="e_pass" placeholder="Password" required="Важно для заполнения" /> <br>
    14. <input type="submit" name="enter" value="enter" />
    15.  
    16. </form> ';
    17. }
    и
    Код (Text):
    1. if (isset($_POST['enter'])){
    2.  
    3. $e_login=$_POST["e_username"];
    4. $e_pass=$_POST["e_pass"];
    5.  
    6. $query=mysql_query("SELECT * FROM user WHERE user = '$e_login'");
    7. $user_data= mysql_fetch_array($query);
    8.  
    9. if ($user_data ['pass']== $e_pass){
    10. echo "vi zalogineni";
    11.  
    12.  
    13. $_SESSION['user'] = $e_login;
    14. }
    15. else {
    16. echo "ne verniy parol";
    17. }
    18.  
    19. }
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    не надо так делать, не надо хранить пароли в открытом виде в БД.

    Добавлено спустя 2 минуты 6 секунд:
    ооо, да ты сам несколько плаваешь. Доучивайся.

    В общем там все плохо. Честно. Перечеркни и делай заново. Для сдачи задачки слепому преподу - прокатит. В реальной жизни или с преподом, которому не плевать, хлебнешь горя с таким кодом.
     
  8. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    верю, что все плохо, но код не мой - переделывать нечего и да, - я тоже очень сильно плаваю, но вот пытаюсь вместе с вами разобраться, так сказать, походу дела :)
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Мопед не мой, я только объяву разместил, да.
    Пусть автор кода и ищет косяки раз так.
     
  10. ciamon

    ciamon Новичок

    С нами с:
    19 дек 2014
    Сообщения:
    34
    Симпатии:
    0
    А чем это плохо? Понятно, что если кто-то получит доступ к БД, то он сможет подсмотреть пароли всех пользователей. Но раз уж он получил этот доступ, то что ему мешает выполнить "UPDATE" и вбить желаемый пароль?
     
  11. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Чтобы если доступ есть только для чтения, усложнить использование паролей. Хешировать пароли нужно с солью.
     
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    99% пользователей юзают один-два пароля на все свои аккаунты и почты. Смекаешь? Если тебя похакали и вскрыли твой сайт, то ты уже в заднице. Но тащить туда за собой пользователей, подставляя их сдачей паролей не нужно. Не нужно так делать. Обратная сторона медали - себя не надо вводить в искушение посмотреть чужие пароли и подергать их почты, соцаккаунты, steam, paypal... Кроме того - ты вот весь честный и не будешь это делать. А ты уверен во всех своих администраторах будешь? Даже не имея доступа к БД, админ на сайте сможет пофиксить профиль участника, вбить ему свое мыло и получить на него пароль из твоей БД, если, конечно, ты не сделаешь восстановление пароля по ссылке, без раскрытия такового, в отличие от некоторых сайтов.
     
  13. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    расскажите, а как в таком случае нужно хранить пароли?.. шифровать их как-то?
     
  14. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    хэшировать
     
  15. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    И солить хэши!
     
  16. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А при аутентификации пользователя по той же схеме с той же солью делать хэш от того, что тебе сам пользователь даст и сравнивать с тем хэшем, который лежит в БД. Вуаля - ты пароли не хранишь, но, при этом, однозначно идентифицируешь пользователя.
     
  17. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
  18. iNEEdhLw

    iNEEdhLw Новичок

    С нами с:
    22 окт 2014
    Сообщения:
    414
    Симпатии:
    0
    о, благодарочка за корм :)