作成したスクリプトをチェックするため、文字列のエスケープの必要な処理に関して調べています。
エスケープは、特定の文字が何らかの制御をする処理の前処理として必要であるという理解です。
以下の処理に対して、エスケープが必要であると認識していますが、他にもあるでしょうか?
・html 表示
・SQL 文の作成
・正規表現のパターン
・exec、system いったコマンド実行関数の引数
網羅性のある資料をどこかで見た気もするのですが、ちょっと辿れなくて^^;
ご教示いただけると幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア11701
0
書式文字列攻撃
ユーザーから受け取った文字列でprintf
の書式を組み立てる、あるいはそのままprintf
で出力してしまうと、意図しない書式からデータ流出が起きる書式文字列攻撃が存在します。
URL関係の脆弱性
通常のエスケープとは違いますが、「URL参照を行う際に、意図しない箇所につながる」ということが考えられます。特に、サイト内にオープンリダイレクタがあると、サイト内リンクから自由な別サイトに飛ばせるようになってしまうので、
- 基本的に、他サイトへのリダイレクトは認めない。
- 他サイトへのリダイレクトを認める場合には、ホワイトリストで検証する
- 確認ページを表示して、自動リダイレクトはさせない
などの対策が必要です。
機能の多すぎる関数の使用
エスケープ以外の対策を取るべき場面ですが、「意図せずにOSコマンド呼び出しやHTTPリクエストを投げる」となってしまいかねない関数・メソッドも存在します。
例えば、RubyのKernel#open
(るりま)は、最初の文字が|
であればシェルに投げるという仕様になっています。確実にファイルを開きたければFile.open
を、URLを開く場合はOpenURI.open_uri
を、というように、できるだけ限られた機能のものを使うべきです。
投稿2018/04/12 01:27
総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/12 01:40
退会済みユーザー
2018/04/12 01:43
0
まぁあまり深く考えなくてもcmsやライブラリを利用しているなら
そちら側にまるなげしちゃうこともあるのでなんとも言えませんが
これだけやれば安心というのないですが、最低限以下は抑えておいて下さい
- html
ユーザーから直接もしくはDBから受け取ったデータをhtmlに表示する際は
htmlspecialchars()が必要
その中でもアンカーのhrefなどに表記する際は
urlencode()(もしくはrawurlencode())が必要
- SQL
SQLへのデータ渡しは関数で処理せずプレースホルダのprepareなどで処理
- 正規表現
- exec、system
基本的につかわない
- その他
フィルタ関数filter_input()やfilter_var()はよく使いますし
printf()(sprintf()を含む)は場合によっては必要になります。
キャスト処理も当然必要だと思います
投稿2018/04/12 01:23
総合スコア114767
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/04/12 01:38
0
うーーん・・・
特定の処理というより、外部からの信用できないものはサニタイズが必要で、
その中で特定の意味のある文字・記号があればエスケープする。
というものなので、特定の処理で覚えるものではありません。
網羅性のある資料をどこかで見た気もするのですが、ちょっと辿れなくて^^;
quiitaで、サニタイズの記事がありましたね
投稿2018/04/12 00:52
総合スコア4820
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/04/12 01:00
0
・・・書いた後気づきましたが、エスケープと言うか、セキュリティ全般なので少し質問とはずれるかもしれません;
IPAのセキュリティ対策セルフチェックシート とかですかね・・・。
だーいぶ前の受注案件で大手のお客さんだったので「これをもとに全部チェックOKにしてね。対応不可項目はきちんと理由書いて返してね」って言われたことがあります。
明らかに対応不可な項目なのに何とか対応しろって言われたような、ないような。。。
追記
同じIPAの資料ですがこっちの方がいいですね。
の「セキュリティ実装チェックリスト」
私が昔お客さんから渡されたのはこの資料そのまんまでした。
投稿2018/04/12 00:50
編集2018/04/12 00:56総合スコア80850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/12 01:00 編集
退会済みユーザー
2018/04/12 01:05
2018/04/12 01:07
退会済みユーザー
2018/04/12 01:18
2018/04/12 01:21 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/04/12 14:35
退会済みユーザー
2018/04/13 05:23
2018/04/13 05:39
退会済みユーザー
2018/04/13 06:55