我有我的控制器上运行此代码:笨SQL注入
$sql = "SELECT * FROM user WHERE id = " . $this->input->get('foo');
$foo = $this->db->query($sql);
echo '<pre>';
print_r($foo->result());
echo '</pre>';
die();
我发现,如果我用这个网址:
www.site.com?foo=1 OR 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
编辑:
我知道的现有机制,以防止这种HAPP的效果图创作。
我的问题是如果可能,以及如何,我可以从其他表中获取数据。
使用'real_escape_string'或类似的东西,以防止注射。永远不要相信用户输入 – SuperDJ
你可以使用参数绑定,而不是直接连接类似的值吗?你本质上*作为代码执行用户输入*。 – David
你是要求注射字符串吗?简而言之,是的,可以运行一个查询来输出当前mysql用户可以访问的任何和所有表/数据库的数据,以及更多 –