エスケープ処理について
解決済
回答 2
投稿
- 評価
- クリップ 1
- VIEW 891
いつもお世話になっています。
PHPで、入力値について、エスケープ処理をするように、という記述よく見ます。
現在、password_hash関数を使って、データベースと照合して、管理側のページにログインするようにしています。直接ページを開こうとしても、セッションが一致しなければ、再ログインを促すようになっています。
他では使っていない長めのパスワードを用いていて、管理側のページにログインするのは身内だけなのですが、やはり、エスケープ処理は管理者側のページといえど、全ての箇所、すみずみにほどこすものでしょうか?
パスワードの漏洩や、実は簡単にログインできる可能性がある?などにより、サーバーにアップする場合には、100%必須という認識になりますでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+6
現実問題として、管理画面がログインが必須だからという理由で脆弱性が多い状況はありがちなのですが、以下のような理由でエスケープ処理(またはプレースホルダの利用)はすべきです。
そもそも、エスケープ処理が必要な理由は、セキュリティのためではありません。たとえば、O'Reillyというという人名かつ出版社がありますが、人名検索で O'Reilly を検索しようとすると、エスケープ処理のないプログラム(あるいはプレースホルダを使用していない場合、以下同様)では、エラーとなり、目的を達することができません。すなわち、エスケープ処理をしていないプログラムは、脆弱性があるという以前に、目的を達成できない不完全なプログラムということになります。
SQL文の文字列(正確には文字列リテラルと言います)の中にシングルクォート(アポストロフィを兼ねる)がある場合、シングルクォートを重ねることになっていますが、これはSQLの文法上の要求です。前記のように、エスケープ処理を怠ったプログラムは、機能的に不完全であり、その理由は、SQLの文法上の要求をさぼっているからにほかなりません。
現実問題として、ログイン後にSQLインジェクション脆弱性がある場合、その悪影響を受ける局面はゼロではないものの限られます。
しかし、これは私の個人的な感覚ですが、「攻撃を受けなければ、SQLの文法を満たしてなくても、そして機能的に不完全でも構わない」というのは、プロの開発者としてとても恥ずかしいことのように感じます。難しいことを言う前に、まずSQLの文法くらい守ったらどうでしょうか?
上記の感覚に立てば、攻撃を受ける可能性がある(高い)場合はSQLの文法を守り、攻撃を受ける可能性がない(少ない)場合はSQLの文法違反もよしとするのは、かえって煩わしいように思います。攻撃の影響があるかないか、多いか少ないかを判断するのは、それなりに技量が必要であり、そのような技量を持つ方は私の知る限り、前記のようなサボりを考えたりはしません。
…とキツめの表現をしてしまいましたが、現実的な脅威についてもふれておかなければなりません。
SQLインジェクションの影響は、大目に見積もっても任意SQLの実行であり、それにより以下のような悪影響の可能性があります。
- データベース内の情報がすべて漏洩する
- データベース内の情報がすべて改変される
- データベース内の情報がすべて削除される
- (場合によっては)データベースサーバー内のファイルが漏洩あるいは改ざんされる
- (場合によっては)データベースサーバー上で任意のコマンドが実行される
- ログイン機能にSQLインジェクション脆弱性がある場合は認証を回避される場合がある
管理機能にログインできる権限のある人が、元々上記の権限を持っている場合、仮にSQLインジェクション脆弱性があっても、新たに脅威が増すということはありません。強いて言えば、悪意の管理者を想定した場合、犯人を追跡しにくくなる、ということはありえます。
上記から、質問者さんの環境では、ひょっとすると管理機能にSQLインジェクションがあっても許容可能であるのかもしれませんが、それは状況を仔細に調べないと確かなことは言えません。
であれば、「これはSQLの文法上の約束として必要なのだ」と淡々とエスケープ処理をした方が、心情的に受け入れやすいのではないでしょうか。
なお、エスケープ処理という表現を使ってきましたが、これは確かに面倒なもので、間違いやすく、間違えたことによる脆弱性が入りやすいので、エスケープ処理ではなくプレースホルダの利用を強くおすすめします。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+3
PHPで、入力値について、エスケープ処理をするように、という記述よく見ます
何故エスケープ処理をしなければならないかを理解する必要があります。
(IPA)安全なウェブサイトの作り方
ここから閲覧できる「安全なウェブサイトの作り方」(pdf)の「1. ウェブアプリケーションのセキュリティ実装」は最低限参照ください。
アプリケーションを作成するにあたってのセキュリティに関わる注意事項はほぼ網羅されています。(不足があったり新たな注意事項がある場合は適時改訂されます)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/15 11:40
ご提示いただいた、悪影響の例を考えると、一切の妥協は恐ろしくてできないですね。
約束事として、淡々と行っていきたいと思います。
2017/02/15 20:45