2017-01-13 3 views
1

Я создал сценарий ниже, который намеренно не защищен, чтобы немного узнать о кибербезопасности.Как я могу обойти мой сценарий входа?

session_start(); 

if($_SESSION['userSession']) { 
    header("location: home.php"); 
} 


if($_POST) { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 

    $con = mysqli_connect("localhost", "myUsername", "myPassword", "myDatabase"); 
    if(!$con) { 
     die("Error: " . mysqli_connect_error()); 
    } 

    $query = "SELECT * FROM users WHERE username = '$username' && password='$password'"; 
    $result = mysqli_query($con, $query); 
    $numResults = mysqli_num_rows($result); 

    if($numResults == 1) { 
     $row = mysqli_fetch_array($result, MYSQLI_ASSOC); 
     $_SESSION['userSession'] = $row['id']; 
     header("location: home.php"); 
    } else { 
     echo "Error Logging In"; 
    } 
    mysqli_close($con); 
} 

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

password' OR '1' = '1'"; 

Как я могу попытаться обойти/взломать мой сценарий входа?

+0

check link for sql injection: http://www.w3schools.com/sql/sql_injection.asp –

+0

Избавьтесь от последнего '' ', чтобы ваш пароль выглядел так:' foo 'или' 1 '=' 1 ' – miken32

ответ

-1

1.Чтобы избежать проблемы с внедрением sql, используйте запрос PDO или подготовленный оператор для выполнения запроса. 2.Add шифрование пароля хранится в базе данных

см ниже ссылку подготовленное заявление:

http://php.net/manual/en/mysqli.prepare.php

+0

Вы прочитали вопрос? Я не пытаюсь избежать проблемы, я пытаюсь понять ее и как ее можно использовать в этой конкретной ситуации. –

+0

** Не шифруйте пароли **, когда злоумышленник получает БД, он также получит ключ шифрования. Итерацию над HMAC со случайной солью в течение приблизительно 100 мс и сохранение соли с хешем. Используйте такие функции, как 'password_hash' /' password_verify', 'PBKDF2' (aka' Rfc2898DeriveBytes'), 'Bcrypt' и аналогичные функции. Дело в том, чтобы заставить злоумышленника потратить много времени на поиск паролей грубой силой. – zaph

1

Если мы используем SQL заявление непосредственно принести имя пользователя и пароль поля, то он может быть байпас с ' OR '1' = '1 шаблон, потому что, когда вы ставите ' OR '1' = '1 в поле имени пользователя и пароля, значения переносятся в оператор sql и в этом заявлении ' or '1' = '1: true для всех случаев, и это причина, по которой логин может обойти.

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