ボタンなどで文字の太さや強調ができるものを作っているのですが
そのままだとセキュリティ的に問題があるので特定のタグ以外は無効
特定のタグについても正規表現などを使って場所と特定して書き換えています。
今のところjavascriptでチェックしているだけなのですが
サーバーサイドでもチェックした方がよいでしょうか?
そして、出力時にもチェックが必要でしょうか?
また、必要な場合やり方を紹介していただければありがたいです。
よろしくお願いします。
今のところjavascriptでチェックしているだけなのですが
サーバーサイドでもチェックした方がよいでしょうか?
必須です。
ちょっとプログラムを書くことができる人なら、Web サーバへ直接、データを送信するプログラムは書けます。JavaScript でのチェックは、あくまでもブラウザを利用する人に対して、利便性(誤った入力である事を、Web サーバに送信して応答を待つことなく、利用者に伝えることで、応答性を向上させている)を提供しているに過ぎません。
そして、出力時にもチェックが必要でしょうか?
原則は、
です。
この辺の話は、通称「徳丸本」と呼ばれる下記の書籍がバイブルとしてよく紹介されます。原理的な事からきちんと書かれている本ですので、まずはこれで勉強してみて下さい。
体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
> サーバーサイドでもチェックした方がよいでしょうか?
必要です。
チェックするJavaScriptが含まれているコンテンツ以外から投稿された場合、サーバで防ぐしかないからです。
> そして、出力時にもチェックが必要でしょうか?
投稿時にサーバで十分にチェックされていれば、出力時にチェックする必要はありません。二度手間だからです。
サーバ側のチェックですが、PHPが使えればstrip_tags関数を使って正規表現を使わなくても除去できます。
http://labs.uechoco.com/blog/2007/12/phpstrip_tagshtml.html
>チェックするJavaScriptが含まれているコンテンツ以外から投稿された場合、サーバで防ぐしかないからです。
なるほど、そういうやり方があるのでしたら必須ですね。
>投稿時にサーバで十分にチェックされていれば、出力時にチェックする必要はありません。二度手間だからです。
気になってきた部分ですので、もやもやが晴れました。ありがとうございます
前の回答者さんが答えているように
サーバサイドでチェックは必要です。データ保存前に必ず行います。
出力時は、よっぽどのことがない限り簡易的なものでよいです。
必要ならばチェックをいれてもいいです。
パッケージのブログシステムなどは、基本両方入っていることが多い印象ですが。
チェックする項目ですが、作りたいものに応じて取捨する形になります。
セキュリティ的にはscriptタグなどjavascriptとフォームタグを排除すればOKです。
見栄えタグは正規表現で細かく調整します。こちらはやりだすと作業大変です。
・スクリプトタグは悪さするので必ず無効、ただしブログパーツなどscriptを使わざるを得ない場合はその表記だけ生きるように設定する
・onclick、onmouseoverなどもいろいろ出来るので極力無効に。
・コメントアウトタグは排除し忘れることが多いので要注意。全て無効に。SSIも当然排除。
・閉じタグを自動挿入するなど(セキュリティ的にはやらなくても問題ない)
・フォームタグも無効に
タグを使うとどういったことが出来るようになるのか考え、それはやらせていいのかどうか、ひとつずつ上げていって取捨するのがいいと思います。
具体的な例助かります。
onclick、onmouseoverは気づいていませんでした。
この表現も無効にシたいと思います。
SSIは知りませんでした。
調べたいと思います。
ありがとうございます。
絶対に必要です。
簡単にソースコードを解析すれば
直接命令を送ることができますので。
サーバ側の言語によりますが
例えばphpでしたら
http://rasukaru55.sitemix.jp/tag_tori.php
が参考になるかもしれません。
あと
サーバテロの技法という本が
私は大変ためになりました。
サイバーテロだったかな。
他にも攻撃の手法をいろいろ紹介されていてそれの防御方法がのっていました。
http://www.amazon.co.jp/%E6%9C%AC/dp/4883374718
こちらの本でしょうか?
読んでみたいと思います。
ありがとうございます。
そう、その本です。
回し者ではないですが、是非読んでみてください!
あと、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
ヤバいコードを実行させない方法として、許可するHTMLタグを別タグにしてしまうという方法があります。
例えば原文で *RED* と書いたら、出力時にはで font color のタグに置き換えるとかです。
もちろん原文の括弧は必ずHTMLエスケープしないと意味ないです。
さらにいうなら原文に直接書くのではなく許可タグを文字ではなくビジュアルに確認できるといいですね。
アメブロのブログエディターみたいな感じならエンドユーザーの負担も無いでしょう。
ありがとうございます。
参考にしたいと思います
ありがとうございます。
2013/08/08 22:15:34紹介して頂いた本買ってきて読みたいと思います