2011-11-04 7 views
11

私はCodeigniterアプリケーションを構築しています。私はSQLインジェクションを防ぐのが最も難しいです。私はActive Recordメソッドを使用してすべてのクエリを構築しています。私はアクティブレコードが自動的に入力を消毒することを知っていますが、私は正確にどの程度まで疑問に思っていますか?それは単にすべての引用符を逃すか、それともそれ以上のことですか?難読化されたSQLインジェクション、または他のより高度な種類の防止についてはどうですか?codeigniterはどのように入力をサニタイズしますか?

基本的に、私はCIがデータをどのように消毒するかについて詳細な説明を探しています。誰でも知っていますか?

+4

CIのコードを見てみましたか? – Beat

+0

多くの情報:http://www.google.com.ng/search?gcx=c&sourceid=chrome&ie=UTF-8&q=codeigniter+sanitize+inputs%3F – Mob

+1

PDO誰でも? http://www.php.net/pdo –

答えて

9

、まさにこのように(MySQLドライバ用):mysql_real_escape_string()を試み

    • (これは時間の99%の場合となります)バック mysql_escape_string()
    • バックaddslashes()
    • の滝へ
    • 滝手動をエスケープstr_replace()

    https://github.com/EllisLab/CodeIgniter/blob/develop/system/database/drivers/mysql/mysql_driver.php#L294

    /** 
    * Escape String 
    * 
    * @access public 
    * @param string 
    * @param bool whether or not the string will be used in a LIKE condition 
    * @return string 
    */ 
    function escape_str($str, $like = FALSE) 
    { 
        if (is_array($str)) 
        { 
         foreach ($str as $key => $val) 
         { 
          $str[$key] = $this->escape_str($val, $like); 
         } 
    
         return $str; 
        } 
    
        if (function_exists('mysql_real_escape_string') AND is_resource($this->conn_id)) 
        { 
         $str = mysql_real_escape_string($str, $this->conn_id); 
        } 
        elseif (function_exists('mysql_escape_string')) 
        { 
         $str = mysql_escape_string($str); 
        } 
        else 
        { 
         $str = addslashes($str); 
        } 
    
        // escape LIKE condition wildcards 
        if ($like === TRUE) 
        { 
         $str = str_replace(array('%', '_'), array('\\%', '\\_'), $str); 
        } 
    
        return $str; 
    } 
    

    これはMySQLのクエリが壊れたり、予期しない何かをしないように、単に文字をエスケープして、データベースのコンテキストでのみ使用されていることに注意してください経由と_LIKE条件あなたがそれに渡すものに基づいて正しい構文を確実にするために、 xss_clean()はフリーサイズではありません。任意のコンテキスト(HTML、CSV、またはXML出力など)、および念のため、あなたはそれについて考えていたために安全なすべてのデータを作る魔法はありません

    ソリューションでも100%防弾でもない場合もありますが、実際は非常に不適切です。 Active Recordクラスはクエリーを自動的にエスケープしますが、それ以外の場合はの入力ではなく、の出力で、指定されたコンテキストに対して正しい方法でデータを手動でエスケープ/サニタイズする必要があります。

  • +0

    私は入力の代わりに私の出力を消毒することが何を意味するかは完全にはわかりません。私はXSS攻撃を防止しようとしているが、アクティブなレコードクラスを使用してmysqlクエリを作成している場合はどうすればよいと思いますか?それはどのように見えますか? – Erreth

    +0

    あなたがARクラスで投げるものは、 'mysql_real_escape_string'と同じくらい安全です。テーブルとデータベースの名前をエスケープします。妥当性(整数値、最大長、書式など)のためだけに、セキュリティのためにそれをサニタイズする必要はありません。 http://stackoverflow.com/questions/4171115/is-mysql-real-escape-string-enough-to-anti-sql-injection/4171134#4171134、http://stackoverflow.com/questions/5288953/isを参照してください。 -mysql-real-escape-string-broken –

    1

    last_query()メソッドを使用して、常に最新のクエリを表示することができます。

    $this->db->last_query()

    あなたは適切に消毒どうかを確認することができるようにクエリが、見て正確にどのように表示されます。

    3

    アクティブレコードのみがデータをエスケープします。エスケープすることでSQLインジェクションを防止します。次に、検証クラスを使用してフォームの検証を使用します。あなたの問題を処理する必要があります。ここでは他のCodeIgniterのセキュリティ項目へのリンクです:

    CodeIgniter UserGuide Security

    +0

    私は理解しています。フォームの検証クラスを少し使用していますが、私が持っているすべてのフォームでそれを使用しているはずです。間違いなくもっと積極的な衛生化と検証をしなければならないでしょう。ありがとう! – Erreth

    関連する問題