[英]Adding bookmarklet to wordpress post
我正在尝试将javascript bookmarklet链接添加到我的WordPress网站上的帖子。 但是它没有出现在帖子预览中。 当我检查WordPress添加到帖子的链接时,它已将其转换为javascript:void(0)
。 这个简单的例子再现了这个问题。
<a href="javascript:alert('Alert!');">Search Scholar</a>
还有一些其他人在这里 , 这里 , 这里和这里遇到了同样的问题但是没有人似乎已经找到了一个解决方案,除了给人们的书签代码供人们复制和粘贴并创建他们自己的书签。
导致此问题的原因是Chrome的XSS保护功能在通过wp-admin提交时从链接中删除了javascript。 一个“解决方案”是添加行header("X-XSS-Protection: 0");
到根文件夹中的wp-blog-header.php。 这是不安全的,因为它关闭了WordPress站点上的XSS保护,但它确实允许在页面加载时呈现bookmarklet代码。
是否有任何真正的解决方案可以解决此问题,而不涉及关闭XSS保护? 是否有一个插件,我可以安装到我的WordPress,允许我在我的帖子中添加javascript:
链接?
编辑2经过更多的研究,这实际上是由OP提到的浏览器的XSS检测引起的(与任何特定于WordPress的功能相反)。 只有在WordPress中单击“ Preview
按钮时才会出现此问题,并且仅在该初始页面加载时出现。 显然,WordPress会在请求标头中发送一些HTML,并在浏览器中触发XSS功能。 如果您加载预览,然后刷新页面,XSS问题就会消失,并且javascript:
链接会在保存时显示。 在查看实际站点时,在发布页面后,永远不会遇到此XSS问题。
编辑经过一些更深入的研究(与@gnarf合作 ),事实证明,实际问题归结为WordPress处理javascript:
预览功能中的链接的方式。 似乎WordPress有一些自定义Javascript运行并转换所有javascript:
链接到javascript:void(0)
链接(删除任何自定义代码),但只有在您预览页面时。 发布页面后, javascript:
链接将正确呈现。
原帖 (描述如何阻止WordPress剥离javascript:
将帖子保存为非管理员用户时的链接,这是我认为原来的问题可能已经存在)
看起来WordPress剥离了content_save_pre
过滤器中的HTML。 具体来说,它调用wp-includes\\kses.php
的wp_kses_bad_protocol
方法:
/**
* Sanitize string from bad protocols.
*
* This function removes all non-allowed protocols from the beginning of
* $string. It ignores whitespace and the case of the letters, and it does
* understand HTML entities. It does its work in a while loop, so it won't be
* fooled by a string like "javascript:javascript:alert(57)".
*
* @since 1.0.0
*
* @param string $string Content to filter bad protocols from
* @param array $allowed_protocols Allowed protocols to keep
* @return string Filtered content
*/
function wp_kses_bad_protocol($string, $allowed_protocols) {
$string = wp_kses_no_null($string);
$iterations = 0;
do {
$original_string = $string;
$string = wp_kses_bad_protocol_once($string, $allowed_protocols);
} while ( $original_string != $string && ++$iterations < 6 );
if ( $original_string != $string )
return '';
return $string;
}
$allowed_protocols
参数通过wp_allowed_protocols()
方法检索,该方法将kses_allowed_protocols
过滤器应用于协议列表。
有了这些信息,您应该能够绑定到kses_allowed_protocols
过滤器以将javascript
添加为有效的(请注意,这当然会打开安全问题):
add_filter( 'kses_allowed_protocols', function ($protocols) {
$protocols[] = 'javascript';
return $protocols;
});
增强此方法安全性的一种方法是为特定用户或特定角色添加检查(默认情况下,看起来此过滤器实际上不在管理帐户上运行,因此您可以使用javascript:
指向您心脏内容的链接作为管理员)在允许javascript
协议之前。
最初的问题当然是由于:
如果没有特殊的WordPress插件,则无法将JavaScript添加到帖子内容中,该插件会删除过滤器,以防止在帖子内容区域内出现不需要的代码以保护用户。
要避免安装插件,可以使用推荐的方法:
将JavaScript添加到WordPress生成的页面和WordPress主题或插件的安全和推荐方法是使用
wp_enqueue_script()
。 此函数包括脚本(如果尚未包含),并安全地处理依赖项。
以下是wp_enqueue_script()
所有细节:
http://codex.wordpress.org/Function_Reference/wp_enqueue_script
然后,您需要创建一个包含的自定义JavaScript文件,并注册帖子所需的功能。
您可以在该文件中创建一个函数,例如将您的bookmarklet链接作为参数,并将document.write
(或将节点作为子节点附加到已知元素)到当前位置。
然后包含脚本并在帖子中调用函数:
<script type="text/javascript" src="/scripts/myscript.js"></script>
<script type="text/javascript">
<!--
bookmarklet(myLink);
//--></script>
您只需要在同一篇文章中链接脚本 - 如果您在每个帖子中使用此脚本,最好将其链接到标题( header.php
模板文件,元标记和样式表链接之间)。
<script type="text/javascript" src="/scripts/myscript.js"></script>
或者如果以上情况不起作用:
<script type="text/javascript" src="<?php bloginfo('template_url'); ?>/pathto/myscript.js"></script>
另请注意,如果src
属性被剥离,则需要转到仪表板中的“用户和个人选项”以关闭富编辑器。
有关如何在全球和帖子中使用WordPress中的JavaScript的来源和更多信息:
http://codex.wordpress.org/Using_Javascript#Javascript_in_Posts
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.