0

我对 Firefox 中的内容安全策略有疑问。这是我的基本代码:

<?php include_once 'corepolicies/csp.php'; ?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
        <script src="scripts/script.js"></script>
        <link href="style/style.css" rel="stylesheet" type="text/css"/>
    </head>
    <body>
        <form id="formTest" method="post" action="index.php">
            <input type="text" name="getText"/>
            <input type="submit" value="insert"/>
        </form>
        <div id="inDataForm">
            <?php
                if(isset($_POST['getText'])){
                    echo $_POST['getText'];
                }
            ?>
        </div>
        <script src="listeners/listener.js"></script>
    </body>
</html>

这是在php中提交一些数据的简单代码;这是我设置 CSP 标头的 php 文件

<?php

$rule = "default-src 'none'; ";

$rule .= "script-src ".
        "http://localhost/CSP/scripts/script.js ".
        "http://localhost/CSP/listeners/listener.js ".
        "http://code.jquery.com/jquery-1.9.1.js; ";

$rule .= "style-src http://localhost/CSP/style/style.css;";

foreach (array("X-WebKit-CSP", "X-Content-Security-Policy", "Content-Security-Policy") as $csp){
    header($csp . ": " . $rule);
}

?>

当我尝试在 Chrome 上加载我的网页时,一切正常,就像在 IE 下一样,但是当我在 Firefox 上运行它时,它没有正确应用 CSP。它说我的脚本和我的样式违反了 CSP script-src='none' 和 style-src='none'。所以它没有看到关于 script-src 和 style-src 的任何规则,我不知道为什么。

任何人都可以帮助我吗?我正在使用 Firefox 20.0

4

1 回答 1

0

我想我找到了解决方案。我尝试对我的代码进行一些更改,我发现 Firefox 使用 CSP 的方式很有趣。基本上,浏览器似乎无法验证文件的来源(比如我的 JS 或 CSS 文件,或者 jQuery JS 文件)。所以他只使用源域,比如我的脚本和风格的“self”,以及jQuery 的http://code.jquery.com。我所做的是设置有关客户端用户代理的控件,如果是 Firefox 22.0 或更低版本,我所做的是使用此标头:

X-Content-Security-Policy: default-src 'none'; script-src 'self' http://code.jquery.com; style-src 'self';

它工作正常:) 我担心内联脚本,但是当我使用 CSP 标头时,Firefox 默认禁用内联脚本。

所以我的代码是这个:

<?php
function isFirefox(){
    $browser = $_SERVER['HTTP_USER_AGENT'];
    $pos = strpos($browser, "Firefox");
    if($pos){
        $pos = strpos($browser, "/", $pos);
        $version = substr($browser, $pos, 4);
        $version = intval($version);
        if($version <= 22) return TRUE;
        else return FALSE;
    }
}

$rule = "default-src 'none'; ";

$rule .= "script-src ".
        "http://localhost/scripts/script.js ".
        "http://localhost/listeners/listener.js ".
        "http://code.jquery.com/jquery-1.9.1.js; ";

$rule .= "style-src http://localhost/style/style.css;";

if(isFirefox()){
    $rule = "default-src 'none'; script-src 'self' http://code.jquery.com; style-src 'self';";
}

foreach (array("X-WebKit-CSP", "X-Content-Security-Policy", "Content-Security-Policy") as $csp){
    header($csp . ": " . $rule);
}
?>

当然只是一个证明,它不是便携式的或其他任何东西,但如果有人遇到我同样的问题,我认为它会有所帮助:-)

于 2013-07-26T20:02:51.967 回答