Witam wszystkich serdecznie.
Zacząłem się bawić w PHP i mam pewien problem związany z testowaniem bezpieczeństwa. Oto kod aby dokładniej zobrazować problem:
/* INDEX.PHP */
/* FORMULARZ */
<form action="login.php" method="post">
Login: <br /> <input type="text" name="login" /> <br />
Password: <br /> <input type="password" name="password" /> <br /><br />
<?php
if ((isset($_SESSION['zalogowany'])) && ($_SESSION['zalogowany']==true))
{
echo "<a>Witaj: ".$_SESSION['uzytkownik']."</a>";
echo "<input type='submit' value='logout' name='log_out' />";
}
else
{
echo "<input type='submit' value='register' name='register' />";
echo "<input type='submit' value='login' name='log_in' />";
}
?>
</form>
/* PLIK LOGIN.PHP */
/* REJESTRACJA */
if(isset($_POST['register']))
{
$reg = "INSERT INTO users (login, password, typ) VALUES (:login_form, :password_form, :typ_form)";
$stmt = $db -> prepare($reg);
$stmt -> bindValue(':login_form', $_POST['login']);
$stmt -> bindValue(':password_form', $_POST['password']);
$stmt -> bindValue('typ_form', 'U');
$stmt -> execute();
}
/* LOGOWANIE */
if(isset($_POST['log_in']) && !(isset($_SESSION['zalogowany']) && $_SESSION['zalogowany']))
{
$logowanie = "SELECT count(*) as czy_istnieje FROM users WHERE login = :login_form AND password = :password_form";
$stmt = $db -> prepare($logowanie);
$stmt -> bindValue(':login_form', $_POST['login']);
$stmt -> bindValue(':password_form', $_POST['password']);
$stmt -> execute();
$log = $stmt -> fetch();
if($log['czy_istnieje'] > 0)
{
$id = "SELECT id FROM users WHERE login = :login_form";
$stmt_id = $db -> prepare($id);
$stmt_id -> bindValue(':login_form', $_POST['login']);
$stmt_id -> execute();
$sql_id = $stmt_id -> fetch();
$_SESSION['uzytkownik'] = $_POST['login'];
$_SESSION['zalogowany'] = true;
$_SESSION['id'] = $sql_id['id'];
setcookie('uzytkownik', $_POST['login'], time() + 300, "/");
}
else
{
if (isset($_COOKIE['uzytkownik']))
{
unset($_COOKIE['uzytkownik']);
}
session_destroy();
}
}
Pytanie..... Jakim cudem kod jest odporny na wstrzyknięcie:
` OR 1=1 --
jeśli nie użyłem filtracji danych, a z tego co czytałem tylko wówczas jesteśmy podatni na SQL injection.
Jedyne co da się zastosować, to mogę podczas rejestracji dodać skrypt do bazy danych, ale zalogować się nie da, a powinno się dać poprzez wstrzyknięcie ;/
Od czego to zależy kiedy kod jest podatny na SQL injection?
Pozdrawiam Maciej.
P.S.
Używam PDO, gdyż w necie wyczytałem, że lepsze od MySQLi ze względu, na fakt obsługi 12 baz, a to drugie działa podobno tylko z bazami SQL.