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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

1374閲覧

ユーザがリッチテキストエディタで入力した値を無害化して出力したい

maguzo

総合スコア57

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2018/07/25 12:41

以下のようなデータをサイト内で埋め込んだリッチテキストエディタで入力して値を受け取ります。

php

1<!--ユーザー入力データ--> 2<?php 3$hoge='p>スポーツで<u style="background-color: rgb(255, 255, 0);">人気がある</u>のはどっちなのでしょうか?</p>' 4?>

これを出力する際にXSS対策するために以下のように出力します

php

1<?php 2echo htmlspecialchars($hoge, ENT_QUOTES, 'UTF-8') 3?>

すると特殊文字は当然エスケープされるため、html上は以下のように扱われます。

html

1&lt;p&gt;スポーツで&lt;u style=&quot;background-color: rgb(255, 255, 0);&quot;&gt;人気がある&lt;/u&gt;のはどっちなのでしょうか?&lt;/p

これではリッチテキストで書式等を指定してユーザーから入力してもらっている意味がないのですが
ユーザー入力データの書式(タグや属性)を活かしつつ、無害化する術はあるのでしょうか?

よろしくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

HTMLタグをそのまま受け取るのはタグの無効化の手順も含めて複雑化するので、teratailもそうだけど独自のタグを設けてそれ以外は適用させないのが一番安全で簡単

タグは独自にしても内容を解釈しないで出したりすると危ないけどね

[p style="background-color:#000;&quot;></p><script src=""></script>"][/p]

styleなんかの属性をそのまま受け取るのは自殺行為としか言えないと思う
属性も含めたタグは単機能化と細分化で特定の機能に制限した方がいい

[p][color,255,0,0]赤色[/color][underline]下線[/underline][/p]

色指定とか難しい所だけど、数値指定の所に数値以外の物が入れられる様にしてしまうと穴になるし

ぶっちゃけ、色に関しては利用者側に指定させる必要が本当にあるのかという話になっちゃう気もする、太字とか若干文字を大きくするとかは表現としてあっても良いけど、背景が白だったサイトを背景を黒にイメージチェンジをするかもしれないし、そうした時に見づらくなったり見えなくなったりする可能性がある

投稿2018/07/25 18:35

efcode

総合スコア422

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

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

maguzo

2018/07/28 08:32

efcode様 コメントいただいていたにもかかわらず、ご返信遅くなりましたことをお詫び申し上げるとともに、御礼を申し上げます。 さて、いただいたコメントについてですが、xss対策として最低でもhtmlspecialcharsで無害化しなければならないという知識しかないまだ初心者でして、2点お尋ねしたく存じます。 >>”teratailもそうだけど独自のタグを設ける” というのは例えば太字の表現は** **で囲まれたものをteratailでは太字と認識しているようです。このようにリッチテキスト上ではユーザーの太字にするというコマンドに対して処理上は<b></b>ではなく特殊な文字に置き換えてサーバー上で処理する際や、改めてscriptで該当箇所を処理する際に正規表現等で**を<b>に置き換えるような処理をするという意味でしょうか? >>"タグは独自にしても内容を解釈しない" という表現についてですが、具体的に内容を解釈するというのはどのようなことで、どのような方法いよって解釈や検証することができるのでしょうか?
efcode

2018/07/28 11:15

独自タグは、**や[b]としなくても<b>で受け入れても良いとは思う、送られたテキストを解釈し処理を実装しやすい方法で良い。 内容とは属性の事、タグと閉じタグに囲まれた内容はhtmlspecialcharsで処理しておけば読む必要は無い。 <b>をタグとして受け入れる場合、<b style="color:red;">などstyleを受け入れられるようにする場合、その内容を処理する上で、ただ素通ししてしまうのではなく受け入れる物のみを通すように実装しないと危ないよって事。 <b>のみしか通さない様にしておけば、<b >や< b >や<b style="--">なんかを弾いてしまえば良いだけで実装も簡単になる。(trim位はしてもいい気はするけど) 多くのポスト機能のあるサイトがHTMLをそのまま受け入れないのは、解釈が複雑になりがちでバグが入る余地を塞ぎきれないと判断してるから。 攻撃者は利用者だけど、悪意のある投稿が誰でも見られるとなると二次攻撃者になるのはサーバ側だからね。 用心に越したことはない
maguzo

2018/07/28 13:42

コメントありがとうございます。 慎重に構築してみようと思います! お力添え、ありがとうございました。
guest

0

とりあえずやらないよりましでsprit_tagsで許可したタグ以外受け付けないようにする

当該ページにも書かれてるけど、これでは危険な属性値を取り除けないので
そこは別に何らかの処理をしないといけない

on~の属性値を取り除くのは前提として、styleは許容しなくてはならないなら、
せめてその中身は特定の指定しか受け付けないように厳重に検証

投稿2018/07/26 00:44

KazuhiroHatano

総合スコア7804

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

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

maguzo

2018/07/28 08:37

KazuhiroHatano様 コメントいただきありがとうございます。また、ご返信遅くなり誠にもうしけございません。sprit_tagsというコードがあることを初めて知ったのですが、XSS対策としては不十分ということですね。。これはこれでどのような機能があるのかマニュアルをじっくり拝見させていただきます。 他の対応方法の可能性についてはefcode様へのコメントで改めて記載させていただきましたので、平行にお尋ねすると本質問が見づらくなるため、合流させていただければと存じます。 よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問