За последние 24 часа нас посетили 62392 программиста и 1758 роботов. Сейчас ищут 880 программистов ...

Для тех кто учился по Люк Веллинг и Лара Томсон

Тема в разделе "PHP для новичков", создана пользователем Darken, 19 фев 2009.

  1. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    Уже раза 4 встречал в книге опечатку, например такое категорически отказалось у меня работать

    Код (Text):
    1.  
    2. $result = mysql_query("insert into user values ('$usermame', password('$password'), '$email')");
    сделал по своему - заработало

    Код (Text):
    1.  
    2. $query ="INSERT INTO `user` ( `username` , `passwd` , `email`)
    3.       VALUES ('$username', '$password', '$email')";
    4. $result = mysql_query($query);
    Ну сейчас не об этом.... дошел до раздела в котором создается форма авторизации пользователя, приведенный код не работает (вернее работает не так как хотелось бы).... может я что-то упустил или в книге не так как должно быть?

    Файл проверяющий имя и пароль, если они верны регистрирующий переменную сеанса
    Код (Text):
    1.  
    2. <?php
    3. require_once ('bookmark_fns.php');
    4. session_start();
    5.  
    6. $username=$HTTP_POST_VARS['username'];
    7. $passwd=$HTTP_POST_VARS['passwd'];
    8.  
    9. //print_r($_POST);
    10. print_r($_SESSION);
    11.  
    12. if ($username && $passwd)
    13.     {
    14.     if (login($username, $passwd))
    15.       {
    16.     $HTTP_SESSION_VARS['valid_user'] = $username;
    17.         }
    18.     else
    19.       {
    20.     do_html_header('Проблема');
    21.         echo 'Вход в систему невозможен';
    22.         do_html_url('login.php','Вход');
    23.         do_html_footer();
    24.         exit;
    25.         }
    26.     }
    27.  
    28. do_html_header('Домашняя страница');
    29. check_valid_user();
    30.  
    31. ?>
    Есть функции во включаемом файле

    Код (Text):
    1.  
    2.  
    3. function login($username, $password)
    4.     {
    5.     $conn = db_connect();
    6.     if(!$conn)
    7.       return 0;
    8.     $query = "SELECT * FROM `user` WHERE `username`='$username' and `passwd`='$password'";
    9.     $result = mysql_query($query);
    10.  
    11.     if (!$result)
    12.       return 0;
    13.      
    14.     if (mysql_num_rows($result)>0)
    15.       return 1;
    16.     else
    17.       return 0;
    18.     }
    19.  
    20. function check_valid_user()
    21.     {
    22.     global $valid_user;
    23.     if (session_is_registered(valid_user))
    24.       {
    25.         echo "Вы вошли как $valid_user";
    26.         }
    27.     else
    28.       {
    29.     do_html_header('Проблема');
    30.         echo 'Вы не вошли в систему';
    31.         do_html_url('login.php','Вход');
    32.         do_html_footer();
    33.         exit;
    34.         }
    35.     }
    Ну не хочет он у меня выводить echo "Вы вошли как $valid_user"; хотя при проверке пишет, что переменная имеет значенее
     
  2. karakh

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

    С нами с:
    11 дек 2007
    Сообщения:
    1.344
    Симпатии:
    0
    а почему session_is_registered, а не isset($_SESSION['valid_user']) ?
    Кстати, под session_is_registered(valid_user) имеется в виду session_is_registered($valid_user) или session_is_registered('valid_user') ?
     
  3. alexeurodnepr

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

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    разбирал эту книгу, тут
    $result = mysql_query("insert into user values ('$usermame', password('$password'), '$email')");

    нужно было password('".$password."') если не ошибаюсь...
     
  4. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    зачем вообще городить password('".$password."') - и что в данном случае значит первое password?
    не проще сделать как я сделал?
     
  5. unicross

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

    С нами с:
    14 янв 2009
    Сообщения:
    194
    Симпатии:
    0
    PHP:
    1. <?php
    2. $usermame = 'nik';
    3. $password = '123';
    4. $email = [email='hg@ghhjg.ru]'hg@ghhjg.ru[/email]';
    5. if ($db = @mysql_connect('localhost', 'root', '')) {
    6.   mysql_select_db('testDB');
    7.   mysql_query('SET NAMES cp1251');
    8.   mysql_query("insert into user values ('$usermame', password('$password'), '$email')") or die(mysql_error());
    9.   mysql_close($db);
    10. }
    11. else {
    12.   echo 'Не удалось установить подключение к базе данных';
    13. }
    14. ?>
    Отработало без проблем ...

    А вот за такое надо руки оторвать... При таких введенных в форму данных, я получу полный доступ в вашу систему!!!
    PHP:
    1. $_POST['username'] = "' OR ''='";
    2. $_POST['passwd'] = "' OR ''='";
    Прежде чем вставлять данные полученные из формы необходимо обработать их функцией mysql_real_escape_string() внутри функции login().

    А все таки книга уже устарела
    так уже лучше не писать. Лучше так:
    PHP:
    1. $_SESSION['valid_user'] = $username;
    Это то же не айс
    Лучше так
    PHP:
    1. if (isset($_SESSION['valid_user']))
     
  6. unicross

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

    С нами с:
    14 янв 2009
    Сообщения:
    194
    Симпатии:
    0
    Встроенная функция MySQL для шифрования паролей
    Хранить пароль не зашифрованным не айс...
     
  7. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    в книге именно if (session_is_registered("valid_user")) , я пробовал по-разгому, результата все равно не получил...
     
  8. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    unicross
    спасибо, я только учусь, обязательно учту

    сделал так - заработало
    Код (Text):
    1.  
    2.  
    3. function check_valid_user()
    4.     {
    5.     global $valid_user;
    6.     if (isset($_SESSION['valid_user']))
    7.       {
    8.       echo 'Вы вошли как ';
    9.         echo $_SESSION['valid_user'];
    10.         }
    Расскажите подробнее пожалуйста про $_POST['username'] = "' OR ''='"; что и перед какими кавычками писать и т.д., боюсь в запятых запутаюсь
     
  9. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    понял, спасиб попробую поэксперементировать

    странно, значит и при запросе имя пользователя и пароля при входе необходимо использовать функцию password, в книге ее нету (((
     
  10. unicross

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

    С нами с:
    14 янв 2009
    Сообщения:
    194
    Симпатии:
    0
    При таких введенных данных получится такой запрос
    Код (Text):
    1. SELECT * FROM user WHERE username='' OR ''='' AND passwd='' OR ''=''
    Условие OR ''='' всегда истинно, по этой причине войти можно под любым логином и паролем...
    А так проблем не будет
    PHP:
    1.  
    2.    $username = mysql_real_escape_string($username);
    3.    $password = mysql_real_escape_string($password);
    4.    $query = "SELECT * FROM `user` WHERE `username`='$username' and `passwd`='$password'";
    5.    $result = mysql_query($query);
    6.  
     
  11. alexeurodnepr

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

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    не просто, как-раз из-за этого ты и не можешь зайти в систему, т.к.
    1. password() - зашифровывает пароль
    2. я помню книгу, там если ты уберешь password('$password') и поставить $password без функции шифрования то твой пароль будет не зашифрован а когда ты входишь проверка идет именно по шифрованию

    ты вводишь пароль он зашифр, и сравнивается с тем, что в бд ну а теперь подумай...) что с чем оно будет его сравнивать...
     
  12. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    спасиб, я так и сделал, только еще password использовал т.к. если не использовать, парольне совпадает

    Код (Text):
    1. query = "SELECT * FROM `user` WHERE `username`='$username' and `passwd`=password('$password')";
     
  13. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    вот такую гадость выдает при использовании mysql_real_escape_string
     
  14. unicross

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

    С нами с:
    14 янв 2009
    Сообщения:
    194
    Симпатии:
    0
    Покажите код куда вставили функцию mysql_real_escape_string

    Функцию можно использовать только после подключения к базе данных!!!
     
  15. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    учитывая описание функции (mysql_real_escape_string - мнемонизирует специальные символы в строке для использования в операторе SQL с учётом текущего набора символов/charset соединения.) я подумал, что ею полезно обрабатывать данные из формы до записи их в базу при регистрации. В результате кода предвтавленного ниже, регистрация проходит, но в базу записывается пустая строка

    Код (Text):
    1.  
    2.  
    3. <?php
    4. function registr($username, $email, $password)
    5.     {
    6.     $username = mysql_real_escape_string($username);
    7.   $password = mysql_real_escape_string($password);
    8.   $email = mysql_real_escape_string($email);
    9.     //подключаемся к БД
    10.     $conn = db_connect();
    11.     if (!$conn)
    12.         return 'Невозможно подключиться к серверу БД';
    13.     //Проверить уникально ли имя пользователя
    14.     $result = mysql_query("select * from user where username='$username'");
    15.     if(!$result)
    16.       return 'Не удалось выполнить запрос к БД';
    17.     if (mysql_num_rows($result)>0)
    18.       return 'Это имя пользователя уже занято';
    19.     //Если все гуд, сохранить информацию в БД
    20.     //$result = mysql_query("insert into user values ('$usermame', password('$password'), '$email')");
    21.         $query ="INSERT INTO `user` ( `username` , `passwd` , `email`)
    22.                                                   VALUES ('$username', password('$password'), '$email')";
    23.     $result = mysql_query($query);
    24.  
    25.  if (!$result)
    26.       return 'Невозможно произвести запись в БД - попытайтесь позже.';
    27.  
    28.     return true;
    29.     }
    если же функцию добавить в login

    Код (Text):
    1.  
    2.  
    3. function login($username, $password)
    4.     {
    5.     $username = mysql_real_escape_string($username);
    6.   $password = mysql_real_escape_string($password);
    7.     $conn = db_connect();
    8.     if(!$conn)
    9.       return 0;
    10.     $query = "SELECT * FROM `user` WHERE `username`='$username' and `passwd`=password('$password')";
    11.     $result = mysql_query($query);
    12.  
    13.     if (!$result)
    14.       return 0;
    15.      
    16.     if (mysql_num_rows($result)>0)
    17.       return 1;
    18.     else
    19.       return 0;
    20.     }
    вылазит ряд ошибок, описанных выше
     
  16. unicross

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

    С нами с:
    14 янв 2009
    Сообщения:
    194
    Симпатии:
    0
     
  17. unicross

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

    С нами с:
    14 янв 2009
    Сообщения:
    194
    Симпатии:
    0
    PHP:
    1.    //подключаемся к БД
    2.    $conn = db_connect();
    3.    if (!$conn)
    4.       return 'Невозможно подключиться к серверу БД';
    5.    $username = mysql_real_escape_string($username);
    6.   $password = mysql_real_escape_string($password);
    7.   $email = mysql_real_escape_string($email);
    PHP:
    1.    $conn = db_connect();
    2.    if(!$conn)
    3.      return 0;
    4.    $username = mysql_real_escape_string($username);
    5.   $password = mysql_real_escape_string($password);
     
  18. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    а вот про это никто не говорил :D

    огромное спасибо за терпение, простите нуба если чего не так 8) Москва она ведь тоже не сразу строилась.... насяльника
     
  19. unicross

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

    С нами с:
    14 янв 2009
    Сообщения:
    194
    Симпатии:
    0
    Я вам даже пример написал... :D
     
  20. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    А вообще какими функциями вы пользуетесь для обрабатывания данных от пользователя? Я читал про добавления слешей, про их убирание перед выводом, про обрезание пробелов и т.д... какой способ лучше применять в современных условиях? Может стоит все данные проверять через регулярки или достаточно встроенных функций?
     
  21. alexeurodnepr

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

    С нами с:
    18 июл 2008
    Сообщения:
    244
    Симпатии:
    0
    1. по поводу регулярок - их стоит применять только тогда когда стоит :) , когда нужно проверить на правильность ввода и т.д.
    2. функции обрезки пробелов trim
    3. addslashes - экранирует, stripslashes - снимает экран
    4. htmlspecialchars - преобразует специальные символы html
     
  22. Darken

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

    С нами с:
    2 фев 2009
    Сообщения:
    38
    Симпатии:
    0
    это я знаю, но вот лично вы когда и какие используете? в книге, по которой я занимаюсь рекомендуют использовать trim, addslashes и stripslashes, но вот во вчерашнем разговоре мне рекомендовали использовать mysql_real_escape_string перед записью переменных в базу.... в голове некая каша, что и в каких случаях лучше использовать?
     
  23. unicross

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

    С нами с:
    14 янв 2009
    Сообщения:
    194
    Симпатии:
    0
    Для экранирования для базы - mysql_real_escape_string
    В остальных случаях читайте у alexeurodnepr.
    Надеюсь не после вывода из базы данных...