Давайте посмотрим, как такой запрос обработает mysql:
1. name ='admin'='a' разбирается как ('name'='admin')='a'
2. Идет сравнение 'name' и 'admin'. Эти строки не равны => результат 0
3. Идет сравнение 0 и 'с'. Разные типы данных. Булевой и стринг. Происходит преобразование типа стринг в булен и 'с' превращается в 0
4. 0 =0 => 1 => TRUE
Замечания:
1. Mysql должен быть настроен на преобразование типов
2. Mysql должен быть настроен так, чтобы при сравнении 'а' и 'с' получалось 0, а не false, потому что если скобка даст false, тогда 'с' будет преобразовано в true => false != true => return 0
Спасибо за эту темку - весьма интересная фича MySQL'а в плане безопасности. Единственно, не могу не заметить, что ты не очень верно все разьяснил. Смотри:
Цитата:
Сообщение от Krist_ALL
1. name ='admin'='a' разбирается как ('name'='admin')='a'
2. Идет сравнение 'name' и 'admin'. Эти строки не равны => результат 0
Это не так. `name` это название колонки - оно не будет сравниваться со строкой как строка. Будет произведена выборка по условию name ='admin'='a'. Т.е. значения колонки `name` всех строк таблицы будут поочередно проверяться на соответствие этому условию, и они все будут ему соотвтствовать, кроме строки, где name='admin', т.к. выражение 'admin'='admin'='a', собственно, будет возвращать FALSE.
Последний раз редактировалось cr0w; 04.09.2009 в 21:19..
Говоря о name, я подразумевал что вместо наме будет подставляться значение.Я все правильно написал.
И ты правильно заметил, что where admin=admin=a => false
1. name ='admin'='a' разбирается как ('name'='admin')='a'
Что-то тут такое наворочено не понятно. Лучше б переписал примеры с источника, там не нужно угадывать что подразумевалось
Между прочим, там упоминается также об именах колонок
Код:
select * from mysql.user where password=1 - нету результата (это и понятно)
select * from mysql.user where password=password=1 – есть результат
select * from mysql.user where password=password – есть результат
Если авторизация реализована как в той моей задачке, но переменные не обрамляются кавычками в запросе, можно воспользоваться именами столбцов для обхода авторизации (всего лишь как один из возможных вариантов)
PHP код:
<?php
$log = $_GET['log'];
$pass = $_GET['pass'];
. . .
$query = "select * from `admin` where login = $log and password = $pass";