0

XSSとSQLインジェクションについてユーザーからのデータをチェックしたいのですが、これが私が試した方法です

if (isset($_GET['membernumber'])) 
{
    $mem = htmlentities($_GET['membernumber']);
    $memberparamter = cleanData($mem);

}

しかし、どの方法がチェックするための最良/正しい方法ですか?

方法 1

function cleanData($data)
    {
        $data=mysql_real_escape_string($data);
        $data=trim($data);
        $data=stripcslashes($data);
        $data=htmlspecialchars($data);
        $data=strip_tags($data);
        return $data;
    }

方法 2

function cleanData($data)
    {
        $data=mysql_real_escape_string($data);
        $data=trim($data);
        $data=strip_tags($data);
        return $data;
    }

方法3

htmlspecialchars(stripcslashes(trim($data)))
4

4 に答える 4

4

前述のとおり、プリペアド ステートメントは、SQL インジェクションを防ぐ最善の方法の 1 つです。つまり、最終的なクエリ文字列の一部としてパラメーターを追加しないでください。パラメーター プレースホルダーを使用し、キー/値配列を介してパラメーターを追加する必要があります。

PDO を使用している場合は、次のページをご覧ください。準備済みステートメントについて詳しく説明しています。

http://php.net/manual/en/pdo.prepared-statements.php

PHP の入力フィルタの完全な説明 (およびサニタイズに関する優れた記事) は、次の場所にあります。

http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/

PHP 独自のフィルター/サニタイズ機能については、こちらをご覧ください。

http://www.php.net/manual/en/filter.filters.php

おそらく filter_var と filter_input 関数に興味があるでしょう:

また、この質問にはいくつかの良いヒントがあります: PHP でユーザー入力をサニタイズするための最良の方法は何ですか?

この質問にも非常に良いポインタがあります: PHP の入力サニタイズ関数で最も優れているのは何ですか?

于 2013-05-25T12:15:55.247 に答える
1

SQL インジェクション攻撃を防ぎたい場合は、準備済みステートメントを使用してください。あなたが何かをするとき

SELECT * FROM TABLE WHERE id = $_GET['x']

このクエリの問題は、変数が SQL ステートメントの一部と見なされることです。つまり、DBMS はクエリの残りの部分と共に変数を解析/コンパイルして実行します。効果的に、次のようなものを提供できます

$x = "1); DROP TABLE users;"

ステートメントの一部であるため、サーバーはそのコマンドを実行します。

準備されたステートメントを導入すると、変数のスコープはパラメーターのスコープに制限され、エスケープされていなくても、クエリの残りの部分には影響しません。これは、SQL ステートメントがデータベースによって解析/最適化/コンパイルされており、パラメーターをバインドするだけでよいためです。sql ステートメントはテンプレートです。

SELECT * FROM TABLE WHERE id = ?

準備済みステートメントを使用することの追加の利点は、速度です。テンプレートはすでに解析/コンパイルされているため、データベースはそのプロセスを繰り返す必要がないため、再利用できます。パラメーターを置き換えるだけで済みます。

PHP では、PDO と mysqli_* 関数の両方が準備済みステートメントをサポートしています。

mysqli については、http: //php.net/manual/en/mysqli.prepare.php を参照してください 。PDO については、 http: //php.net/manual/en/pdo.prepare.phpを参照してください。

XSS 攻撃に関しては、これでいくつかのアプローチを取ることができます。1 つ目は、ページに印刷するときにユーザー入力を単純にエスケープすることです。次のような非常に危険な文字:

 <>"" // and so on

同等の html エンティティに置き換えられます。の場合は<script>に変換され&lt;script&gt;ます。

ホワイトリスト アプローチをセットアップして、ユーザー入力に対して X タグのみを許可することもできます。これは、ユーザーが div や p タグなどの特定の html タグにアクセスする必要があるが、スクリプト タグなどにはアクセスできないコンテンツ指向のサイトで特に役立ちます。ホワイトリストにないタグは除外されます。非常に多くの方法があるため、これを完全にカバーすることは非常に困難ですが、それでもセキュリティを強化することができます。詳細については、 http://php.net/manual/en/function.filter-var.phpを参照してください。

3 番目のアプローチは、html タグをカスタム タグに置き換えることです (SO のように)。したがって、単語の前にある星印は、<strong>html タグなどを表す場合があります。

後者の 2 つを取り上げる場合でも、データをエスケープする必要があることに注意してください。彼らが言うように、猫の皮を剥ぐ方法は常に複数あるため、すべてのユーザー入力データは、フィルター処理されたとしても潜在的に危険であると見なす必要があります。

于 2013-05-25T12:45:21.433 に答える
0

それらのどれも十分に効果的ではありません。

あなたが行ったようにサニタイズを探し、準備されたステートメントを使用する必要があります。

于 2013-05-25T13:03:11.630 に答える
-3

XSS $data=htmlspecialchars($data); SQL インジェクション $data=stripcslashes($data);

データが db に保存されてから Web ページに表示される場合は、両方を行う必要があります。

于 2013-05-25T12:14:42.317 に答える