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

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

新規登録して質問してみよう
ただいま回答率
85.48%
WYSIWYG

WYSIWYGとは、ディスプレイに表示されたものが見た通りの状態でプリンターなどに出力できる技術、およびその概念です。HTMLがなくても容易にWebページのレイアウトなどができます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

2124閲覧

WYSIWYGで入力されたHTMLデータを必要に応じてエスケープ処理する。

fsk5303

総合スコア21

WYSIWYG

WYSIWYGとは、ディスプレイに表示されたものが見た通りの状態でプリンターなどに出力できる技術、およびその概念です。HTMLがなくても容易にWebページのレイアウトなどができます。

Java EE

Java EE(Java Enterprise Edition)はJavaベースのテクノロジーとその相互運用の仕様をまとめたものです。サーバとクライアントのアーキテクチャを規定し、特定アプリケーションのクラス用に定義されたテクノロジー設定のプロファイルを使用します。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

エスケープ処理

エスケープ処理とは、一連の文字や一文字に対して、一定の規則に従って別の意味を適用する処理過程です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

1クリップ

投稿2018/09/13 00:53

編集2018/09/13 04:48

前提・実現したいこと

  • 数人のユーザーがブログのように記事を投稿し、それを不特定多数に公開するWEBアプリを考える。
  • このWEBアプリは管理画面と公開画面があり、管理画面は認証を通ったユーザーしか操作する事が出来ないが、公開画面はだれでもアクセスする事が出来る。
  • 管理画面ではユーザーがWYSIWYG(summernote等のオープンソースJSライブラリ)でコンテンツを入力し、そのHTMLデータをDBに保存する。
  • 公開画面では、DBに保存されているHTMLデータをブログ形式で表示し、不特定多数に公開する。
  • サーバー側のプログラムには Java EE 7 を使う。

質問

以下、セキュリティ的な観点かつ一般的な観点から質問します。
0. WYSIWYGで入力を許可するHTMLタグは限定すべきかどうか。
限定すべきとしたら、何を許可して何を禁止とするべきか。
0. 入力されたHTMLのうち、特定のタグのみ(例えば<script>など)をサーバー側でエスケープするにはどうするのが最善策か。
自分で正規表現を書く?Javaのライブラリを用いる?
正規表現で書く場合、漏れや脆弱性が無いかの検証はどのように行うべきか。
このような場合、エスケープは保存時に行うべきか、出力時に行うべきか、それとも両方で行うべきか。
0. 仮にJavaのライブラリで解決できる場合、どのライブラリを使用するのが好ましいか。
0. その他WYSIWYGを実装しユーザーにコンテンツを投稿させる上で気を付けるべきことはあるか。
0. HTMLをDBに保存する上で気を付けるべきことはあるか。
ブログのようなWEBアプリを実装する上でDBに保存するという方式は一般的かどうか。
(調べたところ、WordPressはHTMLデータをDBに保存しているらしいので、この実装を真似しようと考えました。)

補足情報

htmlタグのエスケープ処理はWEBアプリを実装する上で超基本的なセキュリティ対策だと思いますが、あまり多くのパターンの参考となる情報が見つけられませんでした。
例えば、「&,<,>,",'」などを全てエスケープする方法はたくさん情報が見つかりましたが、それらを行うとHTMLタグ全てが無効になってしまうため今回の件では使えませんでした。

みなさま、お手数お掛けしますが、アドバイス頂けると嬉しいです。
宜しくお願い致します。

FW/ツールのバージョンなど

apache-tomcat-7.0.78
Java EE 7 WEB

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

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

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

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

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

guest

回答1

0

ベストアンサー

分かる内容のみ回答します。

1.WYSIWYGで入力を許可するHTMLタグは限定すべきかどうか。

限定すべきとしたら、何を許可して何を禁止とするべきか。

要件次第です。
「何をさせるか」という観点から使えるタグを制限してはどうでしょうか。
または「何をさせたくないか」

teratail、Qiitaなどのマークダウンはある程度参考になりそうです。
※正確にはWYSIWYGではないですが「許可している機能」という観点で

2.入力されたHTMLのうち、特定のタグのみ(例えば<script>など)をサーバー側でエスケープするにはどうするのが最善策か。

自分で正規表現を書く?Javaのライブラリを用いる?
正規表現で書く場合、漏れや脆弱性が無いかの検証はどのように行うべきか。
このような場合、エスケープは保存時に行うべきか、出力時に行うべきか、それとも両方で行うべきか。

エスケープはHTML出力時のために行うものです。保管データについてはユーザー入力情報のうち、サーバーサイドでのバリデートを通過したもので、そのまま保管すべきです。
基本的に保管データの加工は行いません。

特定のタグをエスケープするのであれば正規表現を使った方が良さそうです。

4.その他WYISIWYGを実装しユーザーにコンテンツを投稿させる上で気を付けるべきことはあるか。
5.HTMLをDBに保存する上で気を付けるべきことはあるか。

2.と同。ただ、一応、文字数制限はしておいた方が良いです。
タグも込みで実際の文章量より多くなるので、そこは使う側に注意が必要ですね。

投稿2018/09/13 01:26

m.ts10806

総合スコア80850

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

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

fsk5303

2018/09/13 04:58

お返事ありがとうございます。お早いお返事、大変感謝致します。 >「要件次第です。「何をさせるか」という観点から使えるタグを制限してはどうでしょうか。」 >「文字数制限はしておいた方が良いです。」 こちらに関して、もう少し要件を練ってみます。ありがとうございます。 >「基本的に保管データの加工は行いません。特定のタグをエスケープするのであれば正規表現を使った方が良さそうです。」 参考に挙げてくださいったサイトを確認し、出力時にエスケープ処理を行う点について理解出来ました。ありがとうございます。 >「文字列のエスケープにはWebアプリケーションを開発する言語やフレームワークで用意されている機能を用いたり,パラメータがすべて自動でエスケープされるテンプレートエンジンを使用するのがいいでしょう。文字列を出力するすべての箇所で確実にエスケープを行うというのは,Webアプリケーション内で1か所でも漏れがあった場合にはXSSの発生へとつながってしまうためです。(参考サイトより引用)」 例えば要件で「<a>,<span>,<table>,<td>,<th>以外のタグは使用不可とする」と決まった場合などに、これを実現する最も好ましいやり方(バグ・脆弱性の埋め込みにくさや、開発難易度の観点から)はどのようになるのでしょうか・・・。 現在、そのような具体的な実装方法で悩んでおります。
m.ts10806

2018/09/13 05:07

>例えば要件で「<a>,<span>,<table>,<td>,<th>以外のタグは使用不可とする」と決まった場合などに、これを実現する最も好ましいやり方(バグ・脆弱性の埋め込みにくさや、開発難易度の観点から)はどのようになるのでしょうか・・・ 正直なところ全てをカバーするのは無理ですし、何が入力されるか分からない状態でのパターン洗い出しはただただ時間を無駄にくうだけなので喰うだけなのでやめたほうがいいです。 今はどうか知りませんがYahooショップなんかで使えるタグは書き方も制限されていてそれから外れたら全て無効になる作りになっていました。 だから「こういうのがきたらこう」という後手後手で対応を考えるのではなく「これ以外許容しない」と考えたら良いかもしれません。 いずれにしてもhtmlエスケープは入れるでしょうし。 私でしたら許容したタグだけ別の書き方に一度置換し、htmlエスケープをかけて、そのあとに置換したタグだけ元にもどすような戻すようなやり方をします。
fsk5303

2018/09/18 05:51

具体的な実装案がある程度固まりました。 ①入力値については検証のみ行い、検証を通過したデータをそのままDBに保存する。 ②出力時に許可するHTMLタグを予め決定しておき、それ以外のタグは全てエスケープ処理して出力する。 ③エスケープ処理にはOWASPのJavaライブラリを用いる。 という実装を行おうと思います。 大変参考になりました。ありがとうございました。
m.ts10806

2018/09/18 05:54

解決の参考になったようで何よりです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問