2013-08-06 22 views
0

为了TinyMCE的(单机)内的bbcodes工作,我创造了这个代码:preg_replace for bbcodes:如何提高安全性?

private function regExUrl($content) { 
    if(isset($content) && is_string($content)) { 
     return preg_replace(
     array('|(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)|', '|\[img\](.*)\[\/img\]|', '|\[b\]|', '|\[/b\]|', '|\[i\]|', '|\[/i\]|', '|\[url=../../../../\]|', '|\[/url\]|'), 
     array('<a href="$1">$1</a>', '<img src="$1" class="wide" />', '<b>', '</b>', '<i>', '</i>', '<url>', '</url>'), 
     $content); 

    } else { 
     return $content; 
    } 
} 

我如何才能提高代码的安全性之前,我将它融入我的生活,网站?还是可以吗? 用于插入图片和新闻的文本框位于通过保护区域内。

感谢您的帮助

+0

你还在清理数据还是仅仅解析它? – PeeHaa

+0

我不使用清洁过滤器。他们对我来说是新手(我是新手),但我使用strip_tags,以避免html代码。够了吗? – user2646170

回答

0

漏洞乍(有可能更多):

http://www.example.com/xxx?xxx"onmouseover="alert('XSS'); 
[img]javascript:alert('XSS')[/img] 
[img]xxx" onerror="alert('XSS')[/img] 

此外strip_tags()不打算作为安全功能;在以前的PHP版本中已经有解决方法,如果使用允许标签运行,它完全不安全。当然,它也会在评论中不允许合法使用小于号的符号。

(在非安全提示,它也可能有不匹配的标签,搞乱了页面的其余部分,我可以不知道是什么[url]应该在所有做的事情。)

安全地编写标记生成器非常困难。通常这意味着建议是使用一个已知好的库,但我个人从来没有见过一个水密的PHP bbcode实现(欢迎提供建议)。如果你想允许HTML风格的标记,那么看看HTML Purifier。还有其他更简单的面向用户的迷你标记语言,例如Markdown,但是再次找到正确支持它们的库可能是一个挑战。