爲什麼我在文章裏寫了一行 HTML,結果它真的變成了控件?

可以參考我的上一篇文章上上篇文章

我隨手寫了一行這樣的內容:

結果它沒有像普通文字一樣顯示出來,而是直接變成了一個可以點擊的日期選擇器:

<input type="date">

這就有點好玩了。

明明我只是寫了一行代碼,爲什麼它會在文章裏“活過來”?

其實這背後不是玄學,而是一個很常見的網頁渲染現象。

一、文章頁面本質上也是網頁

我們平時在平臺上發文章,看起來是在寫“文本”,但從瀏覽器的角度看,最終展示出來的東西其實是一個網頁。

網頁的基礎語言就是 HTML。

比如:

瀏覽器看到這段代碼,就會把它渲染成一段普通文本。

而如果瀏覽器看到的是:

它就會理解爲:這裏需要顯示一個日期選擇控件。

所以最終效果就是:

<input type="date">

也就是說,問題的關鍵在於:平臺有沒有把你輸入的 HTML 當成普通文本處理。

二、爲什麼有的平臺會直接渲染 HTML?

正常來說,文章平臺爲了安全,通常會對用戶輸入的內容進行處理。

比如你寫:

平臺可以選擇把它當成普通文本顯示出來,也可以選擇交給瀏覽器直接渲染。

如果平臺沒有把這段 HTML 轉義掉,那麼瀏覽器就會真的執行它的顯示邏輯。

所謂“轉義”,簡單說就是把 HTML 的尖括號變成普通字符。

例如原本是:

轉義後大概會變成:

這樣瀏覽器就不會把它當成控件,而是會把它當成普通文字顯示。

三、一些比較有意思的 HTML 原生控件

經實際測試均可運行,大部分單擊或者雙擊白框即可

不是我雙擊騙取點贊啊,這代碼它真的本來就這樣,請蒼天,辨忠奸

下面這些都是瀏覽器自帶的 HTML 表單控件。如果平臺沒有過濾,它們可能會直接顯示出對應效果。

1. 日期選擇器

代碼是:

實際效果:

<input type="date">

2. 時間選擇器

代碼是:

實際效果:

<input type="time">

3. 顏色選擇器

代碼是:

實際效果:

<input type="color">

這個就比較有意思,點開之後可以直接選顏色。

4. 滑動條

代碼是:

實際效果:

<input type="range" min="0" max="100" value="50">

5. 勾選框

代碼是:

實際效果:

<input type="checkbox" checked>

如果寫多個,還可以假裝做一個調查問卷:

<input type="checkbox"> 我只是路過看看 <input type="checkbox"> 我開始好奇了 <input type="checkbox"> 我也想發一篇試試

6. 下拉菜單

代碼是:

實際效果:

<select> <option>普通文章</option> <option>網頁文章</option> <option>電子表單</option> </select>

7. 進度條

代碼是:

實際效果:

<progress value="66" max="100"></progress>

看起來很像任務進度,雖然它實際上什麼任務也沒有。

8. 儀表條

代碼是:

實際效果:

<meter value="0.7">70%</meter>

不同瀏覽器裏顯示效果可能不太一樣,有些會顯示成類似狀態條的東西。

四、這算漏洞嗎?

不一定。

如果只是 <input>selectdetailsprogress 這類普通 HTML 標籤被渲染出來,一般更像是平臺的富文本渲染策略比較寬鬆。

它不一定會造成安全問題,只是讓文章裏出現了一些原生網頁控件。

但如果平臺允許更危險的內容,比如:

或者允許事件屬性,例如:

那就不是單純整活了,而是可能涉及 XSS,也就是跨站腳本攻擊。

簡單說,XSS 就是攻擊者把惡意腳本塞進網頁裏,讓其他用戶打開頁面時自動執行。

所以,安全的平臺一般會過濾掉 <script>onerroronclickiframe、外鏈腳本等高風險內容。

五、爲什麼有些標籤能顯示,有些標籤不能?

因爲平臺通常會有一套過濾規則。

它可能允許一部分比較安全的標籤,例如:

但會過濾掉另一部分危險標籤或屬性,例如:

所以你可能會看到這種情況:

  • ** 日期選擇器可以顯示;

  • 滑動條可以顯示;

  • 顏色選擇器可以顯示;

  • 但是腳本不能執行;

  • 外部頁面不能嵌入;

  • 點擊事件也不能觸發。

這說明平臺並不是完全不處理 HTML,而是可能只過濾了其中一部分。

六、這種現象爲什麼有趣?

因爲它讓一篇普通文章突然有了一點“網頁交互感”。

比如下面這個小組合:

<details> <summary>點擊進行今日精神狀態測試</summary>

<p>請選擇今天的起牀時間:</p> <input type="time">

<p>請選擇今天的心情顏色:</p> <input type="color">

<p>調整今日摸魚程度:</p> <input type="range" min="0" max="100" value="80">

<p>確認選項:</p> <input type="checkbox"> 我今天非常清醒
<br> <input type="checkbox"> 我今天只是看起來清醒
<br> <input type="checkbox"> 我已經不想解釋了

</details>

它沒有真正提交數據,也沒有後臺邏輯,但視覺上已經很像一個小網頁了。

這也是它好玩的地方: 文章還是文章,但看起來已經偷偷長出了按鈕、滑塊、日期框和菜單。

七、最後提醒一下

這種玩法建議只試一些無害的 HTML 原生標籤。

比如:

不建議測試腳本、事件、外鏈嵌入之類的內容。

一方面可能觸發平臺審覈,另一方面也確實可能涉及安全問題。

簡單總結就是:

如果你寫的 HTML 被當成普通文字,它就是代碼。

如果它被瀏覽器識別並渲染出來,它就變成了網頁的一部分。

而我們看到的這個日期選擇器,本質上就是文章編輯器和瀏覽器渲染機制之間產生的一點小縫隙。

有點離譜,但確實挺好玩。

更多遊戲資訊請關註:電玩幫遊戲資訊專區

電玩幫圖文攻略 www.vgover.com