У меня есть этот код на мой контроллер:Codeigniter SQL Injection
$sql = "SELECT * FROM user WHERE id = " . $this->input->get('foo');
$foo = $this->db->query($sql);
echo '<pre>';
print_r($foo->result());
echo '</pre>';
die();
Я заметил, что если я использую этот URL:
www.site.com?foo=1 ИЛИ 1 = 1
все данные таблицы пользователя:
Array
(
[0] => stdClass Object
(
[id] => 1
[email] => [email protected]
[password] => aaa
)
[1] => stdClass Object
(
[id] => 1
[email] => [email protected]
[password] => bbb
)
[2] => stdClass Object
(
[id] => 1
[email] => [email protected]
[password] => ccc
)
)
Возможно ли запустить другой запрос, который возвращает данные из таблицы user_phone?
Таблицы:
CREATE TABLE `user` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`email` VARCHAR(100) NOT NULL,
`password` VARCHAR(255) NOT NULL
PRIMARY KEY (`id`),
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
CREATE TABLE `user_phone` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`id_user` INT(11) UNSIGNED NOT NULL,
`number` INT(11) UNSIGNED NOT NULL
PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
данных:
INSERT INTO `user`(`email`,`password`) VALUES ('[email protected]','aaa');
INSERT INTO `user`(`email`,`password`) VALUES ('[email protected]','bbb');
INSERT INTO `user`(`email`,`password`) VALUES ('[email protected]','ccc');
INSERT INTO `user_phone`(`id_user`,`number`) VALUES ('1','911911911');
INSERT INTO `user_phone`(`id_user`,`number`) VALUES ('1','922922922');
INSERT INTO `user_phone`(`id_user`,`number`) VALUES ('2','955955955');
INSERT INTO `user_phone`(`id_user`,`number`) VALUES ('3','711711711');
Thks
EDIT:
Я в курсе существующих механизмов для предотвращения этого от Happ Ening.
Мой вопрос в том, возможно ли, и как я могу получить данные из других таблиц.
использовать 'real_escape_string' или что-то подобное, чтобы предотвратить инъекцию. никогда не доверять пользовательскому вводу – SuperDJ
Можете ли вы использовать привязку к параметрам вместо того, чтобы напрямую конкатенировать такие значения? Вы, по сути, выполняете ввод пользователя как код *. – David
вы просите инъекционную строку? Короче говоря, да, можно запустить запрос, который будет выводить данные из всех и всех таблиц/баз данных, к которым имеет доступ текущий пользователь mysql, и многое другое –