我有我的控制器上運行此代碼:笨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用戶可以訪問的任何和所有表/數據庫的數據,以及更多 –