1

ユーザーからの入力 (POST と GET の両方) をフィルター処理して、SQL インジェクションやその性質のものを回避するための業界標準は何ですか。これまでのところ、filter_input() および mysql_real_escape_string() 関数を使用していますか? それで十分ですか?そうでない場合は、他にどのような方法を使用する必要がありますか?

4

5 に答える 5

3

SQLインジェクションを回避するためのエスケープと、入力のフィルタリングまたは検証は、2つの異なるものです。SQLインジェクションを回避するために入力をフィルタリングする必要はありません。また、入力のフィルタリングは必ずしもSQLインジェクションに役立つとは限りません。

SQLインジェクションを回避するには、入力をエスケープしてクエリの構文を混乱させないようにするか、問題を完全に回避するプリペアドステートメントを使用します。フィルタリングされているかどうかに関係なく、この入力に何が含まれているかは関係ありません。データベースに適切なエスケープ関数を使用して一度エスケープするか、プリペアドステートメントを使用すると、SQLインジェクションについて心配する必要がなくなります。

さまざまな理由で入力をフィルタリングまたは検証します。これは主に、データベースで特定の値を許可したくないためです。これは、これらの値がデータベースに配置される方法(SQLインジェクションが発生する可能性がある場所)とはまったく別のものです。

出力では、出力メディアに従って値をエスケープする必要があります。これは、SQLクエリに値を入れるときにエスケープするのと同じ理由で、悪用される可能性のある構文の混乱を避けるためです。つまり、Webページに出力するときは、HTMLで値をエスケープします。繰り返しますが、それがどのような値であるかは問題ではありません。適切にエスケープされていれば、何でもかまいません。

于 2011-02-23T06:03:45.110 に答える
3

従うべき重要なルールはFIEOです。フィルター入力エスケープ出力。

ユーザーから取得して保存する情報は、サーバー側でフィルタリングする必要があります。これを行うには、mysql_real_escape_string. データベースに値を追加する前に、これは常に最後に行う必要があります。ユーザー入力を検証し、それが意図したとおりであることを確認し、正規表現を使用する必要がある場合はシンボルやタグを削除し、その長さとその他のルールを確認します。これらすべてを実行してから、最後に MySQL 関数を適用しますmysql_real_escape_string

Web ページに表示している動的な情報 (つまり、ユーザー生成コンテンツのデータベースから取得した情報、またはユーザー入力から直接取得した情報) は、エスケープする必要があります。シンボルを URL エンコードし、HTML タグを削除 (またはエンコード) する必要があります。

専門家の Chris Shiflett による Web セキュリティに関する次のプレゼンテーションをご覧になることを強くお勧めします。

http://www.slideshare.net/shiflett/evolution-of-web-security

于 2011-02-23T07:53:33.960 に答える
0

peardbやcakephpormなどのデータベースにデータを保存するためにデータベースlibを使用することをお勧めします

この方法では、インジェクションのためにデータベースを攻撃できることに注意してください。

于 2011-02-23T05:55:44.840 に答える
0

PHP でのデータベース接続には PDO を使用できます。PDO は PHP データ オブジェクトの略です。mysql_connect より優れています。PDO はオブジェクト指向であり、より多くの保護を保証します。

http://www.php.net/manual/en/class.pdo.php

$link = new PDO ( $dsn, $user, $password, $options ) ;
于 2011-02-23T06:10:24.027 に答える
0

問題を引き起こす可能性のある文字をエンコードするには、 htmlspecialcharsを使用します。データの検証は異なります。入力フィールドに何を期待しているかによって異なります。

于 2011-02-23T06:20:32.510 に答える