SQL injection

0

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.

1

Jest odporny bo bindujesz wartość (bindValue) - dzięki temu dane od usera trafiają tylko do parametru (:login_form), i nie wpływają na resztę zapytania. Tutaj chyba znajdziesz obszerniejsze wyjaśnienie:

https://stackoverflow.com/questions/1582161/how-does-a-preparedstatement-avoid-or-prevent-sql-injection

0

Dzięki wielkie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1