パラメータ化されたSQLは、ユーザー入力と動的SQLを処理する方法ですが、文字列からint型(またはdouble型、long型など)あなたが求めている入力が数字の場合は効果的ですか?SQLインジェクションの保護 - 文字列からint型へのキャスト
私はこの技術だけでSQLインジェクションに関して間違いがないかと思います。
パラメータ化されたSQLは、ユーザー入力と動的SQLを処理する方法ですが、文字列からint型(またはdouble型、long型など)あなたが求めている入力が数字の場合は効果的ですか?SQLインジェクションの保護 - 文字列からint型へのキャスト
私はこの技術だけでSQLインジェクションに関して間違いがないかと思います。
私は専門家ではありませんが、これは安全であると合理的に確信しています。
しかし、なぜチャンスを取るか?パラメータ化されたSQLを使用すると、それを心配する必要はありません。
さらに、SQLのパラメータ設定には、注入保護だけでなく、他の利点もあります。
SQLインジェクション防止に関しては安全ですが、例外が発生するにつれて本当に良いアイデアはありません。可能な限り避けたい例外は高価です。あなたは本当に適切に入力を浄化するべきです。もちろん、ユーザーは値をint32値内の任意の範囲に変更できます。
文字列が整数にキャストされる前に有効な数値だった場合、それは安全です。しかし、intにキャストする前に、それが有効な整数であることを確認する必要があります。
あなたが使用しているサーバー側の言語はわかりませんが、PHPではis_numeric()関数を使用できます。例えば:
$strYouExpectToBeInt = $_POST['id'];
try {
if (false === is_numeric($strYouExpectToBeInt)) {
throw new Exception('id is not a numeric string or a number');
}
$strYouExpectToBeInt = (int)$strYouExpectToBeInt;
if (false === is_int($strYouExpectToBeInt)) {
throw new Exception('id is not a valid integer');
}
// everything is ok, you can use $strYouExpectToBeInt
// in SQL query now
} catch (Exception $e) {
echo $e->getMessage();
}
おそらくが、テストの価値。
リチャードの答えに関しては、IsNumeric()が数値への実際のCASTよりも有効な数値として受け入れる点で少し自由度があることがあります(実際にはローカライズ設定に依存します)。 "-0"、 "3E-5"、 "5.000.000"のようなものはIsNumericを満たすことがありますが、正しくキャストしません。だから、私は通常、実際のキャストステートメントの周りをキャッチする完全な試みを行う。
これは、私がis_int()を使用して、キャストした後に確実に行う理由です。 –
おい、あなたはなぜ左の人生で定数を使うのですか? – arthurprs