關於CI xss進攻和sql注入的防範問題

2022-08-29 09:06:10 字數 3507 閱讀 3000

$config['global_xss_filtering'] = true;

或者自動設定get和post方法的第二個引數為true,則對輸入的引數進行xss過濾,注意只是xss過濾,並不會對sql注入進行有效的防範。

$this->input->post("username",true);

防sql注入的原理主要是過濾判斷條件(where或like)中字段的特殊字元(',\,%,_.....等),在特殊欄位前加上轉義字元等操作,使資料庫能正常執行sql,不會發生databaseerror的問題

1、數字型別陣列可以通過判斷是否是數字和位數進行篩選,避免執行到資料庫那裡遇到問題

2、如果是純字串不需要特殊字元插庫的話,可以判斷如果有特殊字元的話就不繼續執行,避免執行到資料庫那裡遇到問題

3、如果執行到資料庫這裡,需要對判斷條件的字段進行過濾轉義

這裡說一下ci框架中轉義的方式:

1、直接使用ci的ar(active record)的資料庫curd方式去處理

(1)、插入:$this->db->insert("tablename",$insertarray);

(2)、刪除:$this->db->where("id",$id)->delete("tablename");

(3)、更新:$this->db->where("id",$id)->update("tablename",$updatearray);

(4)、查詢:$this->db->where("id",$id)->select("id,name,age")->get("tablename");

*這裡有個細節需要get一下,where裡面寫sql自定義字串時(下面的第4種方式),如where("id = ''"),where這一塊並不算是ar類的操作,換言之也就是不會自動進行過濾轉義的

*下面的4方式,自定義字串方式雖然不是ar類寫法,不支援自動過濾轉義,但是可以支援where中寫or的寫法,相對靈活,如果遇到有or的情況,需要在那之前把判斷的字段先轉義過來,不管是用ci自己的方式(詳見最下方的轉義查詢),還是自己封好的demo函式都可以

簡單的 key/value 方式:

$this->db->where('name', $name); // produces: where name = 'joe'

注意自動為你加上了等號。

如果你多次呼叫該方法,那麼多個 where 條件將會使用 and 連線起來:

$this->db->where('name', $name);

$this->db->where('title', $title);

$this->db->where('status', $status);

// where name = 'joe' and title = 'boss' and status = 'active'

自定義 key/value 方式:

為了控制比較,你可以在第乙個引數中包含乙個比較運算子:

$this->db->where('name !=', $name);

$this->db->where('id <', $id); // produces: where name != 'joe' and id < 45

關聯陣列方式:

$array = array('name' => $name, 'title' => $title, 'status' => $status);

$this->db->where($array);

// produces: where name = 'joe' and title = 'boss' and status = 'active'

你也可以在這個方法裡包含你自己的比較運算子:

$array = array('name !=' => $name, 'id <' => $id, 'date >' => $date);

$this->db->where($array);

自定義字串:

你可以完全手工編寫 where 子句:

$where = "name='joe' and status='boss' or status='active'";

$this->db->where($where);

在提交資料到你的資料庫之前,確保先對其進行轉義是個非常不錯的做法。 codeigniter 有三個方法來幫你做到這一點:

$this->db->escape()這個函式會檢測資料型別,僅轉義字串型別的資料。 它會自動用單引號將你的資料括起來,你不用手動新增:

$sql = "insert into table (title) values(".$this->db->escape($title).")";

$this->db->escape_str()這個函式忽略資料型別,對傳入的資料進行轉義, 這個方法並不常用,一般情況都是使用上面的那個方法。方法的使用**如下:

$sql = "insert into table (title) values('".$this->db->escape_str($title)."')";

$this->db->escape_like_str()這個函式用於處理 like 語句中的字串,

這樣,like 萬用字元('%', '_')可以被正確的轉義。

$search = '20% raise';

$sql = "select id from table where column like '%" .

$this->db->escape_like_str($search)."%' escape '!'";

*轉義這裡有一點需要get下,$this->db->escape()在使用這個函式之後,變數會自動在兩側加上單引號'',同時也會在裡面進行自動的過濾

*比如會把abc變成'abc' , 也會把a'bc變成'a\'bc'的,所以在寫進where的sql自定義字串中時,就不要再加單引號了,那樣就會有兩個單引號在變數外邊(''abc'')

*$this->db->escape_str()在使用這個函式之後,變數不會自動在兩側加上單引號'',只會在裡面進行自動的過濾

*比如會把abc還是abc , 也會把a'bc變成a\'bc的,所以在寫進where的sql自定義字串中時,和以前用法是一樣的

關於SQL注入

sql 注入的定義是sql是運算元據庫資料的結構化查詢語言,網頁的應用資料和後台資料庫中的資料進行互動時會採用sql。而sql注入是將web頁面的原url 表單域或資料報輸入的引數,修改拼接成sql語句,傳遞給web伺服器,進而傳給資料庫伺服器以執行資料庫命令。如web應用程式的開發人員對使用者所輸...

關於sql注入問題

sql 注入 1 sql 注入是一種攻擊方式,在這種攻擊方式中,惡意 被插入到字串中,然後將該字串傳遞到 sql server 的例項以進行分析和執行。任何構成 sql 語句的過程都應進行注入漏洞檢查,因為 sql server 將執行其接收到的所有語法有效的查詢。乙個有經驗的 堅定的攻擊者甚至可以...

作業(關於sql注入)

1 sql的注入原理 使用者輸入的東西,可以是數字,字元,或者其他的什麼語言會被整合到後台的伺服器上進行執行,而sql注入就是通過構造合法的語句,讓這語句整合到後台伺服器上執行一些違法的操作。2.sql注入具體的案例 數字型注入 post id post id query select userna...