5

私はすべてに is_numeric を使用します。ユーザーから取得する唯一の入力は、学生 ID 番号を含むフォームです....

最近、SQL インジェクションについて調べていて、次の予防措置が必要かどうか疑問に思っていました。

現在私は持っています:

if(is_numeric($_POST['sid']){
     $sid = $_POST['sid']; 
     $query = "select * from student where sid='".$sid."'";
     // More Code...
}

私が読んだものはより安全です

if(is_numeric($_POST['sid']){
     $sid = (int) $_POST['sid'];
     $query = "select * from student where sid='".$sid."'";
     // More Code...
}

あるバージョンは他のバージョンよりも本当に安全ですか? 誰かが「is_numeric」をどのようにバイパスしますか?

また、これは私が現在持っているものよりも安全性が低くなりますか?

if(is_numeric($_POST['sid']){
     $query = "select * from student where sid='".$_POST['sid']."'";
     // More Code...
}

つまり、私が本当に求めているのは、これらのコード ブロックの 1 つが別のコード ブロックよりも本当に安全かどうかということです。


編集: 申し訳ありませんが、これを早く述べませんでしたが、mysql ではなく oracle 10g データベースを使用しています。oci_connect(); を使用

4

3 に答える 3

9

外部データから SQL ステートメントを作成できるように、入力をサニタイズする方法について質問するのはなぜですか? 外部データから SQL ステートメントを作成するのは危険です。

どうすれば中途半端な「解決策」を思いつくことができるかを心配して時間を無駄にするのではなく、立ち止まって Big Programmer Pants を着て、準備されたステートメントとバインドされた変数を使い始めてください。

これがあなたを始める素晴らしい答えです:PHPでSQLインジェクションを防ぐにはどうすればよいですか?

http://bobby-tables.com/phpで他の例を確認することもできます。

Oracleで準備済みステートメントとバインドされた変数を引き続き実行できるように見えます:http: //php.net/manual/en/function.oci-bind-by-name.phpまたはPDO http://php.net/を介してmanual/en/pdostatement.bindparam.php

于 2013-09-05T21:09:52.783 に答える
8

経験則として、データをチェックするだけでは安全ではありません。データを使用する前に、常に前処理を行う必要があります。

がどのように機能するかのすべての内部を知らないとしましょうis_numeric。または、そのロジックまたはその実装が将来変更されるかどうかわかりません。または、十分にテストしていません。または、そのドキュメントには、非常に具体的ではあるが重要な注意事項が欠けています。

全体として、ある日、返されたデータが SQL で安全に使用できないということが起こるかもしれません。is_numericTRUE

ただし、入力データを確認した後に停止せず、代わりに入力に基づいて新しいデータを作成した場合は、このデータが何であり、そうでないかを明確に判断できます。この場合、それは間違いなく整数値であり、それ以外のものではありません。( is_numericfloat 値でも機能しますが、それを知っていましたか? 意図していましたか? いいえ?)

もう 1 つの例: 入力が 16 進数、8 進数、または 2 進数表記の文字列の場合、is_numericが返さTRUEれますが、データベースはこの特定の表記法をサポートしていない可能性があります (たとえば、MySQL は 8 進数をサポートしていません)。そのため、期待した結果が得られません。 .

于 2013-09-05T22:20:54.907 に答える