2015-05-21 3 views
0

Я создаю небольшую веб-страницу, и я хочу извлечь идентификатор пользователя, чтобы проверить, существует ли учетная запись или нет. Я делаю это, подключаясь к базе данных MySQL и проверяя, существует ли учетная запись. Я очень новичок во всем этом, и знаю только абсолютные основы PHP & MySQL. Вот мой login.php:Получение идентификатора пользователя для входа в систему

login.php

<?php 

    $server = "fooServer"; 
    $user = "foo"; 
    $pass = "foo"; 
    $db = "newsContent";      
    $conn = new mysqli($server, $user, $pass, $db); 
    if ($conn->connect_error) 
    { 
    die("Connection failed: " . $conn->connect_error); 
    } 
?> 

<?php 
    $email = $_POST['email']; //Taken from my index.php 
    $password = $_POST['password']; //Taken from my index.php 

/*I used this so as to extract the id. I then wanted to 
proceed with the procedure if the id existed, and alert the user if it didn't*/ 
    $sql = "SELECT id FROM fooTable WHERE username='$email' && password='$password'"; 

    if ($conn->query($sql) === TRUE) { 
    echo " 
    <script> 
     alert('Login Successful'); 
     window.location.href='news.php'; 
    </script>"; 
    } else { 
     <script> 
     alert('Login unuccessful. User account does not exist'); 
     window.location.href='news.php'; 
    </script>"; 
    } 
?> 

Этот код может выглядеть ужасающе для опытных программистов, которые я понимаю, но, пожалуйста, погоревшей прочь с предложениями.

+1

В чем проблема с этим кодом? –

+1

(1) вы открыты для ввода sql, поскольку используете свои пользовательские данные, не дезинфицируя/используя подготовленные операторы. (2) являются вашими паролями открытого текста? не хорошая идея. (3) вы только проверяете, был ли запрос выполнен успешно, но не проверяйте, вернула ли он строку. – Sean

+1

Попробуйте с именем пользователя ''или 1 = 1 -' –

ответ

0

Всякий раз, когда вы используете пользовательский ввод как часть SQL-запроса, вы рискуете уязвимостями SQL-инъекций. В то время как вы могли бы пойти с подготовленными операторами или много санобработки, самый надежный подход я видел до сих пор что-то вроде этого:

function authenticate($email, $password) { 

    if (empty($email) || empty($password)) return false; 

    $auth = false; 
    $check = false; 
    $q1 = "SELECT * FROM user WHERE active = 1 ORDER BY email ASC"; 
    $knownUsers = $this -> sql -> doMultiSelect($q1); 

    $checkUser = ""; 

    foreach ($knownUsers AS $user){ 
     if ($user ['email'] == $email) { 
      $check = true; 
      $checkUser = $user; 
      break; 
     } 
     if (substr($user['email'],0,1) > substr($email,0,1)) { 
      break; 
     } 
    } 

    if ($check) { 
     if ($checkUser['password'] == crypt($password, $email)) { 
      $auth = true; 
      // do something with the user data 
     } 
    } else { 
     $this -> logActivity("failed login attempt for user ".$email); 
    } 
    return $auth; 
} 

Очевидно, что вам нужно адаптировать, что немного для ваших нужд.

Этот подход никогда не передает пользовательский ввод в базу данных, но база данных используется только для чтения.

Обратите внимание, что этот подход достаточно хорош для нескольких сотен или, может быть, тысяч пользователей, но не для очень большого количества существующих пользователей.

Еще одна точка: вы можете использовать идентификатор пользователя для дальнейшей обработки, а скорее использовать то, что нелегко догадаться. Возможно, MD5 электронной почты пользователя или что-то в этом роде.

+0

: o Я никогда не видел этот способ аутентификации пользователя, и я думаю, что если вы действительно хотите убедиться, что вы не получаете никаких инъекций sql, вы должны использовать PDO – Szenis

+0

@Szenis, конечно, PDo будет вариантом. Но в зависимости от типа изменения проекта, как вы общаетесь с базой данных, необязательно является жизнеспособным вариантом. То, что этот подход дает, является пуленепробиваемым способом предотвращения инъекций (если я не упустил что-то?) – Burki

+1

это излишний. нет причин, чтобы получить каждого пользователя, а не перебрать в php. Оба «mysqli» и «PDO» предлагают безопасные способы запроса базы данных с пользовательскими данными, поэтому это необязательно. – Sean

Смежные вопросы