【问题标题】:Play Framework won't run inline javascriptPlay Framework 不会运行内联 javascript
【发布时间】:2018-07-25 06:59:51
【问题描述】:

我正在尝试使用 play framework 2.6 和 scala 设置一个简单的应用程序,但我似乎无法从我的 html 模板中运行内联 javascript。我不断收到错误:

拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“default-src 'self'”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-DdH/amfJizOgk2xZ+Xst5j13qHxPYrrrfT6x/TzfYiA=”)或随机数(“nonce-...”)。另请注意,'script-src' 未显式设置,因此 'default-src' 用作后备。

我的 scala 代码是:

package controllers
import javax.inject._
import play.api._
import play.api.mvc._
import play.twirl.api.Html
class HomeController @Inject()(cc: ControllerComponents) extends 
AbstractController(cc) {

def index() = Action { implicit request: Request[AnyContent] =>
  Ok(views.html.main("Hello World"))
}
}

我的 html.main.html 文件看起来像:

@(title: String)

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta http-equiv="Content-Security-Policy" content="default-src 'self'">
        <title>@title</title>
        <link rel="stylesheet" media="screen" 
href="@routes.Assets.versioned("stylesheets/main.css")">
        <link rel="shortcut icon" type="image/png" 
href="@routes.Assets.versioned("images/favicon.png")">

    </head>
    <body>
        <script type = "text/javascript">
            document.write("Check");
        </script>

        <script src = "@routes.Assets.versioned("javascripts/main.js")" type = 
"text/javascript"></script>
    </body>
</html>

所以理想情况下,当我通过本地主机连接时,它应该在屏幕上打印“检查”。我尝试将我的 application.conf 文件更改为

play.filters.headers.contentSecurityPolicy = null

但这也没有用。我还能尝试什么?

【问题讨论】:

  • 这可能听起来很疯狂,但请尝试移动内联脚本,使其成为最后一个 javascript 标记。然后尝试使用 alert("Check") 代替
  • @RobertUdah 我刚试了一下,没用
  • 这似乎不是 Play 特有的。查看stackoverflow.com/questions/8502307/…

标签: javascript html scala playframework


【解决方案1】:

避免此问题的最佳方法是使用包含您的代码的额外 javascript 文件。但我有一个类似的问题,并通过在我的 application.conf 中设置一个很长的策略来解决它

play.filters.headers.contentSecurityPolicy = "default-src 'self';script-src 'self' https://my-site.com 'unsafe-inline';style-src 'self' https://my-site.com;font-src 'self' https://my-site.com;img-src 'self' https://my-site.com data:"

my-site.com 是提供我的应用程序的主机名。

【讨论】:

    【解决方案2】:

    play.filters.headers.contentSecurityPolicy = null
    

    是正确的,现在删除

    <meta http-equiv="Content-Security-Policy" content="default-src 'self'">
    

    然后它必须按预期工作

    【讨论】:

    • 'play.filters.headers.contentSecurityPolicy = null' 不是最佳做法。
    • @MHJ,当然不是。如果你想让它工作,我只是回答它如何工作。作者可以将其用于快速原型制作等。这是有理由的,要么 Play 作者必须排除将内容安全策略设置为 null 的能力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    相关资源
    最近更新 更多