質問編集履歴
4
誤字の修正
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
試したことを、追記いたしました。
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
再度修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
いつもお世話になっております。
|
2
2
|
|
3
3
|
### 前提とやりたいこと
|
4
|
-
ユーザーからhtml構造のデータをformで受け取
|
4
|
+
ユーザーからhtml構造のデータをformで受け取る予定なのですが、html構造として出力させたいため、`htmlspecialchars`を単純に利用できないという状況にございます。そこで、
|
5
5
|
0. `src`や`href`といった不正なJSを埋め込まれる可能性がある属性については、Domを利用してチェック
|
6
6
|
0. タグについては、ホワイトリストを作成して限定して無害なものに置換→出力する際に一旦`htmlspecialchars`して、ホワイトリスト対象の物だけ、戻すというアプローチ
|
7
7
|
で以下のコードを作成いたしました。
|
1
誤字や表現を一部修正しました。
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
いつもお世話になっております。
|
2
2
|
|
3
3
|
### 前提とやりたいこと
|
4
|
-
ユーザーからhtml構造を受け取
|
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構造に復帰させる術について、アドバイスを頂ければ幸いでございます。
|