ドキュメントに基づいてstrip_tags
、2 番目のパラメーターは許容されるタグを受け取ります。ただし、私の場合は逆にしたいと思います。通常 (デフォルト) 受け入れるタグを受け入れますが、タグscript_tags
のみを削除するとし<script>
ます。これに可能な方法はありますか?
私は誰かが私のためにそれをコーディングするという意味ではありませんが、これを達成する方法についての可能な方法の入力 (可能であれば) は大歓迎です.
ドキュメントに基づいてstrip_tags
、2 番目のパラメーターは許容されるタグを受け取ります。ただし、私の場合は逆にしたいと思います。通常 (デフォルト) 受け入れるタグを受け入れますが、タグscript_tags
のみを削除するとし<script>
ます。これに可能な方法はありますか?
私は誰かが私のためにそれをコーディングするという意味ではありませんが、これを達成する方法についての可能な方法の入力 (可能であれば) は大歓迎です.
編集
HTML Purifier HTML.ForbiddenElements
config ディレクティブを使用するには、次のようにします。
require_once '/path/to/HTMLPurifier.auto.php';
$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.ForbiddenElements', array('script','style','applet'));
$purifier = new HTMLPurifier($config);
$clean_html = $purifier->purify($dirty_html);
HTML.ForbiddenElements
に設定する必要がありarray
ます。私が知らないのは、array
メンバーがどのような形を取るべきかです:
array('script','style','applet')
または:
array('<script>','<style>','<applet>')
または、他の何か?
区切り記号なしの最初の形式だと思います。TinyMCE の構文HTML.AllowedElements
にやや一般的な構成文字列の形式を使用します。valid elements
tinyMCE.init({
...
valid_elements : "a[href|target=_blank],strong/b,div[align],br",
...
});
だから私の推測では、それは単なる用語であり、属性を指定する必要はありません(要素を禁止しているため... もありますがHTML.ForbiddenAttributes
)。しかし、それは推測です。
HTML.ForbiddenAttributes
ドキュメントからこのメモも追加します。
警告:このディレクティブは を補完するもの
%HTML.ForbiddenElements
です。したがって、このディレクティブを使用する前によく考える必要がある理由については、そのディレクティブを参照してください。
ブラックリストはホワイトリストほど「堅牢」ではありませんが、理由がある場合があります。注意して注意してください。
テストがなければ、何を伝えたらよいかわかりません。答えを探し続けますが、おそらく最初に寝ます。とても。:)
HTML Purifierを実際に使用してその構成ディレクティブを利用する必要があると思いHTML.ForbiddenElements
ますが、本当に使用したい場合strip_tags()
は、ブラックリストからホワイトリストを取得することをお勧めします。つまり、不要なものを削除して、残ったものを使用します。
例えば:
function blacklistElements($blacklisted = '', &$errors = array()) {
if ((string)$blacklisted == '') {
$errors[] = 'Empty string.';
return array();
}
$html5 = array(
"<menu>","<command>","<summary>","<details>","<meter>","<progress>",
"<output>","<keygen>","<textarea>","<option>","<optgroup>","<datalist>",
"<select>","<button>","<input>","<label>","<legend>","<fieldset>","<form>",
"<th>","<td>","<tr>","<tfoot>","<thead>","<tbody>","<col>","<colgroup>",
"<caption>","<table>","<math>","<svg>","<area>","<map>","<canvas>","<track>",
"<source>","<audio>","<video>","<param>","<object>","<embed>","<iframe>",
"<img>","<del>","<ins>","<wbr>","<br>","<span>","<bdo>","<bdi>","<rp>","<rt>",
"<ruby>","<mark>","<u>","<b>","<i>","<sup>","<sub>","<kbd>","<samp>","<var>",
"<code>","<time>","<data>","<abbr>","<dfn>","<q>","<cite>","<s>","<small>",
"<strong>","<em>","<a>","<div>","<figcaption>","<figure>","<dd>","<dt>",
"<dl>","<li>","<ul>","<ol>","<blockquote>","<pre>","<hr>","<p>","<address>",
"<footer>","<header>","<hgroup>","<aside>","<article>","<nav>","<section>",
"<body>","<noscript>","<script>","<style>","<meta>","<link>","<base>",
"<title>","<head>","<html>"
);
$list = trim(strtolower($blacklisted));
$list = preg_replace('/[^a-z ]/i', '', $list);
$list = '<' . str_replace(' ', '> <', $list) . '>';
$list = array_map('trim', explode(' ', $list));
return array_diff($html5, $list);
}
次に実行します。
$blacklisted = '<html> <bogus> <EM> em li ol';
$whitelist = blacklistElements($blacklisted);
if (count($errors)) {
echo "There were errors.\n";
print_r($errors);
echo "\n";
} else {
// Do strip_tags() ...
}
したがって、許可したくないものを渡すと、HTML5 要素リストが返され、文字列に結合した後にarray
フィードできる形式になります。strip_tags()
$stripped = strip_tags($html, implode('', $whitelist)));
買い手責任負担
さて、私はこれを一緒にハックしましたが、まだ考えていない問題がいくつかあることを知っています. たとえば、引数のstrip_tags()
man ページから:$allowable_tags
ノート:
このパラメーターには空白を含めないでください。タグは、最初の空白または と の
strip_tags()
間の大文字と小文字を区別しない文字列と見なされます。空の文字列を返すことを意味します。<
>
strip_tags("<br/>", "<br>")
遅くなりましたが、何らかの理由で、これがこのアプローチにとって何を意味するのかよくわかりません。だから明日考えなきゃいけない。$html5
また、このMDN ドキュメント ページから関数の要素の HTML 要素リストをコンパイルしました。鋭い読者は、すべてのタグが次の形式になっていることに気付くかもしれません。
<tagName>
これが結果にどのように影響するかはわかりません.ショートタグの使用のバリエーションと、エヘム、奇妙な<tagName/>
バリエーションのいくつかを考慮する必要があるかどうか. そしてもちろん、他にもタグがあります。
したがって、おそらく製品化の準備ができていません。しかし、あなたはその考えを理解します。
まず、このトピックについて他の人が言ったことを確認してください。
<script>タグとその間のすべてをPHPで削除しますか?
と
2つの選択肢があるようです。1つは正規表現ソリューションであり、上記の両方のリンクがそれらを示しています。2つ目は、 HTMLPurifierを使用することです。
ユーザーコンテンツのサニタイズ以外の理由でスクリプトタグを削除する場合は、正規表現が適切なソリューションになる可能性があります。ただし、誰もが警告しているように、入力をサニタイズする場合はHTMLPurifierを使用することをお勧めします。
PHP (5 以上) ソリューション:
<script>
タグ (またはその他) を削除したい場合、およびタグ内のコンテンツも削除したい場合は、次を使用する必要があります。
オプション 1 (最も簡単):
preg_replace('#<script(.*?)>(.*?)</script>#is', '', $text);
オプション 2 (より用途が広い):
<?php
$html = "<p>Your HTML code</p><script>With malicious code</script>"
$dom = new DOMDocument();
$dom->loadHTML($html);
$script = $dom->getElementsByTagName('script');
$remove = [];
foreach($script as $item)
{
$item->parentNode->removeChild($item);
}
$html = $dom->saveHTML();
次に、次の$html
ようになります。
"<p>Your HTML code</p>"
私は以下を使用します:
function strip_tags_with_forbidden_tags($input, $forbidden_tags)
{
foreach (explode(',', $forbidden_tags) as $tag) {
$tag = preg_replace(array('/^</', '/>$/'), array('', ''), $tag);
$input = preg_replace(sprintf('/<%s[^>]*>([^<]+)<\/%s>/', $tag, $tag), '$1', $input);
}
return $input;
}
次に、次のことができます。
echo strip_tags_with_forbidden_tags('<cancel>abc</cancel>xpto<p>def></p><g>xyz</g><t>xpto</t>', 'cancel,g');
出力:'abcxpto<p>def></p>xyz<t>xpto</t>'
echo strip_tags_with_forbidden_tags('<cancel>abc</cancel> xpto <p>def></p> <g>xyz</g> <t>xpto</t>', 'cancel,g');
出力:'abc xpto <p>def></p> xyz <t>xpto</t>'
これは、禁止されたタグのリストを削除するために使用するもので、コンテンツをラップするタグとコンテンツを含むタグの両方を削除でき、さらに残りの空白を削除できます。
$description = trim(preg_replace([
# Strip tags around content
'/\<(.*)doctype(.*)\>/i',
'/\<(.*)html(.*)\>/i',
'/\<(.*)head(.*)\>/i',
'/\<(.*)body(.*)\>/i',
# Strip tags and content inside
'/\<(.*)script(.*)\>(.*)<\/script>/i',
], '', $description));
入力例:
$description = '<html>
<head>
</head>
<body>
<p>This distinctive Mini Chopper with Desire styling has a powerful wattage and high capacity which makes it a very versatile kitchen accessory. It also comes equipped with a durable glass bowl and lid for easy storage.</p>
<script type="application/javascript">alert('Hello world');</script>
</body>
</html>';
出力結果:
<p>This distinctive Mini Chopper with Desire styling has a powerful wattage and high capacity which makes it a very versatile kitchen accessory. It also comes equipped with a durable glass bowl and lid for easy storage.</p>