使用php </script>删除<script>和其他标记

时间:2012-08-18 19:04:02

标签: php

对于一个小页面的CMS,我想替换script以及人们可能用于恶意的其他标记。

我已经尝试了strip_tagspreg_replace,但由于某些原因它无法正常工作。

单页CMS有6个要编辑的字段。这些保存在纯文本文件中。 当我编辑其中一个时,我需要删除所有标记,例如scriptembedobject<iframe>和其他标记。

我已经检查了HTML Purifier,但我不知道这应该如何工作,因为我不熟悉php。我觉得看起来有点太大了。

这是代码(此处我尝试从名为script的文本区域中移除newscontent标记中的代码:

<?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'));
?>

2 个答案:

答案 0 :(得分:3)

您的代码无效,因为您正在对变量$newscontent执行替换,但将$_POST['newscontent']写入文件。我猜你已经注册了全局变量(这很糟糕),否则会产生错误。

我建议你坚持使用HTMLPurifier。如果他们有“不良意图”,那么人们可以在文本中添加许多很多不好的东西,而且你的方法甚至不会划伤表面。例如,如果您要修复代码,则不会阻止人们添加如下内容:

<img src="http://www.google.com/logo.gif" onload="javascript:bad stuff here" />

更不用说不同字符集的复杂性了。

答案 1 :(得分:-1)

&LT;是正则表达式中的一个特殊字符,你需要逃脱它。

    $newscontent = preg_replace('/\<(script|object|embed).+?\<\/\1\>/im', '', $newscontent);