Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在WordPress中向内联脚本添加nonce_Wordpress - Fatal编程技术网

如何在WordPress中向内联脚本添加nonce

如何在WordPress中向内联脚本添加nonce,wordpress,Wordpress,我试图通过wp_add_inline_script和wp_localize_script向WordPress中插入的内联脚本添加一个nonce,但我不知道怎么做。看起来没有WordPress过滤器。我的目标是为内联脚本提供一个nonce,这样我就可以定义一个内容安全策略,该策略不会破坏插入内联脚本的常见插件。最后,结果应该是这样的: <script type="text/javascript" nonce="xxxxxxxxxx">....</script> 。。。。

我试图通过wp_add_inline_script和wp_localize_script向WordPress中插入的内联脚本添加一个nonce,但我不知道怎么做。看起来没有WordPress过滤器。我的目标是为内联脚本提供一个nonce,这样我就可以定义一个内容安全策略,该策略不会破坏插入内联脚本的常见插件。最后,结果应该是这样的:

<script type="text/javascript" nonce="xxxxxxxxxx">....</script>
。。。。
其中xxxxxxxx为当前值


你有什么想法吗?

尝试使用wp\u enqueue\u脚本

function my_special_inline_script() {
    ?>
    <script>
        // your JS code
    </script>
    <?php
}

add_action( 'wp_enqueue_scripts', 'my_special_inline_script', 1, 1 );

因为内联脚本的HTML是由WordPress代码生成的

sprintf( "<script type='text/javascript'>\n%s\n</script>\n", ... )
sprintf(“\n%s\n\n”,…)
无法使用wp_add_inline_script()向HTML脚本元素添加属性,因为
是硬编码的

但是,过滤器“script_loader_标记”允许您在WordPress输出之前更改脚本元素的HTML

请注意,过滤器“script_loader_tag”不会应用于通过调用wp_localize_script()添加的脚本元素,因为这些元素是由WordPress代码输出的:

echo "<script type='text/javascript'>\n"; // CDATA and type='text/javascript' is not needed for HTML 5
echo "/* <![CDATA[ */\n";
echo "$output\n";
echo "/* ]]> */\n";
echo "</script>\n";
echo“\n”//HTML5不需要CDATA和type='text/javascript'
回声“/**/\n”;
回音“\n”;

由于这些都是回显的,
是硬编码的,因此您无法向wp_localize_script()的HTML脚本元素添加属性。

晚会迟到了一点,但我正是因为同样的原因才遇到了这个问题

我通过一点简单的
str\u replace
操作解决了
wp\u add\u inline\u脚本的问题

add_filter( 'script_loader_tag', 'add_nonce_to_script_tag', 10, 3 );

function add_nonce_to_script_tag( $tag, $handle, $src ) {

  // Check the $handle and respond accordingly
  if ( $handle === 'my-script' ) {
    $nonce_value = wp_create_nonce('my__script__nonce'); // or ref to an existing nonce
    $replace = sprintf("javascript' nonce='%s'>", $nonce_value );
    $tag = str_replace( "javascript'>", $replace, $tag);
  }

  return $tag;
}

// Then... $data is the inline JS from wherever
wp_add_inline_script('my-script', $data, 'before');

一旦内联脚本加载,我将看到带有nonce属性的
脚本
标记输出。这与我的内容安全策略配合得很好

检查此链接和此。。。我不知道,我也在找这个。谢谢你的评论。如果你看一下你提供的第二个链接,在底部你会看到我的问题:)阅读第一个链接,我们可以考虑使用散列而不是nonce,但是我也不知道如何为每个内联脚本创建散列,我看不到任何钩子可以做到这一点。如果有帮助,请查看此链接。非常感谢您的评论。我已经尝试过使用过滤器脚本\u loader\u标记,但没有成功。在我看来,WordPress内核应该提供向内联脚本添加nonce的可能性。现在看来,要实现一个严肃的内容安全策略,而不破坏没有考虑到它的第三方插件是不可能的。对于建立一个单一的网站更容易。我的目标是制作一个能够支持CSP的主题,但是如果用户决定激活它,那么WooCommerce等常见插件的所有内联脚本都将被停用。我将放弃“script\u loader\u tag”的过滤器,它应该适用于除wp\u localize\u script()添加的脚本之外的所有脚本。当WordPress没有一个操作/过滤器来做你需要的事情时,你可以随时修改WordPress核心-这不是最佳实践,但绝对必要。关于WordPress和CSP,我记得几年前我就考虑过了,得出的结论是这很难做到。顺便说一句,修改WordPress核心可以以最小侵入的方式完成。在这种情况下,我将删除“wp_head”操作“wp_print_head_scripts”,并将其替换为我自己的操作。我的操作将使用我自己的核心类WP_脚本的类扩展。只有一种方法WP_Scripts::print_extra_script()需要修改,这种修改很简单。按照我所描述的方式修改WordPress核心的要点是,当站点更新WordPress时,该站点仍应正常运行。
add_filter( 'script_loader_tag', 'add_nonce_to_script_tag', 10, 3 );

function add_nonce_to_script_tag( $tag, $handle, $src ) {

  // Check the $handle and respond accordingly
  if ( $handle === 'my-script' ) {
    $nonce_value = wp_create_nonce('my__script__nonce'); // or ref to an existing nonce
    $replace = sprintf("javascript' nonce='%s'>", $nonce_value );
    $tag = str_replace( "javascript'>", $replace, $tag);
  }

  return $tag;
}

// Then... $data is the inline JS from wherever
wp_add_inline_script('my-script', $data, 'before');