質問

PHPとMySQLサーバー上のSQLクエリを実行しています。 SQLインジェクションを防ぐために、MySQL_REAL_ESCAPE_STRINGを使用しています。

私は次のようにして、数字のキャスティングにも(int)を使用しています:

$desired_age = 12;
$query = "select id from users where (age > ".(int)$desired_age.")";
$result = mysql_query($query);
.

その仕事

しかし、変数に大きな数字が大きい場合、それらはintより大きいので鋳造は失敗します。

$user_id = 5633847511239487;
$query = "select age from users where (id = ".(int)$user_id.")";
$result = mysql_query($query);
// this will not produce the desired result, 
// since the user_id is actually being cast to int
.

MySQL_REAL_ESCAPE_STRINGの使用を除いて、MySQL_REAL_ESCAPE_STRINGの使用を除いて、多数をキャストするもう1つの方法はあります。

役に立ちましたか?

解決

あなたは次のようなものを使うことができます:

preg_replace('/[^0-9]/','',$user_id);
.

文字列内のすべての非数値記号を置き換える。 しかし、実際にはそうする必要はありません。整数値がanywayが$ queryが構築されたときにmysql_real_escape_string()を使用するだけです。

他のヒント

ユーザーIDを生成している場合は、SQL Injectionまたは他の文字列の問題の可能性がないため、MySQL用にキャストする必要はありません。

ユーザー送信値の場合、 filter_var() (または is_numeric() )を確認するには、文字列ではありません。

入力を検証します。単にそれを脱出するだけでは、それが数字であればそれを検証してください。is_numeric()のようなトリックをするいくつかのPHP関数は、変数が数値か数値文字列

のどちらであるかを検索します。

http://www.php.net/is_numeric

サーバー側を使用して、準備されたステートメント(したがって、XYZ_REAL_ESCAPE_STRING()の必要性を削除します)および/またはIDを文字列として扱う。MySQLサーバーには、文字列< - >番号変換のための組み込み規則が組み込まれていて、IDフィールドの型/構造に変更する必要がある場合は、PHPコードも変更する必要がありません。(マイクロ - )最適化のための具体的なニーズがない限り、通常、データベース内のIDフィールドの構造と値の範囲についてこの種の仮定を作成する必要はありません。

$pdo = new PDO('mysql:...');
$pdo->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

$stmt = $pdo->prepare('SELECT age FROM users WHERE id=?');
$stmt->execute(array('5633847511239487'));
.

研究の後、私はそのようなセットアップに来ました

private function escapeInt($value)
{
    if (is_float($value))
    {
        return number_format($value, 0, '.', ''); // may lose precision on big numbers
    }
    elseif(preg_match('/^-?[0-9]+$/', $value))
    {
        return (string)$value;
    }
    else
    {
        $this->error("Invalid value");
    }
}
.

Floatsのケースは、$i = 184467440737095;が32ビットシステムでfloatになるため、弦にキャストしたときに科学表記にしたがっています。

のための単純な正規表現

*1で変数を掛けることもできます。 そしてそのクエリの準備をするPDOもあります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top