将bookmarklet添加到wordpress帖子

Jam*_*ull 6 javascript xss wordpress header bookmarklet

我正在尝试将javascript bookmarklet链接添加到我的WordPress网站上的帖子.但是它没有出现在帖子预览中.当我检查WordPress添加到帖子的链接时,它已将其转换为javascript:void(0).这个简单的例子再现了这个问题.

<a href="javascript:alert('Alert!');">Search Scholar</a>
Run Code Online (Sandbox Code Playgroud)

还有一些其他人在这里,这里,这里这里遇到了同样的问题但是没有人似乎已经找到了一个解决方案,除了给人们的书签代码供人们复制和粘贴并创建他们自己的书签.

导致此问题的原因是Chrome的XSS保护功能在通过wp-admin提交时从链接中删除了javascript.一个"解决方案"是将行添加header("X-XSS-Protection: 0");到根文件夹中的wp-blog-header.php.这是不安全的,因为它关闭了WordPress站点上的XSS保护,但它确实允许在页面加载时呈现bookmarklet代码.

是否有任何真正的解决方案可以解决此问题,而不涉及关闭XSS保护?是否有一个插件,我可以安装到我的WordPress,以允许我javascript:在我的帖子中添加链接?

cmp*_*ken 5

编辑2经过更多的研究,这实际上是由OP提到的浏览器的XSS检测引起的(与任何特定于WordPress的功能相反).只有当您单击PreviewWordPress中的按钮,并且仅在该初始页面加载时才会出现此问题.显然,WordPress会在请求标头中发送一些HTML,并在浏览器中触发XSS功能.如果加载预览,然后刷新页面,XSS问题就会消失,javascript:链接会在保存时显示.在查看实际站点时,在发布页面后,永远不会遇到此XSS问题.

编辑经过一些更深入的研究(与@gnarf合作),事实证明实际问题归结为WordPress javascript:在其预览功能中处理链接的方式.似乎WordPress有一些自定义的Javascript运行并将所有javascript:链接转换为javascript:void(0)链接(删除任何自定义代码),但前提是您正在预览页面.发布页面后,javascript:链接将正确呈现.


原帖(介绍如何javascript:在将帖子保存为非管理员用户时停止WordPress删除链接,这是我原先认为可能存在的问题)

看起来WordPress剥离了content_save_pre过滤器中的HTML .具体来说,它调用以下wp_kses_bad_protocol方法wp-includes\kses.php:

/**
 * 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;
}
Run Code Online (Sandbox Code Playgroud)

$allowed_protocols通过该wp_allowed_protocols()方法检索该参数,该方法将kses_allowed_protocols过滤器应用于协议列表.

有了这些信息,您应该能够与kses_allowed_protocols过滤器绑定以添加javascript为有效信息(请注意,这当然会打开安全问题):

add_filter( 'kses_allowed_protocols', function ($protocols) {
   $protocols[] = 'javascript';
   return $protocols;
});
Run Code Online (Sandbox Code Playgroud)

增强此方法安全性的一种方法是为特定用户或特定角色添加检查(默认情况下,看起来此过滤器实际上不在管理帐户上运行,因此您可以使用javascript:指向您心脏内容的链接作为admin)在允许javascript协议之前.