Echo JavaScript Safely

时间:2016-03-06 作者:Hemant Aggarwal

我正在WordPress主题的数据验证方面工作。我有一个选项,用户可以在后端输入JS,在前端的脚本标记之间输出JS。

我面临的问题是,我找不到只允许JavaScript通过的WordPress函数。如果用户在其中键入一些垃圾、CSS/HTML,该怎么办?

WordPress core/PHP中有我可以使用的函数吗?还是我要直接回应?

3 个回复
SO网友:Tom J Nowell

您所要求的是不可能的,没有安全的javascript输入框。

即使我们去掉额外的脚本和样式标记,这也是毫无意义的,因为javascript代码本身就具有内在的危险性,并且可以使用DOM构造创建它想要的任何元素,例如:

var s = jQuery( \'script\', { \'src\': \'example.com/dangerous.js\' } );
jQuery(\'body\').append( s );

var s = jQuery( \'link\', {
    \'rel\': \'stylesheet\',
    \'type\': \'text/css\',
    \'href\': \'example.com/broken.css\'
} );
jQuery(\'body\').append( s );
千万不要窃取您的登录cookie等。Javascript本身就很危险,您试图实现的是攻击向量。这并不是因为人们可能会脱离javascript,而是因为javascript本身具有潜在的危险性

SO网友:thebigtine

从这个答案中:https://wordpress.stackexchange.com/a/107558/76059

如果您想让用户能够输入自己的Javascript代码,但不想让他们输入任何HTML,您可以使用以下方法:

preg_match( \'/\\A<script((?!<[a-zA-Z])[\\s\\S])*</script>\\Z/\', trim($input) );
trim函数从开头和结尾删除空格,并且regex模式仅在以开头时匹配字符串\'<script\', 结束于\'</script>\', 而且没有任何\'<\' 紧跟字母的字符。这将有效地防止任何游离的HTML,同时允许用户在出于某种原因需要时使用小于运算符来放置一些Javascript代码。

我要做的另一件事是确保只有管理员才能设置此选项,如果他或她在其中偷偷插入一些HTML并破坏自己的网站,那是他们自己的错。当然,如果这要进入数据库,请确保已针对SQL对其进行了清理。

SO网友:Mark Kaplun

您不应该让用户输入JS代码。用户不是开发人员,不应该编写代码。一旦用户编写代码,可能发生的任何不好的事情都由他负责,你可能或应该做的很少,因为毕竟这是他的网站,如果他想写代码,那么你是谁,告诉他“不”。

现在,强迫用户输入JS代码是一种非常糟糕的用户体验,所以问题应该是有没有更好的方法让用户输入信息而不必编写代码(不幸的是,并不总是有这样的方法)。

相关推荐

Need a help on sanitization

我在评论中有一个主题,我确实在像这样的少数情况下添加了“type”=>“select”部分。$wp_customize->add_setting( \'personal_lite_post_link\', array( \'default\' => \'enable\', \'sanitize_callback\' => \'personal_lite_select_callback\' ) ); $w