1 Востаннє редагувалося olekca01 (10.02.2016 18:25:17)

Тема: Підскажіть будь ласка

При вході на один акаунт скрипт працює, а вже на інший ввійти неможливо!
Видає "Неправильний логін", але користувач з таким логіном зареєстрований!
ось скрипт

<?php
include('db.php');
mysql_select_db('progress',$db);
$result = mysql_query('SELECT * FROM users');
$myrow = mysql_fetch_array($result);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="style/css" href="/style.css">
<title>Вхід на сайт</title>
</head>
<body class="login_body">

    <div class="login">
        <h1 align="center">Вхід на сайт</h1>
        <form action="/login.php" method="post" name="login" align="center">
        <input name="login" type="text" size="20" placeholder="Логін" tabindex="1" autofocus required><br>
        <input name="password" type="password" size="20" placeholder="Пароль" tabindex="1" required><br>
        <input name="submit"  class="submit" type="submit" value="Вхід" size="20">       
        </form>
        <a class="link_login" href="/register.php" >Ще не маєте акаунта?</a>

        <?php
       
        if(isset($_POST['login'])){
            $login = $_POST['login'];
            $password = $_POST['password'];
            $password = md5($password);
                if($login == $myrow['login']){   
                $result_1 = mysql_query("SELECT * FROM users WHERE login='$login'",$db);
                $myrow_1 = mysql_fetch_array($result_1);
               
                    if($password == $myrow_1['password']){
                        echo "Успішний вхід";
                       
                    }
                    else{echo "Пароль не правильний";}
                }
                else{echo "<center><b><i>Неправильний логін!</i></b></center>";}
                           
        }
        exit;
        ?>
    </div>

</body>
</html>

Програміст - це не професія.
Це образ мислення.

2

Re: Підскажіть будь ласка

$result = mysql_query('SELECT * FROM users');
$myrow = mysql_fetch_array($result);

Спочатку ви вибириєте всіх користувачів, але в mysql_fetch_array записується лише перший рядок з бд.

 if($login == $myrow['login']){  

Ви звіряєте логін з форми тільки з першим логіном в бд.
Вся логіка авторизації у вас крива.

Крім того,

$login = $_POST['login'];

Вразливість. SQL Injection

=)
Подякували: olekca01, mike, 221VOLT, leofun014

3

Re: Підскажіть будь ласка

Точно не звернув увагу! То мені через цикл чи як?

Програміст - це не професія.
Це образ мислення.

4

Re: Підскажіть будь ласка

Все вийшло!

Програміст - це не професія.
Це образ мислення.

5

Re: Підскажіть будь ласка

Для тих кому цікаво во код:

<?php 
include('db.php');
mysql_select_db('progress',$db);
$result = mysql_query('SELECT * FROM users');
$myrow = mysql_fetch_array($result);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="style/css" href="/style.css">
<title>Вхід на сайт</title>
</head>
<body class="login_body">

    <div class="login">
        <h1 align="center">Вхід на сайт</h1>
        <form action="/login.php" method="post" name="login" align="center">
        <input name="login" type="text" size="20" placeholder="Логін" tabindex="1" autofocus required><br>
        <input name="password" type="password" size="20" placeholder="Пароль" tabindex="1" required><br>
        <input name="submit"  class="submit" type="submit" value="Вхід" size="20">        
        </form>
        <a class="link_login" href="/register.php" >Ще не маєте акаунта?</a>

        <?php
        while($myrow = mysql_fetch_array($result)){
        if(isset($_POST['login'])){
            $login = $_POST['login'];
            $password = $_POST['password'];
            $password = md5($password);
                if($login == $myrow['login']){    
                $result_1 = mysql_query("SELECT * FROM users WHERE login='$login'",$db);
                $myrow_1 = mysql_fetch_array($result_1);
                
                    if($password == $myrow_1['password']){
                        echo "Успішний вхід";
                        
                    }
                    else{echo "Пароль не правильний";}
                }
                else{echo "<center><b><i>Неправильний логін!</i></b></center>";}
                            
        }
        }
        exit;
        ?>
    </div>

</body>
</html>
Програміст - це не професія.
Це образ мислення.

6

Re: Підскажіть будь ласка

olekca01 написав:

Для тих кому цікаво во код:

<?php 
include('db.php');
mysql_select_db('progress',$db);
$result = mysql_query('SELECT * FROM users');
$myrow = mysql_fetch_array($result);
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" type="style/css" href="/style.css">
<title>Вхід на сайт</title>
</head>
<body class="login_body">

    <div class="login">
        <h1 align="center">Вхід на сайт</h1>
        <form action="/login.php" method="post" name="login" align="center">
        <input name="login" type="text" size="20" placeholder="Логін" tabindex="1" autofocus required><br>
        <input name="password" type="password" size="20" placeholder="Пароль" tabindex="1" required><br>
        <input name="submit"  class="submit" type="submit" value="Вхід" size="20">        
        </form>
        <a class="link_login" href="/register.php" >Ще не маєте акаунта?</a>

        <?php
        while($myrow = mysql_fetch_array($result)){
        if(isset($_POST['login'])){
            $login = $_POST['login'];
            $password = $_POST['password'];
            $password = md5($password);
                if($login == $myrow['login']){    
                $result_1 = mysql_query("SELECT * FROM users WHERE login='$login'",$db);
                $myrow_1 = mysql_fetch_array($result_1);
                
                    if($password == $myrow_1['password']){
                        echo "Успішний вхід";
                        
                    }
                    else{echo "Пароль не правильний";}
                }
                else{echo "<center><b><i>Неправильний логін!</i></b></center>";}
                            
        }
        }
        exit;
        ?>
    </div>

</body>
</html>

- для чого робити два окремі запити в бд якщо легко можна обійтись одним і то тоді коли це дійсно потрібно
- зробіть нормалізацію даних із $_POST, як сказав VTrim  цей код є вразливим. Для нормалізації використайте ф-ію mysql_real_escape_string. Хоча б так:

            $login = mysql_real_escape_string($_POST['login']);
            $password = mysql_real_escape_string($_POST['password']);
(function(){
  console.log("called anonymously");
})()
Подякували: 221VOLT1

7

Re: Підскажіть будь ласка

Я б взагалі не радив використовувати застарілі mysql_ функції та такий спосіб авторизації, втім зробив би простіше..

if(isset($_POST['login'])){

$login = mysql_real_escape_string($_POST['login']);
$password = md5($_POST['password']);
$auth = mysql_query("SELECT * FROM users WHERE login = '$login' AND password = '$password' LIMIT 1");
if(mysql_num_rows($auth) > 0) {
$user = mysql_fetch_assoc($auth);
echo 'Hello, '.$user['login'];
}
else
{
echo 'Авторизація провалена.';
}           

}
=)
Подякували: olekca01, 221VOLT2

8

Re: Підскажіть будь ласка

Я новачок і може те пояснити, що таке mysql_num_rows | mysql_fetch_assoc | mysql_real_escape_string
І ще можете порадити щось, щоб вивчити досконало mysql і php

Програміст - це не професія.
Це образ мислення.
Подякували: 221VOLT1

9

Re: Підскажіть будь ласка

olekca01 написав:

Я новачок і може те пояснити, що таке mysql_num_rows | mysql_fetch_assoc | mysql_real_escape_string
І ще можете порадити щось, щоб вивчити досконало mysql і php

Все це легко гуглиться. Читайте php.net

=)
Подякували: olekca01, 221VOLT2

10

Re: Підскажіть будь ласка

Вставив код і во Parse error: syntax error, unexpected '>' in D:\OpenServer\domains\progress\login.php on line 30

Програміст - це не професія.
Це образ мислення.

11

Re: Підскажіть будь ласка

olekca01 написав:

Вставив код і во Parse error: syntax error, unexpected '>' in D:\OpenServer\domains\progress\login.php on line 30

Відредагував 7й пост. Вставте оновлений код ще раз.
Просто код не тестував. на льоту писав :)

=)

12

Re: Підскажіть будь ласка

VTrim написав:
olekca01 написав:

Вставив код і во Parse error: syntax error, unexpected '>' in D:\OpenServer\domains\progress\login.php on line 30

Відредагував 7й пост. Вставте оновлений код ще раз.
Просто код не тестував. на льоту писав :)

Вже все ок

Програміст - це не професія.
Це образ мислення.

13

Re: Підскажіть будь ласка

VTrim написав:

Я б взагалі не радив використовувати застарілі mysql_ функції та такий спосіб авторизації...

до сказаного: ще можна почитати чому не варто юзати

(function(){
  console.log("called anonymously");
})()
Подякували: VTrim, 221VOLT2

14

Re: Підскажіть будь ласка

VTrim написав:

Все це легко гуглиться. Читайте php.net

Можете щось порадити на українській або російській бо в англ не спец!

Програміст - це не професія.
Це образ мислення.

15

Re: Підскажіть будь ласка

olekca01 написав:
VTrim написав:

Все це легко гуглиться. Читайте php.net

Можете щось порадити на українській або російській бо в англ не спец!

Є російська версія. http://php.net/manual/ru/
Гугліть книги та уроки (відеоуроки) по PHP5. Від себе чогось такого порадити не можу, бо все було більше на практиці та гуглінню, ніж читанню окремих книг та уроків.

=)
Подякували: 221VOLT1

16 Востаннє редагувалося 221VOLT (10.02.2016 22:05:50)

Re: Підскажіть будь ласка

mysql_query , mysql_* --- deprecated - тобто застарілі функції
використовуйте mysqli_* функції, для всіх застарілих функцій є аналоги,
таким чином ви нічого не втрачаєте - лише знаходите - нові знання та нові можливості =)

olekca01 написав:

І ще можете порадити щось, щоб вивчити досконало mysql і php

візьміться зробити якийсь невеличкий сервіс чи онлайн-гру -- навіть щось зовсім-зовсім простеньке, по аналогії з уже існуючим

таким чином ви навчитеся програмувати на реальній задачі, вивчите нове та будете мати невеличкий сервіс чи гру, яка може себе окуповувати і приносити трошечки на каву/чай ))

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: VTrim1

17

Re: Підскажіть будь ласка

Хай всім, я саме порядок наводжу в себе на сайті, то перебираю власні статті, про реєстрацію,
авторизацію на ресурсі,... але можливо ще де помилки, то вибачайте лиш чищу...

Між іншим ось таке питання, думав в себе в топіку спитати,  але якщо доречна тема є то й тут запитаю,
питання слідуюче, Якщо ми використовуємо шифрування паролю на стороні серверу, скажімо ось так:

$password = md5($password);

то передача самого паролю до серверу йде запитом POST, а от цікаво чи є сенс кодувати пароль ще на стороні клієнта? Скажімо той же md5 засобами javascript, чи то вже лишнє і воно того не варте, так як відправлення даних форми методом POST теж в деякій мірі кодоване.

Збираю знання і... роздаю знання :)
Подякували: 221VOLT1

18 Востаннє редагувалося 221VOLT (11.02.2016 02:38:17)

Re: Підскажіть будь ласка

Анатолій написав:

Між іншим ось таке питання, думав в себе в топіку спитати,  але якщо доречна тема є то й тут запитаю,
питання слідуюче, Якщо ми використовуємо шифрування паролю на стороні серверу, скажімо ось так:

$password = md5($password);

то передача самого паролю до серверу йде запитом POST, а от цікаво чи є сенс кодувати пароль ще на стороні клієнта? Скажімо той же md5 засобами javascript, чи то вже лишнє і воно того не варте, так як відправлення даних форми методом POST теж в деякій мірі кодоване.

на мою думку немає сенсу кодувати на клієнті - краще відправляти по https (тобто вчепити на сервері сертифікат шифрування) (таким чином всі дані при відправці шифруються браузером)
без сертифікату ваш пароль ловиться у вай-фай мережі і не тільки, ловиться mitm атакою (man in the middle) між вами і сервером - у провайдера, ще десь...
за умови наявності сертифіката - зашифровані дані розшифрувати на порядки складніше

також на сервері краще робити

$salt1='some string ffF zx $$%$$78&*%%';
$salt2='some other long string with ZZZzz#4@*()-=\/';
$password = md5($salt1.$password.$salt2);

таким чи подібним чином ви ускладните взломщику можливість підібрати пароль за допомогою rainbow таблиць чи перебором з хешуванням напряму у себе у випадку якщо у вас якимось чином злили бд/таблицю з паролями користувачів

звісно це не захистить вас у випадку якщо файли також злили
проте на практиці sql inject зустрічається частіше ніж можливість залити свої будь-які файли на чужий сервер

https://blog.clever-games.win/
Це ще не кінець. Це навіть не початок кінця. Але, можливо, це кінець початку.
Зростання мудрості можна точно вимірювати ступенем зменшення злоби.
Подякували: Анатолій1

19

Re: Підскажіть будь ласка

З PHP5.5
Є password_hash() - хешування та password_verify() - перевірка.

На основі crypt()

=)
Подякували: Анатолій, 221VOLT2

20

Re: Підскажіть будь ласка

Дякую, прийдеться зробити ще невеличкий допис в плані шифрування даних до попередніх розділів щодо crypt(), password_hash(), password_verify(), https... etc

Збираю знання і... роздаю знання :)
Подякували: 221VOLT1