Conmajia
January 20, 2019javascript
原文
document.title = "[我是 JS 生成的!] " + document.title
html
Conmajia
January 20, 2019javascript
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="http://www.w3.org/1998/Math/MathML"><msup><mo stretchy="false">(</mo> <mo>&#x2032;</mo></msup><mi>h</mi><mi>t</mi><mi>m</mi><msup><mi>l</mi><mo>&#x2032;</mo> </msup><mo stretchy="false">)</mo><mo>.</mo><mi>a</mi><mi>t</mi><mi>t</mi><mi>r</mi><msup> <mo stretchy="false">(</mo><mo>&#x2032;</mo></msup><mi>l</mi><mi>a</mi><mi>n</mi><msup> <mi>g</mi><mo>&#x2032;</mo></msup><msup><mo>,</mo><mo>&#x2032;</mo></msup><mi>z</mi> <mi>h</mi><mo>&#x2212;</mo><mi>C</mi><msup><mi>N</mi><mo>&#x2032;</mo></msup> <mo stretchy="false">)</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