2011-05-02 350 views
26

在CodeIgniter中,我該如何避免sql注入?是否有任何方法來設置配置文件,以避免SQL注入?我使用此代碼選擇值:如何避免codeigniter中的sql注入

$this->db->query("SELECT * FROM tablename WHERE var='$val1'"); 

這對於插入值:

$this->db->query("INSERT INTO tablename (`var1`,`var2`) VALUES ('$val1','$val2')"); 

用來插入,然後從數據庫中值的另一種方法是CodeIgniter的insert()get()方法。任何機會,同時使用CodeIgniter的儲存卡的函數

+0

頁面roytuts.com/prevent-sql-injection-in-codeigniter/ – user3470953 2016-05-23 09:58:49

+0

從安全助手中使用xss_clean方法也很好。 – 2016-12-08 13:24:06

回答

45

CodeIgniter的Active Record方法會自動爲您轉義查詢,以防止sql注入。

$this->db->select('*')->from('tablename')->where('var', $val1); 
$this->db->get(); 

$this->db->insert('tablename', array('var1'=>$val1, 'var2'=>$val2)); 

如果你不想使用活動記錄,您可以使用query bindings防止對注射。

$sql = 'SELECT * FROM tablename WHERE var = ?'; 
$this->db->query($sql, array($val1)); 

或者對於插入,您可以使用insert_string()方法。

$sql = $this->db->insert_string('tablename', array('var1'=>$val1, 'var2'=>$val2)); 
$this->db->query($sql); 

如果您更願意運行自己的查詢,那麼也有escape()方法。

$val1 = $this->db->escape($val1); 
$this->db->query("SELECT * FROM tablename WHERE var=$val1"); 
0

可以檢查你的VAR包含數字的字母,這意味着你VAR線杆是你定義的格式SQL注入。 將其插入查詢之前

3

你應該儘量避免直接寫你的查詢到一個字符串,然後將它們傳遞給查詢功能。更好的選擇是使用Active Record類,它將爲您建立查詢並轉義值。

如果您想避免使用Active Record類,那麼您可以查看Codeigniter文檔,以獲取數據庫類的詳細信息,該文檔具有用於在將值傳遞給查詢方法之前轉義值的轉義方法。http://www.codeignitor.com/user_guide/database/queries.html

0

雖然接受來自客戶端的值,最好使用此代碼,

$client = $this->input->post('client',TRUE); 

雖然插入更好地笨插入方法使用,

$this->db->insert('tablename',$values); 

當使用這種方法codeingniter會自動完成所有的轉義操作,所以我們不需要手動轉義。

1

在CodeIgniter中: 有2個動作可以防止SQL注入。 對於那些在網絡編程方面有新意的人來說,Web編程中的另一種安全漏洞可能是致命的,因爲它可以暴露你的應用程序數據庫的內部,它是SQL注入。

再次感謝Codeigniter有能力處理它。但不幸的是,我合作的很多CI程序員(甚至是你)都已經(或可能)忘記了這兩個行爲,以防止SQL注入的任何情況。

棒與ActiveRecord的能力 的第一件事是用完整的查詢這樣做不是在處理查詢數據的任何情況:

$this->db->query("select * from users where user=$user and password=$password") 

你不知道究竟裏面$用戶或$密碼變量當涉及到用戶誰會故意做錯的事情。即使是XSS sanitiser也不會處理在其中輸入引號,分號或短劃線字符組合的人。 因此,在這種情況下,您需要了解此Active Record事件,因爲它具有專用於防止SQL注入的輸入消除器功能。別擔心,它支持各種功能鏈接是這樣的:

$this->db->select('title')->from('mytable')->where('id', $id)->limit(10, 20); 

$query = $this->db->get(); 

但要記住,如果你還是結合這樣的活動記錄功能的內部通常(部分)查詢功能將無法正常工作:

$query = $this->db->where("title LIKE '%$input%'"); 

其中實際上可以這樣改變。

$query = $this->db->like("title", $input); 

重點是,使用CodeIgniter的活動記錄的可能性的每一點,不要亂它。

但如果是不行的,還存在另一種 如果你有一個很長的查詢,也懶得把它轉換爲活動記錄的風格,您可以使用此功能手動消毒你輸入:

$sanitised_title = $this->db->escape($title); 

//像查詢

$sanitised_title = $this->db->escape_like_str($title); 

內使用,你可以放心地串聯查詢裏面的消毒/逃脫輸入。