7

私はPHPアプリケーションの保護についていくつか読んでいますが、賢明な攻撃者に奇妙なことが起こる可能性があるmysqli_real_escape_stringため、MySQLテーブルにデータを挿入するときに使用する正しい機能であるように思えます. addslashes右?

しかし、私を混乱させていることが1つあります。ユーザーが入力したデータをユーザーにエコーバックしてデータを保護するaddslashesよりも、アドバイスを受ける方が良いと覚えているようですが、脆弱性があるようです。これは本当ですか、それとも間違って覚えていますか?htmlentitiesaddslashes

4

7 に答える 7

12

それらは、さまざまな目的のためのさまざまなツールです。

mysqli_real_escape_string は、データを MySQL に安全に挿入できるようにします (ただし、パラメータ化されたクエリの方が優れています)。

Htmlentities は、HTML ドキュメントへの出力に対してデータを安全にします

追加スラッシュは、他のいくつかの状況ではデータを安全にしますが、MySQL では不十分です

于 2010-02-06T18:49:02.490 に答える
6

データにはさまざまなコンテキストがあります。データベースにデータを挿入するコンテキストは、html/xml や電子メール メッセージをレンダリングするコンテキストとは異なる方法でエスケープする必要があります。

データベースに入るデータのエスケープは、準備済みステートメントを優先して、すべての新しいコードで非推奨にする必要があります。そうでないと言う人は誰でも、あなたに大きな不利益をもたらしています。

ブラウザに送信されるデータのエスケープは、ターゲットに応じてさまざまな方法でエスケープする必要があります。htmlspecialchars で十分な場合もあれば、htmlentities を使用する必要がある場合もあります。数値エンティティが必要な場合があります。すべてのニュアンスを知るために、調査を行う必要があるトピックです。

私が従う一般的なルールは、検証(フィルターではなく、間違っている場合は拒否)入力とエスケープ出力(コンテキストに基づく)です。

于 2010-02-06T18:55:49.183 に答える
0

PHP 5.2 以降のもう 1 つの興味深い解決策は、フィルター拡張機能を使用することです: http://www.php.net/manual/en/book.filter.php

ユーザー入力を検証およびサニタイズできます。多くの組み込みフィルターが利用可能であり、それらをフラグと組み合わせて動作を微調整できます。さらに、これらのフィルターは、int、float、email、特定の正規表現を検証/サニタイズするためにも使用できます。

私は個人的に、プロジェクトでフォームを検証し、ユーザーが入力したデータを出力するためにそれらを使い始めました。ただし、MySQL データベースに値を挿入するときは、セキュリティを強化するために準備されたクエリを使用します。これらのソリューションを組み合わせることで、ほとんどの SQL インジェクションと XSS タイプの攻撃を回避できます。

于 2010-02-06T19:24:30.027 に答える
0

注: UTF-8 でエンコードされたドキュメントで htmlentities() を使用することは避ける必要があります。見る:

注意してください ( phpwact.orgから引用):

最新の Web ブラウザーと UTF-8 の広範なサポートにより、これらの文字はすべて UTF-8 で直接表現できるため、htmlentities は必要ありません。さらに重要なことは、一般に、ブラウザーだけが HTML の特殊文字をサポートしていることです。たとえば、通常のテキスト エディターは HTML エンティティを認識しません。実行内容によっては、htmlentities を使用すると、他のシステムがコンテンツを「消費」する能力が低下する可能性があります。

また (確認されていませんが、合理的に聞こえます - ここのコメントから)、文字エンティティ (» や — など) は、ドキュメントが application/xml+xhtml として提供されている場合 (定義しない限り) 機能しません。ただし、数値形式を使用することはできます。

于 2010-02-06T19:13:18.050 に答える
0

サーバーで PHP5 を使用する場合に備えて、ほとんどのエスケープを行うPDO ライブラリを使用することもできます。

私は個人的にhtmlspecialcharsを好みますが、私を修正するかもしれません

于 2010-02-06T18:45:08.213 に答える
0

「エスケープ」機能を 1 つだけ持って、それが常に機能することを期待することはできません。特定の衛生ルーチンを必要とするさまざまな攻撃があります。この概念を理解する唯一の方法は、脆弱なコードを書き、それを悪用することです。エクスプロイト コードを記述することは、セキュリティ システムを理解するために不可欠です。

たとえば、次のクエリは SQL インジェクションに対して脆弱です。

$host=htmlspecialchars($_GET[host],ENT_QUOTES);
$name=htmlspecialchars($_GET[name],ENT_QUOTES);
mysql_query("select * from user where Host='$host' and Name='$name' ");

エクスプロイト: http://localhost/sqli_test.php?host= \&name=%20sleep(20)--%201

mysql の最適なエスケープ関数は mysqli_real_escape_string() ですが、これは失敗する可能性があります。

mysql_query("select * from user where id=".mysqli_real_escape_string($_GET[id]));

エクスプロイト: http://localhost/sqli_test.php?id=1%20or%20sleep(20)

実際、SQL インジェクションを処理する最善の方法は、エスケープ関数を呼び出すことではなく、SQL インジェクションに ADODB のパラメーター化されたクワイアを使用することです。XSS には htmlspecialcahrs($var,ENT_QUTOES) を使用します。OWASPのトップ 10 を読んでください。Web アプリケーションのセキュリティで問題が発生する可能性は十分にあるからです。

于 2010-02-06T21:27:17.280 に答える
0

はい、すべてのユーザー入力で mysqli_real_escape_string または PDO のようなライブラリを使用してください。エコー バックするときは、2 番目のパラメーターとして ENT_QUOTES を指定した htmlentities を使用します。これは、引用符を含む該当するすべての文字を HTML エンティティにエスケープするためです。

于 2010-02-06T18:49:30.560 に答える