2011-11-13 2 views
0

私が管理しているサイトの1つにプレスリリースのリストが含まれています。各プレスリリースのタイトルは詳細ページへのリンクです。詳細ページからのSQLインジェクションの防止

タイトルと詳細は、mysql dbから取得します。

詳細ページへのURLリンクは、私は、パラメータにSQLインジェクションのコードを追加することから誰かを防ぐことができますどのように../pr.php?ID=457

のですか?

パブリックサイトにはユーザー入力フォームがありません。

答えて

-1

URLからIDを取得するコードの行を見つけ、それはこのようになります。

$ID = $_GET["ID"]; 

変更し、それにのスクリプトを追加します:

INTにキャストすると誰もそのVAに任意のSQLを挿入することはできませんライバル。また、$ _SETVER ["QUERY_STRING"]を手動で解析することで、URLの変数が$ _REQUESTではなく、$ _GET変数を通じて使用されているかどうかを確認する必要があります。

さらに、そのスクリプトにURLで渡されたIDがIDであることを確認します。さらに多くのIDがある場合は、そのIDをすべて保護する必要があります。

整数値のみを受け入れる変数を固定するのは簡単ですが、この変換を行うだけで済みます。変数が任意の文字列である場合は難しくなります。使用するデータベースとドライバのタイプに応じて、その文字列または同様のものに対してmysql_real_escape_string()を使用する必要があります。

あなたはSQLインジェクションへの本格的なユニバーサルソリューションが必要な場合は、注射を防ぐために、バインディング自動データとともにPDO拡張モジュールを使用する方法について説明し、私の別の最近の答えに見て、下記のリンク:

stackoverflow.com/questions/8105508/does-this-work-to-stop-sql-injections/8105598#8105598

+0

ちょうどあなたが 'の' id'を持つレコードを持っていない期待しましょう:あなたはまた、に興味がある可能性があり

if (filter_has_var(INPUT_GET, "ID") && filter_input(INPUT_GET, "ID", FILTER_VALIDATE_INT, array("min_range"=>1)) { $id = filter_input(INPUT_GET, "ID", FILTER_SANITIZE_NUMBER_INT); // then show data for $id } else { // show default page } 

0 'となる。 – PeeHaa

+0

「0」との違いは何ですか?しかも、idの値が「0」のレコードは誰も保持しません。 –

+0

文字列 'test3'にint型をキャストすると、 'expected'の代わりに' 0'が返されます。 http://codepad.org/Nrb5Wufb – PeeHaa

4

できません。サーバーにネットワーク接続できるユーザーは、必要なデータを送信できます。

代わりにrender the injection attempts harmlessにする必要があります(404 Not Found応答を送信するなどして、データから0行戻った場合は適切に処理してください)。上部に、

$ID = (int) $_GET["ID"]; 

それとも、より良い、より安全な:

1

例では、IDパラメータがゼロではない正の整数でなければならないと仮定しています。 @Czarekからの回答で十分です。

$id = (int) $_GET["ID"]; 

それとも番目の組み込み関数intval()付き:

$id = intval($_GET["ID"]); 

しかし、入力は一切の整数値(例えば「ABC」)を持っていないので、あなたにidように注意する必要がある場合、これらのメソッドの両方が0を返します0を指定すると、ユーザーがアクセス権を持たないと思われるものが明らかになることはありません。 id値は1から始まり、そうであれば安全です。

さらに柔軟性を高めるために、PHPの組み込みfilter拡張を使用することもできます。

関連する問題