htmlタグが使えるブログなどのシステムのセキュリティについての質問です。


ボタンなどで文字の太さや強調ができるものを作っているのですが
そのままだとセキュリティ的に問題があるので特定のタグ以外は無効
特定のタグについても正規表現などを使って場所と特定して書き換えています。
今のところjavascriptでチェックしているだけなのですが
サーバーサイドでもチェックした方がよいでしょうか?
そして、出力時にもチェックが必要でしょうか?

また、必要な場合やり方を紹介していただければありがたいです。
よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2013/08/14 19:15:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント20pt

今のところjavascriptでチェックしているだけなのですが
サーバーサイドでもチェックした方がよいでしょうか?

必須です。

ちょっとプログラムを書くことができる人なら、Web サーバへ直接、データを送信するプログラムは書けます。JavaScript でのチェックは、あくまでもブラウザを利用する人に対して、利便性(誤った入力である事を、Web サーバに送信して応答を待つことなく、利用者に伝えることで、応答性を向上させている)を提供しているに過ぎません。

そして、出力時にもチェックが必要でしょうか?


原則は、

  • 入力時のチェックは、アプリケーションの仕様に合わせてチェックする。
  • 出力時には、それが意図しない挙動にならないように処理をする。

です。

この辺の話は、通称「徳丸本」と呼ばれる下記の書籍がバイブルとしてよく紹介されます。原理的な事からきちんと書かれている本ですので、まずはこれで勉強してみて下さい。

id:robopit

ありがとうございます。
紹介して頂いた本買ってきて読みたいと思います

2013/08/08 22:15:34
id:dawakaki No.2

回答回数797ベストアンサー獲得回数122

ポイント20pt

> サーバーサイドでもチェックした方がよいでしょうか?
必要です。
チェックするJavaScriptが含まれているコンテンツ以外から投稿された場合、サーバで防ぐしかないからです。

> そして、出力時にもチェックが必要でしょうか?
投稿時にサーバで十分にチェックされていれば、出力時にチェックする必要はありません。二度手間だからです。

サーバ側のチェックですが、PHPが使えればstrip_tags関数を使って正規表現を使わなくても除去できます。
http://labs.uechoco.com/blog/2007/12/phpstrip_tagshtml.html

id:robopit

>チェックするJavaScriptが含まれているコンテンツ以外から投稿された場合、サーバで防ぐしかないからです。

なるほど、そういうやり方があるのでしたら必須ですね。

>投稿時にサーバで十分にチェックされていれば、出力時にチェックする必要はありません。二度手間だからです。

気になってきた部分ですので、もやもやが晴れました。ありがとうございます

2013/08/08 22:18:16
id:tukihatu No.3

回答回数180ベストアンサー獲得回数32

ポイント20pt

前の回答者さんが答えているように
サーバサイドでチェックは必要です。データ保存前に必ず行います。
出力時は、よっぽどのことがない限り簡易的なものでよいです。
必要ならばチェックをいれてもいいです。
パッケージのブログシステムなどは、基本両方入っていることが多い印象ですが。


チェックする項目ですが、作りたいものに応じて取捨する形になります。
セキュリティ的にはscriptタグなどjavascriptとフォームタグを排除すればOKです。
見栄えタグは正規表現で細かく調整します。こちらはやりだすと作業大変です。


・スクリプトタグは悪さするので必ず無効、ただしブログパーツなどscriptを使わざるを得ない場合はその表記だけ生きるように設定する
・onclick、onmouseoverなどもいろいろ出来るので極力無効に。
・コメントアウトタグは排除し忘れることが多いので要注意。全て無効に。SSIも当然排除。
・閉じタグを自動挿入するなど(セキュリティ的にはやらなくても問題ない)
・フォームタグも無効に


タグを使うとどういったことが出来るようになるのか考え、それはやらせていいのかどうか、ひとつずつ上げていって取捨するのがいいと思います。

id:robopit

具体的な例助かります。

onclick、onmouseoverは気づいていませんでした。
この表現も無効にシたいと思います。
SSIは知りませんでした。
調べたいと思います。
ありがとうございます。

2013/08/08 22:26:20
id:ymlab No.4

回答回数508ベストアンサー獲得回数34スマートフォンから投稿

ポイント20pt

絶対に必要です。
簡単にソースコードを解析すれば
直接命令を送ることができますので。

サーバ側の言語によりますが
例えばphpでしたら
http://rasukaru55.sitemix.jp/tag_tori.php
が参考になるかもしれません。

あと
サーバテロの技法という本が
私は大変ためになりました。
サイバーテロだったかな。
他にも攻撃の手法をいろいろ紹介されていてそれの防御方法がのっていました。

id:robopit

http://www.amazon.co.jp/%E6%9C%AC/dp/4883374718

こちらの本でしょうか?
読んでみたいと思います。
ありがとうございます。

2013/08/12 19:28:38
id:ymlab

そう、その本です。
回し者ではないですが、是非読んでみてください!
あと、id:standard_oneさんが、おっしゃる方法も検討する価値はあります。
私は、http://ckeditor.com/download
を、途中で入れてみましたが、簡単に導入できる上に[私のケースではたった5分で導入できました。簡単すぎてびっくりしました。headの中にjavascriptと、cssを導入して、div要素にid名を加えるだけという・・・。]、かなり快適です。
※IE6のユーザや、遅いマシンの場合、絵文字ボタンを押下すると反応に数分かかるといいう困ったことがありました。これも私の場合はですが、public domainな、絵文字をCSS Spriteして、入力画面下に表示させることで、解決しました。

CSS Spriteについては、
オラ本ですが、ハイパフォーマンスWebサイトを参考にしました。
http://www.amazon.co.jp/%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9Web%E3%82%B5%E3%82%A4%E3%83%88-%E2%80%95%E9%AB%98%E9%80%9F%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E5%AE%9F%E7%8F%BE%E3%81%99%E3%82%8B14%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%AB-Steve-Souders/dp/487311361X
 

2013/09/01 21:12:22
id:standard_one No.5

回答回数252ベストアンサー獲得回数23

ポイント20pt

ヤバいコードを実行させない方法として、許可するHTMLタグを別タグにしてしまうという方法があります。
例えば原文で *RED* と書いたら、出力時にはで font color のタグに置き換えるとかです。
もちろん原文の括弧は必ずHTMLエスケープしないと意味ないです。
さらにいうなら原文に直接書くのではなく許可タグを文字ではなくビジュアルに確認できるといいですね。
アメブロのブログエディターみたいな感じならエンドユーザーの負担も無いでしょう。

id:robopit

ありがとうございます。
参考にしたいと思います

2013/08/12 19:30:39

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません