yii
  • sql-injection
  • 2012-01-10 18 views 1 likes 
    1

    は、私は、次のコードを見てきました:それは、SQLインジェクションを許すことができなかったので、ここでYii execute()でSQLインジェクションを実行できますか?

    $id = $_GET["user"]; 
    $auth = $_GET["id"]; 
    $sql = 'DELETE FROM categories where user_id = '.$id.' and category_id = '.$auth;           
    Yii::app()->db->createCommand($sql)->execute(); 
    

    私は、このコードはOKではないことを言われてきました。

    $ _GETが適切にフィルタリングされていないためですか?

    Yii :: app() - > db-> createCommand($ sql) - > execute();それを避ける?

    またはそこに到着したとき、はすでにwhere句に置かれているデータをチェックする必要がありますか?

    +0

    で利用可能である、あなたのデータベーステーブル用のActiveRecordのモデルを持っていますか?そうでない場合は、どうしてですか? ActiveRecordを使用すると、クエリを自分で書く必要がないため、SQLインジェクションの問題全体を回避できます。 – Jon

    +0

    クエリーやいくつかの追加オプションについてたくさんのラッパーを付けて読むのが簡単で、少なくともZendでそれらを見ていたのです。しかし、もちろん、好きな点として、私はより自然な感じでクエリを書く方が好きです。 – MEM

    +1

    [Yiiアプリケーションの安全な使い方](http://www.yiiframework.com/wiki/275/how-to-write-secure-yii-applications/)に関するこのWiki記事を読むことをお勧めします。 –

    答えて

    9

    Webアプリケーションのデータセキュリティの第1のルールは、GET/POSTパラメータを決して「信頼」しないことです。

    あなたのコードは、SQL文を作成する2つのGETパラメータを「サニタイズ」しようとしていません。つまり、誰かがURLを操作して、実行中のSQL文に2番目(またはそれ以上)のSQL文を「挿入」することができます。 SQLインジェクション攻撃を避ける最良の方法は、パラメータを「バインド」するクエリを使用して、単一のクエリのみを実行できるようにすることです。バインドされたパラメータを使用する方法についてのYiiのマニュアルは、次のURL(項目#5)

    http://www.yiiframework.com/doc/guide/1.1/en/database.dao

    関連する問題