質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

5回答

874閲覧

エスケープの必要な処理とは?

退会済みユーザー

退会済みユーザー

総合スコア0

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

3グッド

4クリップ

投稿2018/04/12 00:39

編集2018/04/12 01:30

作成したスクリプトをチェックするため、文字列のエスケープの必要な処理に関して調べています。

エスケープは、特定の文字が何らかの制御をする処理の前処理として必要であるという理解です。

以下の処理に対して、エスケープが必要であると認識していますが、他にもあるでしょうか?

・html 表示
・SQL 文の作成
・正規表現のパターン
・exec、system いったコマンド実行関数の引数

網羅性のある資料をどこかで見た気もするのですが、ちょっと辿れなくて^^;
ご教示いただけると幸いです。

defghi1977, umyu, CottonMori👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

「他にもあるでしょうか」ということであれば、以下のように数多くありますが、現実的に問題になることはあまりないものが多いです。

  • HTML
  • SQL(主に文字列リテラル)
  • JavaScript(主に文字列リテラル)
  • XML
  • JSON
  • XPATHクエリ
  • LDAPクエリ
  • PHPのソースコード(主に文字列リテラル)
  • 正規表現
  • 書式文字列
  • シェルの命令(OSコマンドインジェクション)
  • URL(状況によってはHTTPヘッダインジェクション)
  • Set-Cookie(HTTPヘッダインジェクション)…URLエンコードに含めてもよいか
  • シリアライズ形式

書式文字列攻撃は一般的にウェブアプリの場合問題になるケースは少ないですが、WordPressは潜在的にこの問題を抱えており、以下の脆弱性の原因になりました。

PHPのソースコードの一部を生成することは好ましくありませんが、例えば以下の脆弱性はこのパターンです。文字列リテラルではなくPHPコメントなので、エスケープはできずサニタイズになっていますが、大きくとらえれば類似の問題でしょう。

以下は、正規表現インジェクションの例です。

例示した脆弱性は理解が難しいものですが、既に指摘のあるように、書式文字列や正規表現等を外部から読み込むという仕様がそもそもよろしくないので、エスケープしなければならないという状態は好ましくありません。

投稿2018/04/12 13:52

編集2018/04/12 14:03
ockeghem

総合スコア11701

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/12 14:35

回答、ありがとうございます。色々ありますね^^; リンク先の記事も非常に参考になりました。 まだちょっと理解できていない内容も多いので、読み込んでみます。
退会済みユーザー

退会済みユーザー

2018/04/13 05:23

大分理解が進みました。 少し確認させてください。 > PHPのソースコード(主に文字列リテラル) こちらは eval を意識したものでしょうか? > XML > JSON こちらは、フォーマット変換時におけるエスケープの代表的なものとして上げていただいたと理解しました。(CSV等の他のフォーマット変換もこのカテゴリーと理解しました。) 多分、大量にある中、上げていただいた 2 つは、フォーマット変換後に脆弱性となりうる使われ方をする可能性が高いのだと認識しましたが、正しいでしょうか? > XPATHクエリ > LDAPクエリ こちらは全く意識にありませんでした^^; 勉強して出直します!
ockeghem

2018/04/13 05:39

> > PHPのソースコード(主に文字列リテラル) > こちらは eval を意識したものでしょうか? 違います。稀にですが、PHPのソースコードを生成するスクリプトがありまして、そのようなケースを想定しています。evalはevalでありますが。 > > XML > > JSON > こちらは、フォーマット変換時におけるエスケープの代表的なものとして上げていただいたと理解しました。(CSV等の他のフォーマット変換もこのカテゴリーと理解しました。) > 多分、大量にある中、上げていただいた 2 つは、フォーマット変換後に脆弱性となりうる使われ方をする可能性が高いのだと認識しましたが、正しいでしょうか? はい。そのとおりです。json_encode等を使っている場合はまだよいのですが、たまにライブラリを用いずにJSONを生成するケースがあり、脆弱性が入りやすくなります。
退会済みユーザー

退会済みユーザー

2018/04/13 06:55

今回、いろいろと理解が進みました。 ありがとうございます。
guest

0

書式文字列攻撃

ユーザーから受け取った文字列でprintfの書式を組み立てる、あるいはそのままprintfで出力してしまうと、意図しない書式からデータ流出が起きる書式文字列攻撃が存在します。

URL関係の脆弱性

通常のエスケープとは違いますが、「URL参照を行う際に、意図しない箇所につながる」ということが考えられます。特に、サイト内にオープンリダイレクタがあると、サイト内リンクから自由な別サイトに飛ばせるようになってしまうので、

  • 基本的に、他サイトへのリダイレクトは認めない。
  • 他サイトへのリダイレクトを認める場合には、ホワイトリストで検証する
  • 確認ページを表示して、自動リダイレクトはさせない

などの対策が必要です。

機能の多すぎる関数の使用

エスケープ以外の対策を取るべき場面ですが、「意図せずにOSコマンド呼び出しやHTTPリクエストを投げる」となってしまいかねない関数・メソッドも存在します。

例えば、RubyのKernel#openるりま)は、最初の文字が|であればシェルに投げるという仕様になっています。確実にファイルを開きたければFile.openを、URLを開く場合はOpenURI.open_uriを、というように、できるだけ限られた機能のものを使うべきです。

投稿2018/04/12 01:27

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/12 01:35

書式文字列攻撃、知りませんでした^^; > 機能の多すぎる関数の使用 これって、「中身理解してないライブラリの使用は危ないよ」って理解で正しいでしょうか? 「適当に使っていると、中でエスケープの必要な処理がエスケープされないまま実行されたりしますよ。」と読み取ったのですが?
maisumakun

2018/04/12 01:40

そうですね、標準ライブラリにも意外な機能を持った関数が潜んでいるので、「うっかり余計な機能まで入った関数を使ってしまう」ことが起きえます。 # 実際、Kernel#openのヤバさに気づいたのが、Rubocopに波線を引かれてからでした。
退会済みユーザー

退会済みユーザー

2018/04/12 01:43

理解できました。 ありがとうございます!
guest

0

まぁあまり深く考えなくてもcmsやライブラリを利用しているなら
そちら側にまるなげしちゃうこともあるのでなんとも言えませんが
これだけやれば安心というのないですが、最低限以下は抑えておいて下さい

  • html

ユーザーから直接もしくはDBから受け取ったデータをhtmlに表示する際は
htmlspecialchars()が必要

その中でもアンカーのhrefなどに表記する際は
urlencode()(もしくはrawurlencode())が必要

  • SQL

SQLへのデータ渡しは関数で処理せずプレースホルダのprepareなどで処理

  • 正規表現

preg_quote()

  • exec、system

基本的につかわない

  • その他

フィルタ関数filter_input()filter_var()はよく使いますし
printf()(sprintf()を含む)は場合によっては必要になります。
キャスト処理も当然必要だと思います

投稿2018/04/12 01:23

yambejp

総合スコア114767

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/12 01:38

> printf()(sprintf()を含む) これ、知りませんでした^^; 危なかったです。。。 ありがとうございます。
guest

0

うーーん・・・
特定の処理というより、外部からの信用できないものはサニタイズが必要で、
その中で特定の意味のある文字・記号があればエスケープする。
というものなので、特定の処理で覚えるものではありません。

網羅性のある資料をどこかで見た気もするのですが、ちょっと辿れなくて^^;

quiitaで、サニタイズの記事がありましたね

投稿2018/04/12 00:52

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/04/12 01:00

エスケープ処理の必要な場面は、与えられた文字列が「特定の意味のある文字・記号」である処理なので、限定できるのではないかと思っています。 上記の観点で、ご提示いただけるものはありませんか?
guest

0

・・・書いた後気づきましたが、エスケープと言うか、セキュリティ全般なので少し質問とはずれるかもしれません;

IPAのセキュリティ対策セルフチェックシート とかですかね・・・。
だーいぶ前の受注案件で大手のお客さんだったので「これをもとに全部チェックOKにしてね。対応不可項目はきちんと理由書いて返してね」って言われたことがあります。
明らかに対応不可な項目なのに何とか対応しろって言われたような、ないような。。。

追記
同じIPAの資料ですがこっちの方がいいですね。

の「セキュリティ実装チェックリスト」

私が昔お客さんから渡されたのはこの資料そのまんまでした。

投稿2018/04/12 00:50

編集2018/04/12 00:56
m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/04/12 01:00 編集

あ、これ(セキュリティ対策セルフチェックシート )Webのところリンク切れてますね。 どこかに最新版転がってるかもしれません・・・
退会済みユーザー

退会済みユーザー

2018/04/12 01:05

メールヘッダ・インジェクションとかの記述がありました。 ありがとうございます。追記します。
m.ts10806

2018/04/12 01:07

少しでもお役に立ったようで良かったです。 あそうそう、メールのやつでした。メール送信発生しないシステムなのに「なんで対応不可なんだ」っていう感じで。
退会済みユーザー

退会済みユーザー

2018/04/12 01:18

よく考えたら、メールヘッダ系はエスケープ処理でどうにかするものじゃないですね^^; 入力値確認側ですね。 ちょっと勘違いしてしまいました><
m.ts10806

2018/04/12 01:21 編集

あ、なるほど。 この質問ってどこまでカバーするかというプロジェクトやシステムの要求仕様にもよるので、 どの辺りを落としどころにするか というのが難しそうです。 (勝手に名前だして申し訳ないですが、やはり徳丸さん辺りのコメントを期待しましょうか・・)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問