2009-09-04 5 views
0

iは、MySQLデータベースからテキストを取得すると私は、URLにIDによってそれを得る:intvalまたはis_numeric? PHP

site.php ID = 1とするので、SQLインジェクションを防ぐために最も安全であると考えられるもの

の?とスタッフ。この方法は正しいです:

<?php 
$news_id = $_GET['news_id']; 

if(!is_numeric($news_id)) die('Wrong'); 

//mysql_query and stuff here 
?> 

ORこの方法:

<?php 
$news_id = $_GET['news_id']; 

if(!intval($news_id)) die('Wrong'); 

//mysql_query and stuff here 
?> 
+0

is_numericには少し注意してください。これは16進数の文字を許可します(それほど大きなセキュリティではありません)。実際に数値をチェックする場合は、ctype_digitを使用して、intではなく文字列を入力してください。 ctype_digit((int 123)); // false ctype_digit( '123'); // true – Stefan

答えて

0

IS_NUMERICは、trueまたはfalseを返していませんINTVAL

$number = "4"; // string ? int ? 

、それをチェックするための良い方法ではありません。あなたが書いたようにそれを使うことはできません。 news_idが(> 0)正であると仮定すると、この1

if(intval($news_id) === (int)$news_id){ 
//code goes here 
} 

または

if(intval($news_id) == $news_id){ 
//code goes here 
} 
+0

IDの有効範囲は何ですか?それはゼロか1で始まるのですか? –

+0

この回答はまったく間違っていますint_valのような機能はありません –

+0

@Traveling_Monkクールダウン、私はintvalを意味していましたが、ちょうどタイプミスがあります。 –

3
$news_id = (int)@$_GET['news_id']; 
if ($news_id <= 0) die ('Wrong'); 

を試してみてください。

1

intvalを使用すると、news_idが0でない場合、intvalは常に0を返します。したがって、news_id = 0は使用できません。あなたの場合、より適切で安全なのは is_numericです。

+0

'news_id'は生成されたカラムであり、決して0を含んでいない可能性があります。そうであれば、クエリにintval($ id)を使うことに害はありません。要求に不正な識別子が含まれていると、「見つからない」というエラーが表示されてしまいます。もちろん、0が使用されていない値であれば、出力をテストし、別のエラー( "有効な識別子を指定してください")を要求を拒否することができます。 – Rob

6

SQLインジェクション攻撃に対処する適切な方法である準備文を使用するだけではどうですか。

しかし、intvalを整数に変換し、それをプリペアドステートメントに入れるだけで、int値がゼロまたは負であるため、保護されます。クエリ。

0
if (preg_match("/^[1-9]+\d*$/", $news_id)){ 
    // you're good to go 
} 
+1

"0"を含む先頭の「0」は除外されます。それは意図的なのでしょうか?また、 '+'は有用ではありません。 –

関連する問題