wordpress 中的 CSP 和脚本本地化

CSP and script localization in wordpress

我想在我的 Wordpress 网站上正确使用内容安全策略,但也不想硬编码 URI。

我正在将我所有的内联脚本移动到一个文件中,并将散列添加到所有脚本标签以用于子资源完整性。

ajax 本地化让我很难受;它 运行s PHP 获取 JS 文件名,并将其内联输出到一个对象(被 ajax 调用使用)。

为了使 admin-ajax 可用,我

global $wp_query;
wp_localize_script('project-js', 'ajax_object', array(
    'ajaxurl' => admin_url('admin-ajax.php'),
    'some_vars' => json_encode($wp_query->query)
));

输出:

<script type="text/javascript" id="project-js-js-extra">
/* <![CDATA[ */
var ajax_object = {"ajaxurl":"http:\/\/domain.tld\/wp\/wp-admin\/admin-ajax.php","some_vars":"[]"};
/* ]]> */
</script>

我需要能够向此标签添加哈希,但我找不到正确的方法。

我可以在 PHP 中生成它,例如:

global $wp_scripts;
$l10n_candidate = array(
    'ajaxurl' => admin_url( 'admin-ajax.php' ),
    'some_vars' => json_encode( $wp_query->query )
);

$script_content = "/* <![CDATA[ */
var ajaxpagination = " . wp_json_encode( $l10n_candidate ) . ';
/* ]]> */';
$script_hash = hash('sha256', $script_content);

但我不知道如何正确地将它添加到页面中,而且,这感觉太 hacky 了。

如果不输出此散列,或将此对象创建移动到我的主 JavaScript 文件,该页面将不会通过我的 CSP,脚本也不会 运行。

我该如何完成?

到目前为止,我唯一能解决的方法是使用 [wp_enqueue_scripts][1],这是 [wp_enqueue_script][2] 在使用 [wp_localize_script][3]

感觉不是最好的解决方案,但确实有效。

function abr_ajax_pagi_obj(){
    global $wp_query;

    $l10n_candidate = array(
      'ajaxurl' => admin_url( 'admin-ajax.php' ),
      'some_vars' => json_encode( $wp_query->query ),
    );

    $script_content = "/* <![CDATA[ */
var ajaxpagination = " . wp_json_encode( $l10n_candidate ) . ';
/* ]]> */';
$script_hash = 'sha256-' . base64_encode(hash('sha256', $script_content,true));
?><script integrity="<?php echo $script_hash?>"><?php
echo $script_content;?></script><?php 
    }

add_action( 'wp_enqueue_scripts', 'abr_ajax_pagi_obj', 5, 5 );


  [1]: https://developer.wordpress.org/reference/hooks/wp_enqueue_scripts/
  [2]: https://developer.wordpress.org/reference/functions/wp_enqueue_script/
  [3]: https://developer.wordpress.org/reference/functions/wp_localize_script/