PHP preg_replace security


PHP preg_replace security

我需要防止跨站点脚本(XSS)。如何验证它不是跨站点脚本?问题出在我的"url"BBCode上。

function bbcode($input) {
    $search = array('/'[a url="(.+?)"'](.*?)'['/a']/is');
    $replace = array('<a href="$1" style="color: #337ab7; 
                         text-decoration: none" target="_blank">$2
                      </a>');
    return preg_replace($search, $replace, $input);
}
bbcode([a url="javascript://hello.com/%0Aalert(%27s%27)"]XSS[/url]);

上面的代码就是一个例子。当您单击链接时,会出现一个JavaScript弹出窗口。此外,该数组中还有更多的BBCode,但我在发布时删除了它们,以使其更容易。

与OP聊天后,看起来OP站点感染了XSS。

通常情况下,XSS来自不良用户,通过提交表单、评论输入、帖子、URL等。因此,我们需要防止XSS,但由于您已经受到了伤害,您可以开始使用以下功能来阻止脚本执行,并分析和修复您的网站以防未来的攻击。

function filterScript($content)
{
    $default = '';
    return preg_replace('/href="javascript:[^"]+"/', $default, $content);
}

测试

我们想象这是我们的攻击内容:

$content = '<a href="javascript://somedomain.com/%0Aalert(%27s%27)">XSS</a>';
// this link is attacked
echo $content . "<br>";
// this link is not attacked
echo filterScript($content);

编辑:除了这个答案,还值得一看这个答案。

注意:以上功能将有所帮助,但不是一个完整的解决方案,你真正需要的是制定一个网站策略,找出弱点,并找出你应该如何保护它。

提供的链接有一些关于如何以及在哪里查看的建议。OWASP有你应该阅读的十大可能攻击列表,他们还有一个更新的推荐指南。