2016-07-26 75 views
0

我有一個從數據庫中讀取數據然後顯示它的網頁,但是我剛發現一個數據可能包含HTML的問題。消毒HTML代碼

在我的數據庫,我有以下3項:

鮑勃

吉爾

<button onClick="alert('hi')">Click me!</button> 

現在,我有我的HTML頁面,獲取數據並顯示它,有一個click事件上每個條目,所以一個例子是:

<div onClick="DoSomething()"> 
    <a>Bob</a> 
</div> 

我的代碼是刪除e瞰字符,從而<成爲&lt;

直到我到了最後一個條目,我結束了工作得很好:

<div onClick="DoSomething()"> 
    <a>&lt;button onClick="alert('hi')"&gt;Click me too!&lt;/button&gt;</a> 
</div> 

它顯示爲預期的,所以我會看到:

<button onClick="alert('hi')">Click me too!</button> 

但它也正在採取,應該有一個點擊事件試圖顯示「嗨」。

有誰知道我可以安全地停止正在由名稱定義的onClick,但仍然有我的onClick事件在周圍的div。

我無法限制可以添加到數據庫的名稱。

+0

如果你不允許這樣的事情被清除,你可能會打開你的應用程序到XSS攻擊。有人理論上可以注入代碼並運行它 – vsync

+0

包含html的壞名稱目前不存在,但可以。這顯示了一個極端的例子,但我沒有辦法限制可以輸入到數據庫中的名稱(這是一個傳統的桌面應用程序,15年以上 - 現在有一個Web界面)。所以是的,我需要消毒,但我不知道如何做到這一點,但仍保留用戶輸入的名稱。我想通過改變轉義字符這將做到這一點。 – sbarnby71

+0

@ sbarnby71如果您使用的是PHP,可以使用striptags:http://php.net/manual/pt_BR/function.strip-tags.php。對於其他語言,邏輯是相同的。 – user3753202

回答

0

發生了什麼事情。當我創建持有該項目的名稱,我創建一個自定義屬性,它被稱爲DispName和它把項目的名稱,例如HTML元素:

<div onclick="DoSomething()" DispName="&lt;button onClick="alert('hi')"&gt;Click me too!&lt;/button&gt;"> 
    <div>&lt;button onClick="alert('hi')"&gt;Click me too!&lt;/button&gt;</div> 
<div> 

所以,當我的onclick事件被稱爲我會用.getAttribute(「DispName」)在被點擊的實體上,並假設我會得到值<按鈕onClick =「alert('hi')」> Click me too! < /按鈕>回來,但我回來的是<button onClick="alert('hi')">Click me too!</button>的unsanitized文本。

我認爲正在發生的事情是,只要我將我的html元素添加到DOM,屬性DispName的值是由DOM解開的。不在屬性中的清理過的腳本按照我的預期保留。

不確定是否有人可以證實這一點,但現在我知道爲什麼我會在嘗試使用DispName中的值時運行惡意腳本。