2

私はPHPを初めて使用し、ここでチュートリアルをフォローしています: リンク

ユーザーが入力にphpコードを記述して、基本的にサイトを台無しにするのはかなり怖いですよね?

さて、今私は少し妄想的であり、私は私にいくつかの習慣ができたらそれらを詰め込もうとするよりも、すぐにセキュリティのベストプラクティスを学びたいと思っています。

私はPHPを初めて使用するので(文字通り2日前に習得しました)、混乱することなく、ほとんど何でも簡単に学ぶことができます。

私のサイトでシェナニガンを防ぐには、他にどのような方法がありますか?:D

4

5 に答える 5

4

PHPアプリケーションを開発する際に留意すべき点がいくつかありますがstrip_tags()、それらの1つにのみ役立ちます。実際strip_tags()には、効果的ではありますが、必要以上のことを行う可能性がありhtmlspecialchars()ます。状況によっては、危険な可能性のある文字をで変換することも望ましい場合があります。

一般に、すべては2つの単純なルールに帰着します。すべての入力をフィルタリングし、すべての出力をエスケープします。ここで、入力と出力を正確に構成するものを理解する必要があります。

出力は簡単で、アプリケーションがブラウザに送信するものはすべて出力されるため、htmlspecialchars()自分で作成していないデータを出力するたびに、またはその他のエスケープ関数を使用してください。

入力は、PHPコードにハードコーディングされていないデータです。POSTを介したフォーム、GETを介したクエリ文字列、Cookieからのデータはすべて、ニーズに応じて最も適切な方法でフィルタリングする必要があります。データベースからのデータでさえ、潜在的に危険であると見なされるべきです。特に共有サーバーでは、アプリに影響を与える可能性のある方法でデータベースが他の場所で侵害されたかどうかはわかりません。

データをフィルタリングするには、さまざまな方法があります。選択した値のみを許可するホワイトリスト、期待される入力形式に基づく検証などです。私が決して提案しないことの1つは、ユーザーから取得したデータを修正してみることです。ユーザーにルールに従ってプレイしてもらいます。期待したものが得られない場合は、クリーンアップを試みるのではなく、リクエストを拒否します。

データベースを扱う場合は、SQLインジェクションに特別な注意を払う必要があります。この種の攻撃は、データベースに送信するクエリ文字列を適切に構築しないことに依存しているため、攻撃者は悪意のある命令を実行しようとしてそれらを偽造できます。常に、mysqli拡張機能またはPDOmysql_real_escape_string()を使用したプリペアドステートメントなどのエスケープ関数を使用する必要があります。

このトピックについてはまだまだ言いたいことがありますが、これらのポイントから始めることができます。

HTH

編集:明確にするために、「入力のフィルタリング」とは、入力データを変更するのではなく、何が良いか、何が悪いかを判断することを意味します。私が言ったように、ブラウザに出力されない限り、ユーザーデータを変更することは決してありません。

于 2010-02-13T20:06:39.573 に答える
2

strip_tagsは実際に使用するのに最適なものではなく、すべての場合に保護されるわけではありません。

HTML Purify: http: //htmlpurifier.org/

着信データを処理するための本当に良いオプションですが、それ自体がすべてのユースケースに対応できるわけではありませんが、それは間違いなく良い出発点です。

于 2010-02-13T19:55:50.293 に答える
2

あなたが言及したチュートリアルは、セキュリティについて少し誤解を招くものであると言わざるを得ません。

$_GETと$_POSTの値を直接操作したくないことに注意することが重要です。常にそれらの値をローカル変数に送信し、そこで操作します。$ _GETおよび$_POSTに直接アクセス(または出力)する場合、値にはいくつかのセキュリティ上の影響があります。

これはナンセンスです。値をローカル変数にコピーすることは、$_GETまたは$_POST変数を直接使用するよりも安全ではありません。

実際、データに関して本質的に危険なものは何もありません。重要なのはそれをどうするかです。を含む$_POST変数があるのには完全に正当な理由があります; rm -rf /。これは、たとえばHTMLページに出力したり、データベースに保存したりする場合に適しています。

system安全でないのは、またはのようなコマンドを使用している場合のみですexec。そして、それはあなたが使用している変数について心配する必要がある時です。この場合、ホワイトリストのようなものを使用するか、少なくとも値を実行することをお勧めしますescapeshellarg

同様に、データベースへのクエリの送信、ブラウザへのHTMLの送信なども同様です。宛先に適切なエスケープ方法を使用して、データを別の場所に送信する直前にデータをエスケープします。

于 2010-02-13T20:26:12.527 に答える
1

strip_tagsは、htmlのすべての部分を削除します。より洗練されたソリューションは、ホワイトリストに基づいています(つまり、特定のhtmlタグを許可します)。優れたホワイトリストライブラリはhtmlpurifyerhttp : //htmlpurifier.org/です。

そしてもちろん、データベース側ではmysql_real_escape_stringやpg_escape_stringなどの関数を使用します

于 2010-02-13T19:57:14.427 に答える
1

まあ、おそらく私は間違っていますが...すべての文献で、私は読んだことがあります、人々はhtmlspellcharsを使用する方がはるかに良いと言います。

また、入力データをキャストするためにかなり必要です。(たとえば、intの場合、それがユーザーIDであることが確実な場合)。

さて、事前に、データベースの使用を開始するときは、SQLインジェクションを防ぐためにmysql_escape_stringの代わりにmysql_real_escape_stringを使用してください(一部の古い本では、まだmysql_escape_stringと書かれています)。

于 2010-02-13T20:06:24.567 に答える