1. is_numberic 関数の概要
is_numberic 関数は、一部の国内 CMS プログラムで使用されています。まずこの関数の構造を見てみましょう。
bool is_numeric (mixed $var)
If var が数値または数値文字列の場合は TRUE を返し、それ以外の場合は FALSE を返します。
2. 関数は安全ですか?
次に、この関数が安全かどうかを示す例を見てみましょう。
$s = is_numeric($_GET['s'] )?$ _GET['s']:0;
$sql="insert into test(type)values($s);" //values('$s' ではなく、values($s) です) )
mysql_query ($sql);
上記のフラグメント プログラムは、パラメータ s が数値であるかどうかを判断し、数値である場合は数値を返し、そうでない場合は 0 を返します。その後、クエリのためにデータベースに取り込まれます。 (この方法では、SQL ステートメントを構築できません)
「1 または 1」を s パラメーターの値として 16 進数の 0x31206f722031 に変換します。
プログラムの実行後、以下に示すようにデータベースにクエリを実行します。
このテーブルのフィールドを再度クエリし、フィルタリングせずに別の SQL ステートメントを取り込むと、2 つのインジェクションが発生します。
3. 試しないでください。この関数を使用する場合は、標準 SQL ステートメントを使用し、条件に一重引用符を追加して、16 進数 0x31206f722031 がデータベースに表示されるようにすることをお勧めします。 1も1もないでしょう。