0

これは、私の Codeigniter アプリケーションのモデル内の関数の例です。

function is_subscriber($thread_id) {
    $this->db->query("SELECT user_id FROM subscriptions WHERE thread_id = $thread_id");
}

どこに、どのように逃げればいい$thread_idですか?データベース フィールド thread_id は整数$thread_idであるため、クエリ内で一重引用符で囲む必要はありません。Codeigniter で数字をどのようにエスケープすればよいのでしょうか? が数値かどうかを自分で確認する必要$thread_idがありますか、それとも Codeigniter でそれを行う方法はありますか?

escape_like_str()引用符を追加する escape() とは対照的に、引用符を追加せずにエスケープするものを見つけました。escape_like_str()数字にも使用する必要がありますか?

$thread_id次に、モデルまたはコントローラーで「検証」する必要がありますか?

4

4 に答える 4

2

codeigniterデータベースアダプターには、クエリのパラメーター化が組み込まれています。各パラメーターを疑問符に置き換え、すべての変数を2番目の引数として配列に渡すだけです。

$this->db->query("SELECT user_id FROM subscriptions WHERE thread_id = ?", array($thread_id));

このように設定すると、SQLインジェクションの可能性がなくなり、データのエスケープについて心配する必要がなくなります(少なくとも、SQL部分では、XSSとhtmlのエスケープは依然として懸念事項です)。

于 2013-03-13T22:36:46.863 に答える
1

Sam の方法は、これを行う適切な Codeigniter の方法です。標準的な PHP の方法の詳細については、次のようにします。

$thread_id = intval($thread_id);
$this->db->query("SELECT user_id FROM subscriptions WHERE thread_id = ". $thread_id);
于 2013-03-13T22:42:10.813 に答える
0

Sam Dufel's answer からのクエリを使用する必要がありますが、多数の質問と仮定に答えるだけです

$thread_id をどこでどのようにエスケープすればよいですか?

一般的なルールは、クエリの構築にできるだけ近いことです。
したがって、クエリに挿入する直前にデータが適切にフォーマットされることが保証されるため、プレースホルダーを使用するのが最善の方法です。

データベース フィールド thread_id は整数であるため、クエリ内で $thread_id を一重引用符で囲まないでください。

これは正しくありません。厳密モードで mysql を実行する場合のみ、引用符を使用できません。
ただし、一般に、引用符をずっと使用できます。したがって、数値を文字列としてフォーマットすることは、非常に可能な解決策です。

だから私はどのように数字をエスケープするべきか疑問に思っています...

数値をエスケープする唯一の方法は、キャストすることです。intval()大丈夫だ

...コードイグナイターで?

プレースホルダーを使用できる場合は、それを使用してください。

$thread_id が数字であるかどうかを自分で確認する必要がありますか、または Codeigniter でそれを行う方法はありますか?

一般的には、チェックする必要はありません。データベース レベルでは、適切なフォーマットのみが必要です。

数字にも escape_like_str() を使用する必要がありますか?

それは絶対に、間違いなく無意味です。
強盗からお金を守るためにインフルエンザワクチンを使用する必要がありますか? こっちも一緒。それは別の問題です。

モデルまたはコントローラーで $thread_id を「検証」する必要がありますか?

まず、入力の検証とデータベース固有の書式設定を区別する必要があります。
2 つ目は必須で無条件ですが、1 つ目はオプションです。
この「検証」が DB のフォーマットと関係ない限り、どこでも行うことができます。

個人的にはコントローラーでそれを行い、失敗すると 404 をスローします。モデルは環境に依存しない必要がありますが、HTTP 固有のアクションを実行するのはコントローラーであるためです。
ただし、このような検証は、常に適用する必要があるデータベース固有の書式設定とは関係ありません。

于 2013-03-14T05:09:57.223 に答える
-1

標準クエリを使用する場合は、次の$this->db->escape_like_str()ように使用することができます

$sql = 'SELECT name FROM users WHERE id = '.$this->db->escape_like_str($id).'AND user_id ='.$this->db->escape_like_str($user_id).'LIMIT 1';

または:

$sql = 'SELECT name FROM users WHERE id = ? AND user_id = ? LIMIT 1'
$query = $this->db->query(array($id,$user_id));

このメソッドは数値を検証せず、セキュリティのためにエスケープするだけです。数値を検証したい場合は、PHP ネイティブ関数を使用するis_numericか、PHP マニュアルを読むctype_digitis_int()、使用する必要があるものについて自分自身を発見することができます。.

于 2013-03-13T23:58:00.130 に答える