質問編集履歴

4

誤字の修正

2021/04/23 07:59

投稿

pegy
pegy

スコア245

test CHANGED
File without changes
test CHANGED
@@ -234,7 +234,7 @@
234
234
 
235
235
  ### 加筆
236
236
 
237
- yambejp様からのコメントも参考にdomを使用して、ホワイトリスト外のものをreplace使用というアプローチを考えました。
237
+ yambejp様からのコメントも参考にdomを使用して、ホワイトリスト外のものをreplaceしてみるというアプローチを考えました。
238
238
 
239
239
 
240
240
 

3

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

2021/04/23 07:59

投稿

pegy
pegy

スコア245

test CHANGED
File without changes
test CHANGED
@@ -229,3 +229,59 @@
229
229
  この状況で、元のhtml構造に復帰させる術について、アドバイスを頂ければ幸いでございます。
230
230
 
231
231
  よろしくお願い申し上げます。
232
+
233
+
234
+
235
+ ### 加筆
236
+
237
+ yambejp様からのコメントも参考にdomを使用して、ホワイトリスト外のものをreplace使用というアプローチを考えました。
238
+
239
+
240
+
241
+ 例えば以下のような`replaceChild()` を使用したとしても、ノードはツリー構造を持っている(と推察)ため単純に含めたくないnodeNameやtagNameの要素をreplaceすることができません。。
242
+
243
+ やはり手詰まりです。
244
+
245
+ ```php
246
+
247
+ $str = '<p>aaaa<span class="">bbb<table><tbody><td>a</td><tbody></table></span>a</p><img><script>alert(danger)</script>';
248
+
249
+ $dom = new DOMDocument();
250
+
251
+ $dom->loadHtml($str);
252
+
253
+ $all_tag = $dom->getElementsByTagName('*');
254
+
255
+ $white_tag_list = ['p','span','strong','em','u','s','blockquote','ol','ul','li','sub','sup','a','iframe','img'];
256
+
257
+
258
+
259
+ $replace_node =$dom->createElement('span');
260
+
261
+
262
+
263
+
264
+
265
+ foreach ($all_tag as $key) {
266
+
267
+ if (!in_array($key->nodeName,$white_tag_list,true)) {
268
+
269
+ // $key->tagName = "span";
270
+
271
+ // $key->nodeName = "span";
272
+
273
+ $key->parentNode->replaceChild($replace_node, $key);
274
+
275
+ var_dump($key);
276
+
277
+ }
278
+
279
+ }
280
+
281
+
282
+
283
+ echo $dom->saveHTML();
284
+
285
+ ```
286
+
287
+ 新たに試したこととして追記いたします。

2

再度修正

2021/04/23 07:58

投稿

pegy
pegy

スコア245

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### 前提とやりたいこと
6
6
 
7
- ユーザーからhtml構造のデータをformで受け取り、出力させたいのですが、出力する際にタグやその属性を含む情報であるため、`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
7
+ ユーザーからhtml構造のデータをformで受け取る予定なのですが、html構造として出力させいため、`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
8
8
 
9
9
  0. `src`や`href`といった不正なJSを埋め込まれる可能性がある属性については、Domを利用してチェック
10
10
 

1

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

2021/04/23 02:24

投稿

pegy
pegy

スコア245

test CHANGED
File without changes
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  ### 前提とやりたいこと
6
6
 
7
- ユーザーからhtml構造を受け取、出力する際に`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
7
+ ユーザーからhtml構造のデータformで受け取り、出力させいのですが、出力する際にタグやその属性を含む情報であるため、`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
8
8
 
9
9
  0. `src`や`href`といった不正なJSを埋め込まれる可能性がある属性については、Domを利用してチェック
10
10
 
@@ -220,7 +220,7 @@
220
220
 
221
221
  ### ご質問
222
222
 
223
- 最終的には元の`$get_html = '<p>this is a test <a href="dammy">link</a><img src="dammy"></p>';`の構造に復帰させて出力した上で、特定の属性値やホワイトリスト以外のタグを除去して出力させたいのですが、ここで行き詰まってしまいました。
223
+ 最終的には元の`$get_html = '<p>this is a test <a href="dammy">link</a><img src="dammy"></p>';`の構造に復帰させて、特定の属性値やホワイトリスト以外のタグを除去して出力させたいのですが、ここで行き詰まってしまいました。
224
224
 
225
225
  例えば、`strip_tags()`や`Domdocument / SimplXML`なども検討したのですが、前者は基本的に使用すべきではないという記事を読んだり、後者は、調べても例えば、存在する要素ノード`<p>`を存在しない`*^[]p^*` などに置換する術を見つけることができませんでした。
226
226