2013-05-03 2 views
2

Я написал код в php, который позволяет администратору входить в систему. Информация о пароле выводится из таблицы. Я знаю, что не очень хорошая практика писать такой код, и я должен использовать подготовленный оператор или mysqli_, но я просто хочу узнать о уязвимости sql-запроса. Я просто хочу знать, как мой код уязвим для SQL-инъекций? Как я могу обойти ограничение пароля. Я попробовал ввести пароль = «ничего» ИЛИ «x» = «x» в поле пароля, но он не обходит его. Это мой код: -Тестирование запроса для SQL-инъекции

if(isset($_POST["Submit"])) 
{ 
include 'db_connect.php'; 
$user=$_POST['user']; 
$pass=$_POST['pass']; 
$checkquery="select * from adminlogin where password='$pass' "; 
$queryex= mysql_query($checkquery); 
$row= mysql_fetch_array($queryex); 
$checkcasepass = $row['password']; 
if($user=='admin' && strcmp($checkcasepass,$pass)==0) 
{ 
setcookie("admin",$user); 
setcookie ("student", "", time() - 3600); 
header("location: admin option.php"); 
} 
else 
{ 
echo "Sorry User Name and Password is Wrong"; 
} 
} 

я изменил строку запроса к этому для целей тестирования: -

$checkquery="select * from adminlogin where password='$pass' OR 1=1 "; 

, но это не сработало. Может ли это быть из-за магических котировок? Но я использую PHP 5.4.3, а магические кавычки уже амортизируются. Мне интересно, почему SQL-инъекция не работает. ?

+1

Вы должны использовать 'PDO', если вы можете ему помочь,' mysql_ * 'функции официально устарели. Узнайте о [* подготовленных операторах *] (http://j.mp/T9hLWi) и используйте [PDO] (http://php.net/pdo) или [MySQLi] (http://php.net/ MySQLi). Проверьте [это сравнение] (http://j.mp/QEx8IB), и если вы выберете PDO, [вот хороший учебник] (http://j.mp/PoWehJ). –

+0

@dirt В то время как вы очень правильно заявляете об этом, пользователь конкретно говорит, что понимает это и хочет понять, как работает инъекция – RMcLeod

+0

, почему бы вам просто не отозвать ** результирующий запрос и опубликовать его здесь? –

ответ

1

, как вы хотите тест на инъекцию неправильный.

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

Но опять же, говоря о SQL-инъекции - это нормально с этим кодом, впрыснул все правильно.

+0

Yup! Я получил его, когда внимательно изучил код. Это инъекция, но код соответствует значению строки со значением столбца, которое извлекается в запросе. –

1

Изменение 'anything' OR 'x'='x' к anything' OR 'x'='x Ведущее «и ведомые» уже есть, по сути запроса вы пытаетесь будет выглядеть

select * from adminlogin where password=''anything' OR 'x'='x'' 

который не является действительным SQL

+0

Это не работает. Его показ неправильного пароля. –

+0

Получение этого с помощью var_dump: - string 'select * from adminlogin где password =' ​​anything 'OR' x '=' x '' (length = 62) –

+0

Получение: - строка 'select * from adminlogin where password =' ​​anything ' ИЛИ 1 = 1 '' (длина = 59) –

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