書籍やインターネット上のphp.netの情報や例が誤解を招く、あいまいであるため、あなたの混乱はかなり一般的です。 Webアプリケーションを開発するときに学ぶことができる最も重要なことはfilter input, escape outputです。
フィルタ入力 これは、任意のデータ入力用フォーム上のユーザーによって提供されるか、または他のソースからファイルが提供するかどうか、属していないものを除外することを意味します。たとえば、数値が必要な場合は、数値以外の文字を除外します。別の例は、データの最大長を制限/保証することです。しかし、これで夢中になる必要はありません。たとえば、文字通り任意の文字の組み合わせを含むことができるテキスト行が必要な場合、フィルタを使用しようとすると、おそらくユーザーを苛立たせるだけです。
したがって、通常は入力データを必要に応じてフィルタリングしてデータベースに格納します。 エスケープ出力によって意味される何
エスケープ出力 は、適切に与えられたメディアのための安全なデータを作ることです。ほとんどの場合、このメディアはWebページ(html)です。しかし、それはプレーンテキスト、xml、pdf、イメージなどであってもかまいません。htmlの場合、これはhtmlspecialchars()
またはhtmlentities()
を使用することを意味します(hereの違いを読むことができます)。他のメディアタイプの場合は、必要に応じてエスケープ/変換します(または、必要であれば、まったく変換しないでください)。
今、あなたの質問には、SQLクエリパラメータとして使用される入力データにhtmlspecialchars()
を使用する必要があるかどうかではありません。答えはいいえだ。どのような方法でもデータを変更しないでください。
はい、$ _POSTに含まれるデータは、危険なものとみなす必要があります。。 1)あなたがしているように、準備されたステートメントとバインドされたパラメータを使用してSQLインジェクションを防ぎ、2)htmlに置くと$ _POSTにあるデータを適切にエスケープ/変換する必要があります。
はあなたのためにこれらの詳細を扱うPHPのための多くのフレームワークがあり、私はあなたが選んで、1を使用することを推奨します。ただし、そうしないと、安全で安全なアプリケーションを構築できます。フレームワークを使用するかどうかにかかわらず、I 強くは、OWASPが推奨する推奨事項を読むことをお勧めします。そうしなければ、あなたのWebアプリケーションのセキュリティ上の悪夢に陥るだけです。
ユーザーがログインフォームに記入し、ユーザー名/パスワードが実際に有効になった後、実際に、いくつかのセッション変数が作成されます。そのうちの1つは '$ _SESSION ['user'] = $ username'で、ナビゲーションバーに表示されます。だからこの場合、 'htmlspecialchars'を使うべきでしょうか? – GPraz
@GPraz - どこからでも(セッションスーパーグローバルを含む)ユーザー名(プレーンテキストとして表示)を取得し、それをHTML文書に入れるときは、 'htmlspecialchars'を使うべきです。 – Quentin