58

PHPには非常に多くの関数があり、これを使用するものもあれば、それを使用するものもあります。htmlspecialchars()、、などhtmlentities()を使用する人もいますstrip_tags()

正しいのはどれですか? また、皆さんは通常何を使用していますか?

これは正しいですか(もしあれば、より良いものを教えてください):

$var = mysql_real_escape_string(htmlentities($_POST['username']));

この行は、MySQL インジェクションと XSS 攻撃を防ぐことができますか??

ところで、XSS 攻撃と MySQL インジェクション以外に注意すべきことはありますか?

編集

結論として:

データベースに文字列を挿入したい場合、 を使用する必要はありませhtmlentitiesmysql_real_escape_string。データを表示するときは、 を使用htmlentities()します。

要約:

  • mysql_real_escape_stringデータベースへの挿入時に使用
  • htmlentities()Webページにデータを出力するときに使用
  • htmlspecialchars()いつ使用?
  • strip_tags()いつ使用?
  • addslashes()いつ使用?

誰かクエスチョンマークを埋めてくれませんか?

4

8 に答える 8

71
  • mysql_real_escape_stringデータベースへの挿入時に使用
  • htmlentities()Webページにデータを出力するときに使用
  • htmlspecialchars()いつ使用?
  • strip_tags()いつ使用?
  • addslashes()いつ使用?

htmlspecialchars() はいつ使用されますか?

htmlspecialcharsとほぼ同じhtmlentitiesです。違い: 文字エンコーディング。

両方とも、タグなどを開くために使用される 、 など<の制御文字をエンコードします。また、ウムラウト、ユーロ記号などの他の言語からの文字もエンコードします。Web サイトが UTF の場合は を使用し、それ以外の場合は を使用します。>&htmlentitieshtmlspecialchars()htmlentities()

strip_tags() はいつ使用されますか?

htmlspecialchars/entities特殊文字をエンコードして、表示されますが解釈されないようにします。strip_tagsそれらを削除します。

実際には、何をする必要があるかによって異なります。

例: フォーラムをコーディングし、ユーザーが投稿できるようにテキスト フィールドを提供します。悪意のある人は次のことを試みます。

pictures of <a href="javascript:void(window.setInterval(function () {window.open('http://evil.com');}, 1000));">kittens</a> here

何もしなければ、リンクが表示され、そのリンクをクリックした被害者に多数のポップアップが表示されます。

出力に htmlentity/htmlspecialchar を指定すると、テキストはそのまま表示されます。それを strip_tag すると、単にタグが削除されて表示されます。

pictures of kittens here

混合が必要な場合があります。たとえば、 <b>(strip_tags特定のタグをそこに残すことができます) のように、そこにいくつかのタグを残します。これも安全ではないため、XSS に対して本格的なライブラリを使用することをお勧めします。

追加スラッシュ

古いバージョンの PHP マニュアルを引用するには:

データベース クエリなどで引用する必要がある文字の前にバックスラッシュを付けた文字列を返します。これらの文字は、一重引用符 (')、二重引用符 (")、バックスラッシュ ()、および NUL ( NULLバイト) です。

addslashes()の使用例は、データベースにデータを入力する場合です。たとえば、O'reillyという名前をデータベースに挿入するには、エスケープする必要があります。DBMS 固有のエスケープ関数 (MySQL の場合は mysqli_real_escape_string()、PostgreSQL の場合は pg_escape_string() など) を使用することを強くお勧めしますが、使用している DBMS にエスケープ関数がなく、DBMS が \ を使用して特殊文字をエスケープする場合は、この機能を使用できます。

現在のバージョンでは、表現が異なります。

于 2009-07-30T13:02:02.753 に答える
10

私はこの簡単なチェックリストを考えました:

  • 常に HTTPS を使用してください。HTTPS を使用しないと、サイトは完全に暗号化されません。いいえ、クライアント側で物事を暗号化して送信することはできません。考えてみてください。無効な HTTPS 証明書も、MITM攻撃に対して脆弱になります。証明書を購入する余裕がない場合は、Let's Encrypt を使用してください。
  • htmlspecialchars()PHP コードからの出力、つまりユーザー入力を含む、またはユーザー入力からの出力に対して常に使用します。ほとんどのテンプレート エンジンは、これを簡単に行うのに役立ちます。
  • php.iniスクリプトが Cookie にアクセスできないようにするには、HTTP のみのフラグを使用します。
  • セッション関連の問題を防ぐ
    • ユーザーPHPSESSID(セッション ID) を Cookie の外部に公開しないでください。誰かが他の誰かのセッション ID を知った場合、その ID を使用して自分のアカウントにログインできます。
    • 関数には細心の注意を払ってくださいRemember me。おそらく少し警告が表示されます。
    • ユーザーがサインインするとき (または適切なもの) にセッション ID を更新します。
    • 非アクティブ セッションのタイムアウト
  • Cookie は決して信頼しないでください。Cookie は、スクリプト/ユーザーによっていつでも変更、削除、修正、作成される可能性があります。
  • SQL 関連の問題を防止する
    • 常に準備済みステートメントを使用してください。準備されたステートメントにより、ユーザー入力が個別に渡され、SQL インジェクションが防止されます
    • コードが失敗したときに例外をスローするようにします。場合によっては、何らかの理由で SQL サーバーがダウンしている可能性があります。ライブラリのようなものはPDO、デフォルトでそのエラーを無視し、ログに警告を記録します。これにより、DB から取得した変数が null になり、コードによってはセキュリティの問題が発生する可能性があります。
    • 一部のライブラリは、準備済みステートメントをPDO エミュレートするようなものです。それをオフにします。
    • データベースでエンコーディングを使用UTF-8すると、事実上すべての文字を保存でき、エンコーディング関連の攻撃を回避できます
    • クエリに何も連結しないでください。のようなもの$myquery = "INSERT INTO mydb.mytable (title) VALUES(" . $user_input . ")"は、SQL インジェクションの大きなセキュリティ リスクがあることを意味します。
  • アップロードされたファイルを拡張子のないランダムなファイル名で保存します。ユーザーがファイル拡張子付きのファイルをアップロードすると.php、コードがそのファイルをロードするたびにそのファイルが実行され、ユーザーがバックエンド コードを実行できるようになります。
  • CSRF 攻撃に対して脆弱でないことを確認してください。
  • PHP コピーを常に更新して、最新のセキュリティ パッチとパフォーマンスの向上を確保します。
于 2016-06-16T01:24:17.857 に答える
6

エンコードが必要なシステムに入る時点でのみデータをエンコードします。そうしないと、実際のデータを操作したい状況に遭遇します。

SQL インジェクションの場合 - PHP で SQL インジェクションを防ぐにはどうすればよいですか? で説明されているように、バインドされた変数を使用します。(準備されたステートメントについて話しますが、保護を与えるのは拘束力であり、準備ではありません)。

XSS の場合 - HTML またはテキストが指定されているポイントで HTML に書き込んでいる場合。ドキュメントを生成する時点で htmlentities を使用します。データベースにその形式でデータを保存することは避けます (ただし、CPU パフォーマンス/ディスク アクセス時間が増加して問題が発生する書き込みがまれで読み取りが頻繁に行われるシステムでは可能ですが、列の raw_ および html_ バージョンが必要になります)。 … または単に memcached などを使用します)。

ユーザーに URL を入力させる場合は、javascript:do_evil()実行される有効な URI と同様に、より注意する必要があります (たとえば、クリックされたリンクの href または (一部のブラウザーでは) 読み込まれたばかりの画像の src として)。

于 2009-07-30T11:09:05.940 に答える
3

データベースに挿入する場合は mysql_escape_string() を使用し、HTML を表示する場合は htmlentites のみを使用する必要があります。単純なインジェクション攻撃を防ぎたい場合はこれで十分ですが、Web アプリを開発する際に注意すべき他の多くのセキュリティ問題があることは間違いありません。もう 1 つの主要な問題は、クロス サイト リクエスト フォージェリです。

于 2009-07-30T11:08:22.963 に答える
2

データベースにデータを挿入したり、データベースにクエリを実行したりするときに、htmlentities() を使用しません。データベース内のデータがエンティティとして保存されている場合、そのデータは html エンティティを理解するものにのみ役立ちます。

出力の種類ごとに異なるエスケープ メカニズムを使用する必要があります。たとえば、SQL - mysql_real_escape_string()、HTML - htmlentities()またはhtmlspecialchars()、シェル - escapeshellarg()です。これは、「危険な」文字がそれぞれに異なるためです。どの出力メディアに対してもデータを安全にする魔法のような方法はありません。

于 2009-07-30T11:11:13.673 に答える
1

このサイトPHP Security Consortiumを見てください。PHP セキュリティ (SQL インジェクションと XSS を含む) の全体的な概要を説明するのに適したサイトであることがわかりました。

于 2009-07-30T11:07:15.553 に答える