
20.12.2007, 00:54
|
|
Познающий
Регистрация: 12.11.2007
Сообщений: 70
Провел на форуме: 1214722
Репутация:
676
|
|
----[ EXAMPLE ... ]
Для примера создадим таблицу USERS с полями id username password
PHP код:
mysql > CREATE TABLE `users` (
`id` int(11) NOT NULL default '0',
`username` varchar(15) NOT NULL default '',
`password` varchar(32) NOT NULL default ''
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
И внесем для теста оду запись 1,itdefence,itdefence
PHP код:
mysql > INSERT INTO `users` ( `id` , `username` , `password` ) VALUES ( '1', 'itdefence', 'itdefence' );
И напишем скрипт со специально сделанной уязвимостью
PHP код:
<?php
$sqlhost = 'localhost';
$sqlpass = '';
$sqluser = 'root';
$sqlname = 'itdefence';
$mysql_link = mysql_connect($sqlhost,$sqluser,$sqlpass);
if (!$mysql_link) die (mysql_error());
$result = mysql_select_db($sqlname);
if (!$result) die (mysql_error());
$query = 'SELECT * FROM `users` WHERE `id`=\''.$_GET['id'].'\'';
$result = mysql_query($query);
if (!$result) die (mysql_error());
echo mysql_num_rows($result);
mysql_close($mysql_link);
?>
----[ SUBQUERIES ... ]
Для примера я буду рассматривать MySQL > 4.1 так как с этой версии поддерживаются все формы подзапросов,которых требует стандарт
SQL.Подзапрос можно вкладывать в другой подзапрос и его надо обрамлять скобами
PHP код:
mysql > SELECT * FROM `users` WHERE `id` = (SELECT MAX(ID) FROM `users`)
PHP код:
mysql > SELECT * FROM `users` WHERE `id` = ANY ( SELECT MAX(id) FROM `users`)
PHP код:
mysql > SELECT * FROM `users` WHERE (1,1) = ( SELECT `id`,`username` FROM `users` )
В процессе могут встречаться следующие ошибки , как :
неподдерживаемый синтаксис ошибок
PHP код:
mysql > SELECT * FROM `users` WHERE `id` IN ( SELECT `id` FROM `users` ORDER BY `id` LIMIT 1)
-> #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
число столбцов в подзапросе неверное
PHP код:
mysql > SELECT ( SELECT `id`,`username` FROM `users`) FROM `users`
-> #1241 - Operand should contain 1 column(s)
неверное количество строк в поздапросе
PHP код:
mysql > SELECT `id` FROM `users` WHERE `id` = ( SELECT id FROM `users` )
-> #1242 - Subquery returns more than 1 row
Ошибка в подзапросе приводит к нарушению всего запроса.Для более ранних версий можно запросы с подзапросами заменить более
легкими конструкциями
PHP код:
mysql > SELECT DISTINCT users.* FROM `users` WHERE users.id = 1
PHP код:
mysql > SELECT users.* FROM users LEFT JOIN banned ON users.id = banned.id WHERE banned.id IS NOT NULL
|
|
|