2011-08-04 12 views
4

こんにちは、セキュリティ

私はCodeIgniterの中の安全性に関するいくつかの疑問を抱えているが、最初にある: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()または不要なものをフィルタリングするのは興味深いでしょうか?

私の2番目の質問は次のとおりです。デフォルトのCodeIgniterのXSSフィルタによって

が投稿し得るが、CodeIgniterのことでHTMLをフィルタリングする未知の道ができ、私がダウンしてCodeIgniterのヘルパーを作成し、ネイティブと同様のいくつかの方法がありますCodeIgniter?

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)); 
    } 
} 

と第3の最後の質問は次のとおりです。

私はフィルタなしで直接データベースに変数の$ this - >入力 - >ポスト(「MY_VAR」)を送信すると、私は危険を冒しますSQLインジェクション? CodeIgniterやフィルターはとても安全ですか?

IMPORTANTE:私の英語はあまりよくありません。私はgoogleを使って翻訳し、私ができることを修正しました。あなたがDBの相互作用のためのActive Recordクラスを使用している場合

答えて

6

...あなたのすべてをありがとうございデータは自動的にエスケープされます:シンプルさを越えて

、Active Recordの機能を使用する主な利点クエリの構文は各データベースアダプタによって生成されるため、データベースに依存しないアプリケーションを作成することができます。また、値はシステムによって自動的にエスケープされるため、より安全な照会も可能です。

クエリを手動で実行している場合は、手動でエスケープする必要があります。あなたの関数の

いくつかのアドバイス:

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

$idがURLに存在しない場合は、エラー通知を取得します。デフォルト値を設定してください:

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の種類や整合性を検証することができますあなたが望むだけ多くのレコードを見つけることができますが、簡単にするためにモデルに渡してレコードが見つからない場合はfalseを返します。

+0

私はアクティブなレコードを使用していますが、私はいつも関数のパラメータのデフォルト値を決定しています。関数test($ id = false){}、次に代替コンテンツif($ id){}を表示します – user875690

0

アクティブなレコードを実行していない場合でも、自動エスケープが提供されます。

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