2010-09-26 73 views
12

關於Codeigniter及其輸入處理能力的一些懷疑。有些人可能有點奇怪,但他們懷疑無所謂。SQL注入和Codeigniter

  1. 如果我在CodeIgniter中使用Active Record類函數,我的輸入是否阻止了SQL注入?
  2. 我讀過它的地方,但我不明白它如何?或爲什麼?
  3. 此外,xssclean是否以任何方式處理SQL注入?
+1

單詞'active record'可能會被誤解,CI文檔已經改變爲'query builder' https://codeigniter.com/user_guide/database/query_builder.html – teek 2015-10-25 07:00:37

回答

16

是我輸入防止被SQL注入?

不完全「自動」,但它確實提供參數化查詢。 CodeIgniter或不,您應該儘可能優先使用參數化查詢來查詢字符串黑客行爲。

$bof= "a'b"; 
$zot= 'a\b'; 

// Insecure! Don't do this! 
// 
$this->db->query("SELECT foo FROM bar WHERE bof='$bof' AND zot='$zot'"); 

// Secure but annoying to write 
// 
$this->db->query("SELECT foo FROM bar WHERE bof='".$this->db->escape($bof)."' AND zot='".$this->db->escape($zot)."'"); 

// This is what you want 
// 
$this->db->query('SELECT foo FROM bar WHERE bof=? AND zot=?', array($bof, $zot)); 

注意這是無關的「輸入」:當你從你的字符串必須使用參數設置使一個SQL查詢或逃往使它們適合,無論它們是否是用戶輸入或沒有。這是一個簡單正確的問題;安全性是這種正確性的副作用。

同樣,當你輸出文本轉換成HTML,你需要HTML編碼<&和它然後"字符。試圖擺弄輸入來逃避或刪除將來可能會帶來麻煩的字符是絕對沒有用的,如果您恰好在SQL或HTML中使用它們而不逃脫的話。通過在HTML中出現意外的SQL轉義(這就是爲什麼您在糟糕的應用程序中看到自相乘反斜槓的原因)以及SQL中不需要的HTML轉義,您會破壞輸出。如果你從其他地方(比如說,數據庫中已有的材料)以外的地方獲取文本,你根本就沒有受到保護。

xssclean還處理SQL注入的任何方式嗎?

不是。它針對HTML注入。但它的比毫無價值的差。切勿使用它。

「XSS過濾」完全是僞造的(再次,CodeIgniter或其他任何人)。需要通過正確的HTML轉義輸出來防止XSS,而不是改變輸入。 XSS篩選將而不是充分保護您,如果您的應用程序尚不安全;最好它會混淆你現有的缺陷並給你一種錯誤的安全感。它也會破壞CI認爲看起來像標籤的許多有效輸入。

+0

有趣!最後一點尤其如此。我認爲你的方式真的更好。 – OrangeRind 2010-09-26 16:45:15

+2

小心解釋爲什麼CI的xssclean毫無價值?我非常好奇!這是我使用CI的一半原因。我想知道我是否在欺騙自己而不安全! – kevtrout 2010-09-27 17:37:05

+0

如果你記住HTML轉義你輸出到HTML頁面的所有字符串,無論你使用的是否是'xss_clean',你都是安全的,它會爲你做的就是悄悄地改變你的輸入字符串,在可怕的怪異方法。認真的看一下'Input.php'中的'function xss_clean',並且用'%'替換內容,URL解碼,再次用'%'替換內容,破壞URL編碼的鏈接,使用與它們之間的&符號,可以將一些*小於號的符號轉換爲'<',並且可以防止您討論'innerHTML'或使用'alert'這個詞......以及更多... – bobince 2010-09-27 20:30:15

1

無論何時使用用戶生成的輸入,然後通過輸入庫將其傳遞給xss和sql注入篩選器。

$this->input->post() 

http://codeigniter.com/user_guide/libraries/input.html

做檢查有關安全性的篩選更多信息。

內CI框架檢查文件

Codeigniter->System-libraries->input.php 

文件,你可以在內部找到消毒數據所採用CI功能。

XSS乾淨基本上意味着濾除不必要的XHTML/HTML標籤

+0

根據你自己的鏈接'$ this-> input- > post()'不會阻止SQL注入。 – Mischa 2013-01-06 14:53:17

1

1.它,如果你做正確

2.你可能已經注意到,所有的函數調用的方式,用戶數據傳遞在每個變量中。所以你甚至不可能在一個變量中傳遞SQL控制代碼和用戶數據。簡而言之,數據分別封裝在一個變量中。因此它可以安全編碼而不會破壞你的SQL代碼。 但是,如果您傳遞整個查詢,則是個例外。那麼它不可能。 如果你

$db->query("select * from table where password = 'hello ' or '1=1"); 

沒有辦法告訴應該怎麼逃脫,什麼不是,但如果你引用它在這樣

$db->query("select * from table where password = ?",array('param1')); 

用戶變量被封裝在一個變量,會逃過一劫。

3.是它,但其primpary目的不是爲了防止SQL注入, 我寧願依靠http://codeigniter.com/user_guide/libraries/input.html

+0

我認爲這裏''''參數不應該有單引號。 – bobince 2010-09-26 13:25:07

+0

嗯...真的不能說。我認爲這是正確的。當然,當你有整數時你不需要它,但它並不重要,所以最好像這樣寫它? – 2010-09-26 15:14:30

+1

嗯,我沒有專門用CodeIgniter試過這個,但是到目前爲止,做參數化查詢的最常用方法是使用一個空的'?'作爲替換點,並將字符串中的'?'作爲實際問號。無論如何,這似乎是http://codeigniter.com/user_guide/database/queries.html中給出的語法。 – bobince 2010-09-26 16:56:34