teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

誤字の修正

2021/04/23 07:59

投稿

pegy
pegy

スコア245

title CHANGED
File without changes
body CHANGED
@@ -116,7 +116,7 @@
116
116
  よろしくお願い申し上げます。
117
117
 
118
118
  ### 加筆
119
- yambejp様からのコメントも参考にdomを使用して、ホワイトリスト外のものをreplace使用というアプローチを考えました。
119
+ yambejp様からのコメントも参考にdomを使用して、ホワイトリスト外のものをreplaceしてみるというアプローチを考えました。
120
120
 
121
121
  例えば以下のような`replaceChild()` を使用したとしても、ノードはツリー構造を持っている(と推察)ため単純に含めたくないnodeNameやtagNameの要素をreplaceすることができません。。
122
122
  やはり手詰まりです。

3

試したことを、追記いたしました。

2021/04/23 07:59

投稿

pegy
pegy

スコア245

title CHANGED
File without changes
body CHANGED
@@ -113,4 +113,32 @@
113
113
  例えば、`strip_tags()`や`Domdocument / SimplXML`なども検討したのですが、前者は基本的に使用すべきではないという記事を読んだり、後者は、調べても例えば、存在する要素ノード`<p>`を存在しない`*^[]p^*` などに置換する術を見つけることができませんでした。
114
114
 
115
115
  この状況で、元のhtml構造に復帰させる術について、アドバイスを頂ければ幸いでございます。
116
- よろしくお願い申し上げます。
116
+ よろしくお願い申し上げます。
117
+
118
+ ### 加筆
119
+ yambejp様からのコメントも参考にdomを使用して、ホワイトリスト外のものをreplace使用というアプローチを考えました。
120
+
121
+ 例えば以下のような`replaceChild()` を使用したとしても、ノードはツリー構造を持っている(と推察)ため単純に含めたくないnodeNameやtagNameの要素をreplaceすることができません。。
122
+ やはり手詰まりです。
123
+ ```php
124
+ $str = '<p>aaaa<span class="">bbb<table><tbody><td>a</td><tbody></table></span>a</p><img><script>alert(danger)</script>';
125
+ $dom = new DOMDocument();
126
+ $dom->loadHtml($str);
127
+ $all_tag = $dom->getElementsByTagName('*');
128
+ $white_tag_list = ['p','span','strong','em','u','s','blockquote','ol','ul','li','sub','sup','a','iframe','img'];
129
+
130
+ $replace_node =$dom->createElement('span');
131
+
132
+
133
+ foreach ($all_tag as $key) {
134
+ if (!in_array($key->nodeName,$white_tag_list,true)) {
135
+ // $key->tagName = "span";
136
+ // $key->nodeName = "span";
137
+ $key->parentNode->replaceChild($replace_node, $key);
138
+ var_dump($key);
139
+ }
140
+ }
141
+
142
+ echo $dom->saveHTML();
143
+ ```
144
+ 新たに試したこととして追記いたします。

2

再度修正

2021/04/23 07:58

投稿

pegy
pegy

スコア245

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,7 @@
1
1
  いつもお世話になっております。
2
2
 
3
3
  ### 前提とやりたいこと
4
- ユーザーからhtml構造のデータをformで受け取り、出力させたいのですが、出力する際にタグやその属性を含む情報であるため、`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
4
+ ユーザーからhtml構造のデータをformで受け取る予定なのですが、html構造として出力させいため、`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
5
5
  0. `src`や`href`といった不正なJSを埋め込まれる可能性がある属性については、Domを利用してチェック
6
6
  0. タグについては、ホワイトリストを作成して限定して無害なものに置換→出力する際に一旦`htmlspecialchars`して、ホワイトリスト対象の物だけ、戻すというアプローチ
7
7
  で以下のコードを作成いたしました。

1

誤字や表現を一部修正しました。

2021/04/23 02:24

投稿

pegy
pegy

スコア245

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,7 @@
1
1
  いつもお世話になっております。
2
2
 
3
3
  ### 前提とやりたいこと
4
- ユーザーからhtml構造を受け取、出力する際に`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
4
+ ユーザーからhtml構造のデータformで受け取り、出力させいのですが、出力する際にタグやその属性を含む情報であるため、`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
5
5
  0. `src`や`href`といった不正なJSを埋め込まれる可能性がある属性については、Domを利用してチェック
6
6
  0. タグについては、ホワイトリストを作成して限定して無害なものに置換→出力する際に一旦`htmlspecialchars`して、ホワイトリスト対象の物だけ、戻すというアプローチ
7
7
  で以下のコードを作成いたしました。
@@ -109,7 +109,7 @@
109
109
 
110
110
 
111
111
  ### ご質問
112
- 最終的には元の`$get_html = '<p>this is a test <a href="dammy">link</a><img src="dammy"></p>';`の構造に復帰させて出力した上で、特定の属性値やホワイトリスト以外のタグを除去して出力させたいのですが、ここで行き詰まってしまいました。
112
+ 最終的には元の`$get_html = '<p>this is a test <a href="dammy">link</a><img src="dammy"></p>';`の構造に復帰させて、特定の属性値やホワイトリスト以外のタグを除去して出力させたいのですが、ここで行き詰まってしまいました。
113
113
  例えば、`strip_tags()`や`Domdocument / SimplXML`なども検討したのですが、前者は基本的に使用すべきではないという記事を読んだり、後者は、調べても例えば、存在する要素ノード`<p>`を存在しない`*^[]p^*` などに置換する術を見つけることができませんでした。
114
114
 
115
115
  この状況で、元のhtml構造に復帰させる術について、アドバイスを頂ければ幸いでございます。