2015-08-21 31 views
1

我有我的控制器上運行此代碼:笨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的效果圖創作。
我的問題是如果可能,以及如何,我可以從其他表中獲取數據。

+1

使用'real_escape_string'或類似的東西,以防止注射。永遠不要相信用戶輸入 – SuperDJ

+3

你可以使用參數綁定,而不是直接連接類似的值嗎?你本質上*作爲代碼執行用戶輸入*。 – David

+1

你是要求注射字符串嗎?簡而言之,是的,可以運行一個查詢來輸出當前mysql用戶可以訪問的任何和所有表/數據庫的數據,以及更多 –

回答

3

我認爲這將是這樣的。

www.site.com?foo=1 OR 1 = 1 union select * from user_phone where user_phone.id_user = user.id 
+1

嗨volkinc!它失敗了user.id('where子句'中的未知列'user.id'),但我得到的圖片。很多! – random425

0

因爲這個原因,CI帶有函數來逃避變量。

$foo = $this->input->get('foo'); 
$foo = $this->db->escape($foo); 
$sql = "SELECT * FROM user WHERE id = {$foo}"; 
$foo = $this->db->query($sql); 
echo '<pre>'; 
print_r($foo->result()); 
echo '</pre>'; 
die(); 
+1

嗨,吉姆。我知道逃生方法。我的問題是這個代碼是否可能從其他表中返回數據。 – random425

0

您應該能夠使用這樣的查詢綁定:

$sql = "SELECT * FROM user WHERE id = ? AND name = ?"; 
$foo = $this->db->query($sql, array('foo', 'bar')); 

至於從其它表中獲取數據,你只需要構造一個更復雜的SQL查詢

0

您詢問了從2個表中查詢數據,查詢2個可以使用join的相關表。在你的例子中user和user_phone是相關的。你使用下面的演示來執行sql查詢。用戶primary_key是user_phone表中的膠水。 1 - 選擇* 2 - 傳遞我們想要檢索 3的ID - 從表 4 - 執行連接或多個連接 5 - 得到的結果 試試這個

$this -> db -> select('*'); 
$this -> db -> where('id' => '1'); 
$this -> db -> from('user'); 
$this -> db -> join('user_phone', 'user_phone.id_user = user.id'); 
$query = $this -> db -> get(); 
+1

你能解釋你的答案嗎?如果一個答案解釋了正在做什麼以便其技術可以應用於其他情況,那麼答案就會更有用。 –

+2

對,我有點急,我添加了一些信息來解釋這個陳述是什麼以及它是如何完成的。感謝您指出,雖然:)。 – mdamia

+1

嗨mdamia。請你回覆。基本上,我的問題是如何使用** SQL注入**連接表,而不是使用代碼。 – random425