2011-08-04 37 views
4

下午好,安全的笨

我有關於CI中的安全性有些懷疑,第一個是:

我有一個控制器:news.php,並在其中我有一個方法所謂視圖

例子:

class News extends CI_Controller{ 

    public function view($id) 
    { 
     $this->load->model('news_model'); 
     $this->news_model->get_by_id($id); 
     // ... 
    } 
} 

這種工作形式是安全的?沒有通過URL注入SQL的風險?考慮到這個頁面是如此訪問mywebpage/news/number_id。通過intval()或不必要的過濾會很有趣?

我的第二個問題是:

默認情況下笨XSS過濾器可以POST和GET,但未知的方式通過笨篩選HTML,我創建了一個幫手笨下來,有一些類似於原生方式笨?

function remove_xss_html($string){ 

    if(is_array($string)){ 

    $return_array = array(); 

     foreach($string as $item) 
     { 
      if(!get_magic_quotes_gpc()) 
      { 
       $return_array[] = addslashes(htmlspecialchars(strip_tags($item))); 
      } 
      else 
      { 
       $return_array[] = htmlspecialchars(strip_tags($item)); 
      } 
     } 
      return $return_array; 
    } 
    else 
    { 
     return htmlspecialchars(strip_tags($string)); 
    } 
} 

第三和最後一個問題是:

如果我把一個變量$這個 - >輸入 - >後(「my_var」)直接向沒有過濾器的數據庫,我運行的風險一個SQL注入? CodeIgniter或過濾器如此安全?

IMPORTANTE:我的英語不太好,我用谷歌翻譯和修復我可以。

謝謝大家......

回答

6

如果您正在使用Active Record類數據庫交互的數據將被自動轉義:

超越簡單的一大好處是用活動記錄功能它允許你創建獨立於數據庫的應用程序,因爲查詢語法是由每個數據庫適配器生成的。它還允許更安全的查詢,因爲系統會自動轉義這些值。

如果不是,而且您正在手動運行查詢,則需要自行轉義。

你的函數的一些建議:

public function view($id) 
{ 
    $this->load->model('news_model'); 
    $this->news_model->get_by_id($id); 
    // ... 
} 

如果$id的網址不存在時,你會得到錯誤提示。設置默認值:

public function view($id = NULL) 

然後檢查控制器中的值。例如:

if (! $id) 
{ 
    redirect('somwhere/else'); 
} 

此外,請務必在繼續之前得到的結果(我假設你的模型,如果沒有記錄在這裏找到返回false):

$record = $this->news_model->get_by_id($id); 
if (! $record) // redirect with error message or something 

您可以驗證$id S型或完整性儘可能多的,但爲簡單起見,我只是將它傳遞給模型,並返回false如果沒有記錄被發現。

+0

感謝您的解釋,但我用的活動記錄,是的,我總是確定的功能EX功能測試:該參數的默認值($ ID = false){},那麼我會顯示一個替代內容if($ id){} – user875690

0

即使您沒有運行活動記錄,也會提供自動轉義。你只需要這樣的查詢數據庫:

$data=array($id, $name); 
$this->db->query("SELECT * FROM table WHERE id=? OR name=?", $data);