绕过博客园对 <script> 的屏蔽

Conmajia
January 19, 2019


document.title = "[我是 js 生成的!] " + document.title

警告 这是试验性的尝试,不要用它做多余的事,小心玩脱了。

这篇文章的标题其实是有点问题的,会让人觉得我在搞破坏,找漏洞。NONONO,这是误会。

实际上,这种担心是不存在的。博客园本身并没有屏蔽 javascript 脚本,甚至还在后台主动开放了 HTML 权限,作为博客网站而言,是比较良心的。现在改用了 Markdown 编辑器,再加上支持文章正文内插入 HTML,整个博客的可玩性更高了。

毕竟它压根儿就没有扩展功能的插件和可编辑的主题,再不开放权限还玩您 个蛋呢?

只是总有人不小心或者很小心地搞出一些事来,为了网站安全,不得不屏蔽掉文章里的 <script> 标签。

当然,这功能早在 十几年前就屏蔽了,所以也不关我们鸟事儿

所以现在你如果在文章里写上 js,它没法运行。如果做试验,你写:

<!-- 前面的正文 -->

<script type="text/javascript">
    document.title = Math.random()
</script>

<!-- 后面的正文 -->

然后发文章发表出来,你会发现这段压根儿就不显示、不执行,烟儿似的就消失了,屁反应没有。

那怎么办啊,就没招改改默认主题了吗?好些人说,

默认主题也挺好的啊,还有那么多五颜六色的可以选呢。

您是认真的吗?啊?默认的那些主题实在是太难看了啊,难道这就是传说中的程序员的审美观么?9021 年了,醒醒,大清已经亡了!村里通网多少年了,Web 都已经 4.0,5.0,6.0 了,老铁!

好看吗?那您还挺淳朴的呢 :)

如果某天你意识到了这一点,精通增删改查的你也许会想要给自己的博客整个容?加点料?删点自带的垃圾?在读者打开你每篇文章时都跳出点不同的东西?

你知道我在说什么,毕竟你那么聪明。

—Conmajia

都已经开放 HTML 了,你当然可以用各种姿势咯美化界面咯,我这个博客就有很多东西是代码生成的。还有一个好处是增强了文章的互动性,提高读者参与度。比如你要讲随机数,编了无数代码,写得是天花乱坠,读者看得是晕头转向:

Math.random()

吧啦吧啦逼逼半天,能有我一个按钮的效果好?

所以现在我来说说怎么运行文章正文里的 js 代码。你知道的,js 有一个 eval 函数专门 evaluate 字符串形式的 js 语句。那么,嘻嘻,look at 管理→设置自定义 HTML 的地方:


非常幸运,eval 函数可以执行,这就简单至极了。既然正文里的 <script> 屏蔽了,改从外围执行代码就好啦。在正文里用一个标签 <run> 包住要执行的代码,直接 eval

<!-- 页面底部 HTML 设置 -->
<script>
$(function(){
    $('run').each(function(){eval($(this).text())});
});
</script>

这样,页面载入完后,就会依次执行正文里所有 <run> 标签内的代码了。把一开始那个例子改改,文章里写上:

<!-- 前面的正文 -->

<run>
    document.title = Math.random()
</run>

<!-- 后面的正文 -->

发表文章就能看到效果了(↑↑ 你再看看本文的标题栏?):

Safari,macOS 10.14

这不就绕过屏蔽了?美观一点,可以把所有 <run> 都隐藏起来:

/* CSS 设置 */
run {
    display: none;
}

需要说明的是,这并不是 bug,最多算留出了非常大的自由度。至于怎么使用,还是得看个人素质了。

我强烈怀疑有些重要的语句是无法执行的,不过我没有试过,我也不知道事实如何。

The End. \(\Box\)

猜你喜欢

转载自www.cnblogs.com/conmajia/p/bypass-script-blocking.html