对于一个小的单页CMS,我想替换人们可能用于恶意的script
和其他标签。
我已经尝试了strip_tags
和preg_replace
但由于某种原因它不起作用。
单页 CMS 有 6 个字段可供编辑。这些保存在纯文本文件中。当我编辑其中一个时,我需要它来删除所有标签,如 script
、 embed
、 object
、 <iframe>
等。
我已经检查了HTML净化器,但我不明白它应该如何工作,因为我对php并不了解。我猜对于我的需求来说看起来有点太大了。
这是代码(这里我尝试从名为 newscontent
的文本区域中的script
标签中删除标签):
<?php
if (isset($_POST['edit'])) {
$newscontent = preg_replace('/<script.+?<'/script>/im', '', $newscontent);
if (file_put_contents('title.txt', utf8_encode($_POST['title'])) !== FALSE &&
file_put_contents('subtitle.txt', utf8_encode($_POST['subtitle'])) !== FALSE &&
file_put_contents('datum.txt', utf8_encode($_POST['datum'])) !== FALSE &&
file_put_contents('time.txt', utf8_encode($_POST['time'])) !== FALSE &&
file_put_contents('timemin.txt', utf8_encode($_POST['timemin'])) !== FALSE &&
file_put_contents('newscontent.txt', utf8_encode($_POST['newscontent'])) !== FALSE
)
echo '<p class="succes">Your changes are saved</p>', "'n";
}
$title = utf8_decode(file_get_contents('title.txt'));
$subtitle = utf8_decode(file_get_contents('subtitle.txt'));
$datum = utf8_decode(file_get_contents('datum.txt'));
$time = utf8_decode(file_get_contents('time.txt'));
$timemin = utf8_decode(file_get_contents('timemin.txt'));
$newscontent = utf8_decode(file_get_contents('newscontent.txt'));
?>
您的代码不起作用,因为您正在对变量执行替换 $newscontent
,但$_POST['newscontent']
写入文件。我猜你已经打开了寄存器全局变量(这很糟糕),否则会产生错误。
我建议你坚持使用HTMLPurifier。如果人们有"不良意图",他们可能会在文本中添加很多很多不好的东西,而你的方法甚至没有触及表面。例如,如果您要修复代码,它不会阻止人们添加类似以下内容:
<img src="http://www.google.com/logo.gif" onload="javascript:bad stuff here" />
更不用说不同字符集的复杂性了。
<是>
正则表达式中的一个特殊字符,您需要对其进行转义。
$newscontent = preg_replace('/'<(script|object|embed).+?'<'/'1'>/im', '', $newscontent);
是>