こんにちは。PHPとMySQLで自作ブログを作ろうと試みているのですが、
セキュリティを意識した中で、HTMLタグの取り扱いに困っております。
プログラム全体の流れとしては、
記事投稿ページ→MySQLに保存→ブログ記事として出力
といった感じです。
例えば、記事投稿ページの<textarea>の中で、
<b>テストテスト</b>といった文があったとします。
XSSを防ぐために、htmlspecialchars()でエスケープすると、
MySQLには、<b>テストテスト</b> と保存されます。
MySQLから記事に出力したときに、太字となった「テストテスト」ではなく、
「<b>テストテスト</b>」とそのまま表示されてしまいます。
記事の出力時に、html_entity_decode()で戻してやればいいかとも思いましたが、
それでは、そもそもXSSを防げない気がします。
一般のブログサービスでは、どうやってデータベースにHTMLを保存しているのでしょうか?
解決するいい方法があればどなたか教えてください。
No.1ベストアンサー
- 回答日時:
様々な方法がありますが、PHPに限らず一般的には次のような手順を踏みます。
(1) まず、ユーザーにどのようなHTMLを使わせたいかを厳密に正確に決めます。たとえば、太字を使わせたいので<b>だけを許可するのであればそのように定義します。(逆に禁止タグを決める方法もありますが、相当のスキルが無いと危険なのでよした方がよいでしょう)
(2) ユーザーの投稿テキストを受け取ったら、文字列のどこに(今の例だと)<b>と</b>があるのかを正確に把握します。そして「ここに"<b>"があるよ」とマーキングしておきます。他のタグは残すも良し、削除するも良しです。この処理はDBにテキストを格納する前でも、DBの内容を表示する直前でもいいです。
(3) 最終的に投稿を画面に表示する時、<b>と</b>の位置はマーキングで分かっていますから、それらはHTMLタグとして表示します。そしてそれ以外の部分は、(PHPの場合なら)htmlspecialchars()でエスケープして表示します。
このようにすれば、必要なタグだけをHTMLとして表示し、それ以外の部分は適切にXSSを防ぐことが出来るというわけです。ちょっと難しいかもしれませんがお分かりいただけるでしょうか?
とはいえ、これを自分でキッチリ開発するのはかなり骨が折れます。特にいろんな種類のHTMLを書かせたい場合は挑戦してもセキュリティホールを作ってしまう可能性が高いでしょう。ライブラリを探した方が良いです。さて、実は私はもう長い間PHPを使っていないため、ここからはGoogle検索結果だけを頼りに書いてしまいますが、以下のライブラリは広く使われていて信頼できるようです。
HTML Purifier
http://htmlpurifier.org/
http://phpspot.org/blog/archives/2007/03/htmlxss …
また、HTMLの代わりにHTMLに似た別の言語を使って対応するというのは、英語圏の掲示板/ブログソフトウェアではわりと一般的なようですね。これはPEARにもライブラリがあるようです。
BBCode
http://pear.php.net/HTML_BBCodeParser
http://ja.wikipedia.org/wiki/BB%E3%82%B3%E3%83%B …
ご回答ありがとうございます!
なるほど、ホワイトリストのような物を作って、その中で決められたタグだけをマーキングして、その他をエスケープ処理するということですね。
確かにそれならXSSも防げる上に、使いたいHTMLタグも実行できますね!
これは考えませんでした。目からウロコです(涙)
ちなみにマーキングというと、例えば<b>を(b)などに変換しておけばいいのでしょうか?
ご紹介いただいたライブラリはすごいですね!
無理に自作で作るよりも、こうした便利なライブラリを使いこなせるようになる方が
結局はいいかもしれませんね。試してみます!
No.3
- 回答日時:
>> 一般のブログサービスでは、どうやってデータベースにHTMLを保存しているのでしょうか?
>> 解決するいい方法があればどなたか教えてください。
既に求める回答は得られているようですが、いくつか紹介だけ。。
単にブログといっても、誰に書き込み権限を与えるかに依ります。
本文への書き込みを管理者にしか与えていないものでは、特にHTMLのサニタイジングを
施していない物も少なくありません。
不特定多数に書き込み権限がある場合や書き込み者が不明なコメント、トラックバックなどは当然
サニタイジングを施します。
不特定多数の人に書き込みを許可している物の代表として、掲示板などが有りますが
いたずら防止も兼ねて、BBcode(Bulletin Board Code)を使う場合も有ります。
http://ja.wikipedia.org/wiki/BB%E3%82%B3%E3%83%B …
htmlタグはすべてエスケープ処理してしまい、BBcodeのうち
許されたタグだけは表示時にhtmlタグに変換するという方法です。
オープンソースで開発されている掲示板などに多く使われています。
ご回答ありがとうございます。
BBcode、Wikipediaの説明をよく読んでみましたが、
大変勉強になりました。
確かに掲示板はブログよりもさらに危険そうですし、
「HTMLタグをまず全てエスケープ処理してしまい、
許可したタグだけをHTMLタグに再変換する」
というのは、非常に効率的な方法ですね。
ありがとうございました。
No.2
- 回答日時:
問題箇所の切り分けが大切だと思います
XSS対策が必要なのは表示の時でDB登録の時ではない
ということ。
DB登録の時に必要なのはSQLインジェクションであってクロスサイトスクリプトじゃない
って事。
簡単に言えばDB登録の時は
SQLインジェクション対策を施した文字列を登録して
表示するときはXSS対策した
HTMLを表示してあげれば良いと思いますが。
No1さんの言うとおりXSS対策すべき部分・XSS対策すべきタグの
選定・切分けもいりますし結構危険ですよ。
ご回答ありがとうございます!
確かに、XSS対策は、DBから表示するときでいいような気がします。
そう切り分けると、余計な処理が省けそうですね。
ご指摘ありがとうございます。
選定・切り分けは大変そうなので、
やはりライブラリに頼るのが一番安全で確実な気がしてきました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL mysqlがインストールされているのかわかりません 1 2023/06/05 02:26
- MySQL mysqlがインストールされているのかどうか 1 2023/06/05 14:19
- 中学校 間違った国語の実力テストの勉強? 1 2022/08/28 15:59
- Ameba(アメーバブログ) アメブロは、HTMLのタグの入力を許さないブログ・サイトですか? 1 2023/06/18 18:48
- ホームページ作成・プログラミング アメーバ・ブログは"HTMLタグ"を許可してないのですか? 2 2023/06/17 21:08
- Java Javaで個人ブログサイトを作りたい 7 2022/04/03 17:37
- MySQL 私の考えていることは ・mySQL ・PHP ・web制作 この三つのスキルがあれば実現しますか? 4 2023/08/19 02:48
- WordPress(ワードプレス) ワードプレスで、投稿一覧ページにタグを表示する方法 投稿につけたタグを、記事一覧ページにもカテゴリと 1 2023/05/10 21:41
- MySQL MySQL,JavaScript,PHPコードの結果を表示する方法を教えてください。 1 2023/02/13 17:49
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Nvuで作成したhtmlをコピペして...
-
URLの結合
-
JSFタグのfタグとは
-
htmlタグ間の特定文字置換
-
こんにちは。PHPとMySQLで自作...
-
ソースコードの1行が長いとき...
-
VBAのコマンドボタンの文字列の...
-
エスケープ文字の復帰(¥r)と...
-
COBOLの改行
-
全角括弧と全角読点の間隔を狭...
-
文字の入力で横バー上段、中断...
-
エクセルのCOUNTIFが正しくカウ...
-
メッセージボックスで1025文字...
-
記号は半角と全角どちらがよい...
-
文字化け変換方法
-
コンボボックスの項目中に改行を
-
16進数の文字列をアスキーコー...
-
Excel関数「COUNTIF」で”文字”...
-
ラベル(スタティックテキスト)...
-
PHPmailerでの添付ファイルの文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
[php][正規表現]タグ以外を削除...
-
正規表現で複数行に渡る範囲を...
-
変数にHTMLを代入する場合
-
phpの正規表現でstyle="●●"を削...
-
正規表現でタグの置換をしたい...
-
コメントタグに挟まれた部分を...
-
Nvuで作成したhtmlをコピペして...
-
タグにはさまれている文字以外...
-
htmlタグ間の特定文字置換
-
htmlのソースからテーブルの値...
-
スクレイピングの仕方
-
Java正規表現-"ある文字列"を含...
-
JSFタグのfタグとは
-
htmlソースの中を検索して、
-
PHP 取得した経過時間の表示に...
-
eclipseより、タスク・タグの使...
-
タグとクッキーって関係あるん...
-
srcに「banner.」で始まるファ...
-
htmlspecialchars関数を使いな...
-
アクセス解析データがでません...
おすすめ情報