質問編集履歴
4
誤字の修正
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
試したことを、追記いたしました。
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
再度修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
### 前提とやりたいこと
|
6
6
|
|
7
|
-
ユーザーからhtml構造のデータをformで受け取
|
7
|
+
ユーザーからhtml構造のデータをformで受け取る予定なのですが、html構造として出力させたいため、`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
|
8
8
|
|
9
9
|
0. `src`や`href`といった不正なJSを埋め込まれる可能性がある属性については、Domを利用してチェック
|
10
10
|
|
1
誤字や表現を一部修正しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
### 前提とやりたいこと
|
6
6
|
|
7
|
-
ユーザーからhtml構造を受け取
|
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
|
|