Conmajia

Stop stealing sheep!

导航

< 20253 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

🕵️ 如何绕过 BKY 对 script 的屏蔽

Conmajia
January 20, 2019
⚠️ 由于安全设置本文互动功能已禁用

警告


这是试验警告个屁不要多多尝试用它做多余的事

果不其然这篇文章立刻被移出主页了我就说嘛BKY 哪儿会那么包容和坦然呢

原文

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

标题其实是有点问题的会让人觉得我在搞破坏找漏洞NONONO这是误会最多就是想拿 JS 改改默认的主题什么的实际上这种担心是不存在的 BKY 本身并没有屏蔽 JS 脚本甚至在后台主动开放了 HTML 权限以一个 BK 网站来说比较良心了加上现在改成 Markdown 编辑器还支持文章正文内插入 HTML整个 BK 的可玩性更高了

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

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

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

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

前面的正文
<script type="text/javascript">
    document.title = Math.random()
</script>
后面的正文

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

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

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

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

好看吗那您还挺淳朴的呢

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

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

—Conmajia

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

Math.random()

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

$('#random-tag').text(Math.random());

或者用较小的篇幅展示更多内容比如点下面的按钮

走进地铁的一瞬间大家感受到了前所未有的尴尬有人说这是程序员下班了……

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


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

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

这样页面载入完后就会依次执行正文里所有 <run> 标签内的代码了美观一点可以把所有 <run> 都隐藏起来

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

一开始那个例子改改文章里写上

前面的正文
<run>
    document.title = Math.random()
</run>
后面的正文

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

SafarimacOS 10.14

这不就绕过屏蔽了但是我给的例子里只简单地使用了 eval它有时候是不灵光的因为 Markdown 编辑器会把代码里的 $*_ 这些特殊符号识别成格式开关然后把代码渲染得面目全非根本没法用所以你需要想办法阻止编辑器解析你的代码来看个稍微复杂点的例子

<run>
    $('html').attr('lang', 'zh-CN');
    $('title').text(Math.random() * 100 * 99);
</run>

只有两句话的代码被 Markdown 编辑器解析成了一大堆 HTML 标签

<run><br>
  <span class="MathJax_Preview" style="color: inherit; display: none;"></span>
<span class="MathJax" id="MathJax-Element-2-Frame" tabindex="0" style="position: relative;" data-mathml="
<math xmlns=&quot;http://www.w3.org/1998/Math/MathML&quot;><msup><mo stretchy=&quot;false&quot;>(</mo>
<mo>&amp;#x2032;</mo></msup><mi>h</mi><mi>t</mi><mi>m</mi><msup><mi>l</mi><mo>&amp;#x2032;</mo>
</msup><mo stretchy=&quot;false&quot;>)</mo><mo>.</mo><mi>a</mi><mi>t</mi><mi>t</mi><mi>r</mi><msup>
<mo stretchy=&quot;false&quot;>(</mo><mo>&amp;#x2032;</mo></msup><mi>l</mi><mi>a</mi><mi>n</mi><msup>
<mi>g</mi><mo>&amp;#x2032;</mo></msup><msup><mo>,</mo><mo>&amp;#x2032;</mo></msup><mi>z</mi>
<mi>h</mi><mo>&amp;#x2212;</mo><mi>C</mi><msup><mi>N</mi><mo>&amp;#x2032;</mo></msup>
<mo stretchy=&quot;false&quot;>)</mo><mo>;</mo></math>" role="presentation">
<!-- (省略几十行) -->
  <script type="math/tex" id="MathJax-Element-2">('html').attr('lang', 'zh-CN'); 
</script>('title').text(Math.random() * 100 * 99);<br>
</run>

大部分是 MathJax 的数学公式解析因为它用 $ 作为行间公式的识别符而 jQuery 好死不死几乎全是 $……至于解决方案最简单的就是用jQuery代替$毕竟这俩是等价的或者你可以想点别的招有一种临时的解决方案是把代码放在 <run> 的某个属性里eval 改成从属性中读取比如

<run code="$('html').attr('lang', 'zh-CN');$('title').text(Math.random() * 100 * 99);"></run>
</code>
</pre>
<pre class="prettyprint lang-js linenums" lang="javascript">
$('run').each(function(){eval($(this).attr('code'))});

需要说明的是这篇文章写的东西并不是找出 BKY 的 bug最多算留出了非常大的自由度至于怎么使用还是得看个人素质了
我说明个几把

The End.

posted on2019-01-21   Conmajia  阅读(1364)  评论(1编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示