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


Remove <script> and other tags with php

对于一个小的单页CMS,我想替换人们可能用于恶意的script和其他标签。

我已经尝试了strip_tagspreg_replace但由于某种原因它不起作用。

单页 CMS 有 6 个字段可供编辑。这些保存在纯文本文件中。当我编辑其中一个时,我需要它来删除所有标签,如 scriptembedobject<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);
相关文章: