如何防止XSS更改WordPress中自定义全局Java脚本对象和方法

时间:2021-03-22 作者:Pappageorgio

我正在Wordpress中的一个项目中工作,该项目将多个项目排队。js文件,其中每个文件都会向全局javascript对象添加一个新方法,这是为了使所需的方法仅在满足某些条件时可用,如is_page(), is_singular(), etc.

除了避免使用多个全局函数污染window对象之外,以这种方式添加方法的目的主要是能够在内嵌javascript中调用这些方法,这些javascript与WordPress函数一起添加,如wp_localize_script(), 或wp_add_inline_script(), 或add_action( \'wp_footer\', function_name ), 等

每个js文件内容遵循添加方法的相同模式,如下所示:

(function(){
    if( typeof globalFunctions === \'undefined\' ){ // If global object doesn\'t exist create empty global object.
        window.globalFunctions = {};
    }

    globalFunctions.method1 = function( name ){  // once object is created add method.
        console.log( \'My name is \' + name );
    }
})();
在Wordpress函数中。php文件内容如下:

// FIRST STEP REGISTERING AND ENQUEUEING SCRIPTS IN FOOTER
function add_js_files_fn() {

    wp_register_script( \'method-1\', get_template_directory_uri() . \'/js/method-1.js\', array(), null, true );
    wp_register_script( \'method-2\', get_template_directory_uri() . \'/js/method-2.js\', array(), null, true );
    wp_register_script( \'method-3\', get_template_directory_uri() . \'/js/method-3.js\', array(), null, true );

    // this conditional only makes method 1 available if visited page has slug of \'page-slug-example\'
    if ( is_page( \'page-slug-example\' ) ) {  
        wp_enqueue_script( \'method-1\' );
    }

    wp_enqueue_script( \'method-2\' ); // this line makes method 2 available in any page or post
    wp_enqueue_script( \'method-3\' ); // this line makes method 3 available in any page or post
}

add_action( \'wp_enqueue_scripts\', \'add_js_files_fn\' );

// SECOND STEP CALLING METHOD WITH INLINE JAVASCRIPT IF IS A CERTAIN PAGE
if ( is_page( \'page-slug-example\' ) ) { 

    add_action( \'wp_footer\', function() { ?>

        <script type="text/javascript">
        (function(){

            globalFunctions.method1(\'John Doe\'); // Outputs My Name is John Doe

        })();
        </script>

    <?php }, 999 ); 
}
?>
虽然这段代码工作得很好。我担心的是安全性,比如XSS攻击的目标是并改变由排队者首先创建的全局globalFunctions对象。js文件,因此,之后调用的方法可能会运行恶意代码。

1 个回复
SO网友:Jacob Peattie

你没有做任何异常或不安全的事情。您只是在定义函数,这对于JavaScript来说是一件非常正常和合理的事情。如果您的页面上运行恶意脚本,那么当然,它可以重新定义这些方法,但它也可以做其他更糟糕的事情。

这就是为什么你需要确保恶意脚本不能在页面上运行的基本做法,如清理和转义。没有关于不定义函数的最佳实践。如果你不想这样做,JavaScript就根本无法工作。