2011-11-05 16 views
7

私のint関数を使ってユーザが提出した変数をフィルタリングする習慣がありました。これは、数字(0でない場合)とmysqlクエリの変数を引用しないことです。mysqlクエリのint値を引用符で囲んでください

悪い練習ですか?パフォーマンス上の理由からこれを行うことにしました。加えて、私はいつも数字を引用符で囲むべきではないと考えてきました。

例:

if($perpage != $user['perpage']){ 
if($perpage == 50 || $perpage == 100 || $perpage == 200){ 
$DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]", __FILE__, __LINE__); 
} 
} 
+0

のようにあなたのコードを作ると思います私はこれを行うことでパフォーマンスの面で何かを得るかどうかを知ることに興味があります。明らかに私はそれらを引用符で囲んでもっと安全に感じるでしょう。 – domino

+0

あなたはファイルとエラーの行を取得する古風な方法を使用しているようです。今日は手動で設定する必要はありません。パフォーマンスについては、trigger_error()またはdebug_backtrace()が –

+0

を実行します。あなたは今それについて何か問題を経験していますか? –

答えて

5

aha!興味深いのはここ!

  1. あなたは一般的です。場合は、

  2. それはあなたのコードはより多くの正気と一貫なり、文字列

    • 、数値として数字を処理するために、常にあなたが文字列として番号を偽装ん許しませんmysqlのでstrict_mode設定、
    • 良いとは限りませんオン。
  3. 実際にあなたの実装では、注入が可能です!のは、それを見つけるためにあなたの宿題のためにそれを残してみましょう:)

ここでは、この注入を説明する、あなたのためのリファレンスです:http://php.net/language.types.type-juggling

ので、私はこの

$perpage = intval($perpage); 
if($perpage != $user['perpage'] && in_array($perpage,array(50,100,200) { 
    $DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]"); 
} 
+0

私はあなたが2番目の "if"を見逃したと思います。値は50,100、または200にしかなりません。注入の余地はありません。 ;) – domino

+0

最初の試行に失敗しました:) –

+0

私はそれを取得しません。これらの3つの数字以外のものがクエリに渡された場合、それは脆弱です。とにかく、$ perpageは何か他のものにすることはできません。 – domino

2

は限り値が適切にそれらを使用する前に、PHPのINTVALメソッドを使用して確認されているように、私はそれで問題が表示されません。 int値の引用符が構文エラーだと思うDBとやりとりする必要がある場合は、これを行うことで将来的にいくつかの恩恵を受けることができます。 (私はMS SQLサーバがそうすると信じています)

関連する問題