0

我在尝试剥离 / 和 \ 字符时遇到问题。当我尝试使用 \\ 剥离时,它会剥离 \ 但当我尝试 /// 时,它根本不会剥离 /。

function stripinname( $text )
{
$text = preg_replace(
    array(
        '/\|/','/\"/','/\</','/\>/','/\s[\s]+/','/^[\-]+/','/[\-]+$/','/\%/','/\\\\/','/\////','/\@/','/\&/','/\:/','/\;/','/\-/',
        '@<head[^>]*?>.*?</head>@siu',
        '@<style[^>]*?>.*?</style>@siu',
        '@<script[^>]*?.*?</script>@siu',
        '@<object[^>]*?.*?</object>@siu',
        '@<embed[^>]*?.*?</embed>@siu',
        '@<applet[^>]*?.*?</applet>@siu',
        '@<noframes[^>]*?.*?</noframes>@siu',
        '@<noscript[^>]*?.*?</noscript>@siu',
        '@<noembed[^>]*?.*?</noembed>@siu',
      // Add line breaks before and after blocks
        '@</?((address)|(blockquote)|(center)|(del))@iu',
        '@</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))@iu',
        '@</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))@iu',
        '@</?((table)|(th)|(td)|(caption))@iu',
        '@</?((form)|(button)|(fieldset)|(legend)|(input))@iu',
        '@</?((label)|(select)|(optgroup)|(option)|(textarea))@iu',
        '@</?((frameset)|(frame)|(iframe))@iu',
    ),
    array(
        ' ',' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ',"$0", "$0", "$0", "$0", "$0", "$0","$0", "$0",), $text );

// you can exclude some html tags here, in this case B and A tags        
return strip_tags($text);
}
4

1 回答 1

2

不要这样做。

您知道 MSIE 支持使用 CSS 从 CSS 加载 javascriptbehavior:url()吗?你知道我们可以在标签中执行javascript:url吗?<img>

使用别人的 HTML sanitizer;HTML Purifier很好——它有很多用户,只要有人在其中发现错误,它就会得到修复,并且每个使用它的人都会受益。

而您代码中的任何错误(例如我现在正在查看的错误)只有在您找到它时才会被修复。

我会想办法进去的。

我经常做。

编辑:

您的代码不起作用的原因是您不理解它。在这样的领域不了解您的程序与安全相关的问题的来源。既然你决定我只是“像个大人物一样发帖”,你就忽略了我的建议。通过这样做,您对整个软件开发人员/工程师行业造成了伤害:

  1. 你不懂正则表达式;,/,匹配斜线。
  2. 您不了解 PHPpreg_replace()实际如何匹配正则表达式:要匹配所有斜杠,您需要全局匹配它们,如,/,g
  3. 您不明白/将合法地出现在 HTML 标记中。通过按照您的方式替换它,我实际上可以创建您尝试删除的 HTML 标记。
  4. 你认为strip_tags()做它在锡上说的。它没有。
  5. 你算错了你的论点。你认为你正在分裂的一些东西只是被它们自己取代了。
  6. 你不是在检查错误。preg_replace()可以返回NULL

你太自负了;你认为你已经掌握了这个伟大演出的秘密,它只涉及在 stackoverflow 上提问和从 PHP wiki 复制/粘贴示例。你需要阻止它。编写无错误的程序需要理解每一个单词,虽然我很乐意帮助你学习如何做到这一点,但我将不得不坚持你的行为要负责任。

你应该有道德意识来避免编写你还没有足够经验编写的代码。

从信誉良好的来源获取这些例程,并从其他人的错误中吸取教训;您的客户/雇主/等不值得您的错误;我们的行业不值得这种废话。

于 2012-12-23T19:28:50.577 回答