PHP preg_replace 安全

PHP preg_replace security

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

function bbcode($input) {
    $search = array('/\[a url="(.+?)"\](.*?)\[\/a\]/is');

    $replace = array('<a href="" style="color: #337ab7; 
                         text-decoration: none" target="_blank">
                      </a>');

    return preg_replace($search, $replace, $input);
}

bbcode([a url="javascript://hello.com/%0Aalert(%27s%27)"]XSS[/url]);

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

和OP聊天后,看来OP站点被XSS感染了。

通常 XSS 来自不良用户,通过提交表单、评论输入、post、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);

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

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

提供的link has some recommendation how and where to look at. OWASP has top 10 list of possible attack you should read,他们也有较新的推荐指南。