如何繞過博客園對 script 的屏蔽

Conmajia
January 20, 2019javascript

警告


這是試驗,警告個屁,請不要多多嘗試用它作多餘的事。css

果不其然,這篇文章馬上被移出主頁了,我就說嘛,BKY 哪兒會那麼包容和坦然呢?

原文


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

標題實際上是有點問題的,會讓人以爲我在搞破壞,找漏洞。NONONO,這是誤會,最多就是想拿 JS 改改默認的主題什麼的。實際上,這種擔憂是不存在的。 BKY 自己並無屏蔽 JS 腳本,甚至在後臺主動開放了 HTML 權限,以一個 BK 網站來講,比較良心了。加上如今改爲 Markdown 編輯器,還支持文章正文內插入 HTML,整個 BK 的可玩性更高了。java

畢竟它壓根兒就沒有擴展功能的插件和可編輯的主題,再不開放權限還玩您 呢?

只是總有人不當心搞出一些事來,爲了網站安全,不得不屏蔽掉文章裏的 <script> 標籤。程序員

固然,這功能早在 十幾年前就屏蔽了,因此也不關咱們鳥事兒

因此如今你若是在文章裏寫上 JS,它無法運行。若是作試驗,你寫:安全

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

而後把文章發表出來,你會發現這段壓根兒就不顯示、不執行,煙兒似的就消失了,屁反應沒有。markdown

那怎麼辦啊,就沒招改改默認主題了嗎?好些人說,dom

默認主題也挺好的啊,還有那麼多五光十色的能夠選呢。編輯器

您是認真的嗎?啊?默認的那些主題實在是太難看了啊,難道這就是傳說中的程序員的審美觀麼?9021 年了,醒醒,大清已經亡了!村裏通網多少年了,Web 都已經 4.0,5.0,6.0 了,老鐵!函數

好看嗎?那您還挺淳樸的呢:)

若是某天你意識到了這一點,精通增刪改查的你也許會想要給本身的 BK 整個容?加點料?刪點自帶的垃圾?在讀者打開你每篇文章時都跳出點不一樣的東西?

你知道我在說什麼,畢竟你那麼聰明。

—Conmajia

都已經開放 HTML 了,你固然能夠用各類姿式咯美化界面咯,我這個 BK 就有不少東西是代碼生成的。還有一個好處是加強了文章的互動性,提升讀者參與度。好比你要講隨機數,編了無數代碼,做者寫得天花亂墜,讀者看得暈頭轉向:

jsMath.random()

吧啦吧啦半天,能有我一個按鈕的效果好?

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

或者用較小的篇幅展現更多內容?好比點下面的按鈕:

走進地鐵的一瞬間,你們感覺到了史無前例的尷尬,有人說這是程序員下班了……

因此如今我來講說怎麼運行文章正文裏的 JS 代碼。你知道的,JS 有一個 eval 函數專門 evaluate 字符串形式的代碼。那麼,look at 管理→設置自定義 HTML 的地方:


很是幸運,eval 函數能夠執行,這就簡單至極了。既然正文裏的 <script> 屏蔽了,改從外圍執行代碼就好啦。舉個例子,在正文裏用一個標籤 <run> 包住要執行的代碼,直接 eval

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

這樣,頁面載入完後,就會依次執行正文裏全部 <run> 標籤內的代碼了。美觀一點,能夠把全部 <run> 都隱藏起來:

css/* CSS 設置 */
run {
    display: none;
}

一開始那個例子改改,文章裏寫上:

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

發表文章就能看到效果了(↑↑ 你再看看本文的標題欄?):

Safari,macOS 10.14

這不就繞過屏蔽了?可是吧,我給的例子裏只簡單地使用了 eval它有時候是不靈光的。由於 Markdown 編輯器會把代碼裏的 $*_ 這些特殊符號識別成格式開關,而後把代碼渲染得面目全非,根本無法用。因此你須要想辦法阻止編輯器解析你的代碼!來看個稍微複雜點的例子

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

只有兩句話的代碼,被 Markdown 編輯器解析成了一大堆 HTML 標籤:

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 好死不死幾乎全是 $……至於解決方案,你能夠在選項裏禁用數學公式,

或者換一個不支持 Markdown 的編輯器,

或者你能夠想點別的招。有一種臨時的解決方案是把代碼放在 <run> 的某個屬性裏,eval 改爲從屬性中讀取,好比:

html<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.

 

出處:https://www.cnblogs.com/conmajia/p/bypass-script-filtering.html

相關文章
相關標籤/搜索