2017-10-18 93 views
2

最近我遇到了XSS問題。我搜索並閱讀了很多相關的問題和文章。我注意到所有的答案都集中在如何防止不可信數據傳遞給服務器。而在前端,轉義特殊代碼似乎是防止腳本執行的唯一方法。如何防止粘貼到輸入的腳本注入

但是,如果用戶只是向輸入輸入一段代碼(如<script>alert("hi");</script>),該代碼何時執行?有沒有辦法阻止它?

我聽過​​keyup事件,但這隻能防止正常輸入,當用戶直接複製並粘貼到輸入時,它沒有任何努力,它會在用戶輸入一段腳本時顯示我的警告消息,但腳本仍然執行!

$("input").on("keyup", function (e) { 
    var value = $(this).val() || ""; 
    var regex = /<(\/?\w+[^\n>]*\/?)>/ig; 
    if(regex.test(value)){ 
     layer.msg("Invalid characters!"); 
     $(this).val(value.replace(regex, "&lt;$1&gt;")); 
     e.preventDefault(); 
     return false; 
    } 
}); 

我不明白爲什麼輸入值中的腳本是由瀏覽器執行的,以及它的執行時間?有沒有什麼文章可以解釋這個機制或者是相關的?我有沒有被忽視的東西? 如果有任何您認爲有用的物品,請告訴我。 謝謝。

感謝所有的答案和評論。也許我沒有說清楚。當我複製<script>alert("hi");</script>並將其粘貼到輸入時,我測試了,瀏覽器確實提示了一個警告窗口並顯示「hi」。

我也只是使用$("input").val('<script>alert("hi");</script>'),它不會提示警報窗口,但如果我觸發輸入的focusblur事件,它也會提示警報窗口。

那麼,爲什麼代碼被執行?

+3

你不能依靠瀏覽器來處理這個問題。簡單地禁用JavaScript已經可以繞過這個了。 (即使這不是一個選項,沒有瀏覽器編寫自定義HTTP調用並不難)。在輸出給用戶之前,您需要通過轉義來處理此服務器端。 – Ivar

+0

「我不明白爲什麼輸入值中的腳本是由瀏覽器執行的」>>它不是,除非你告訴它。 @RichouHunter下面舉了一個例子,告訴它什麼時候:當你輸入這個值時,把它存儲在你的服務器上(例如作爲一個用戶名),然後在其他頁面上顯示這個值。 – TKoL

+0

不知道我的理解。當您在輸入字段中輸入腳本時,該腳本不會執行,只有在它被回送給客戶端時才能執行。然而,那時輸入應該已經被驗證並且逃脫了服務器端。 – Clinton

回答

1

假定我的用戶名是<script>alert('You got pranked!')</script>,並且您的應用程序未受XSS保護。

註冊時,應用程序將保存我的用戶名,因此沒有任何問題。

但是,當我去我的個人資料頁(或將顯示我的名字的任何頁面),由服務器呈現的HTML將看起來像

<h1>Profile page</h1> 
<p>User name: <script>alert('You got pranked!')</script></p> 

客戶端瀏覽器會看到一個<script>標籤和將執行裏面的內容。

最容易解決的辦法是轉義任何HTML特殊字符。無論你有沒有技術堆棧,都有很多工具可以爲你做到。

但是,所有這些工具的工作方式是,當顯示我的用戶名時,它將顯示爲&lt;script&gt;alert('You got pranked!')&lt;/script&gt;,從而阻止瀏覽器在顯示我的用戶名時看到<script>標記。

+0

謝謝!我明白你的意思。也許我沒有說清楚。我測試了當我複製''並粘貼到輸入中時,瀏覽器確實會提示一個警報窗口。而我的問題是我可以防止這種情況發生嗎? – Moicen

+0

@Micicen這取決於你在服務器端使用什麼技術。 (PHP?ASP.NET?JSP?NodeJS?)請[編輯](https://stackoverflow.com/posts/46805128/edit)您的問題並添加此信息。很有可能已經有一篇關於Stack Overflow的文章描述了這一點。 – Ivar

+0

@Ivar謝謝,我已經更新了這個問題。這裏我使用的是NodeJS,但在這種情況下瀏覽器和服務器之間沒有通信。 – Moicen

2

值或表單字段的內容通過瀏覽器執行,也不是解析爲HTML 除非你把他們當作HTML

您可以將任何您喜歡的東西粘貼到輸入字段中,然後將其提交給服務器。將輸入<script>alert("hi");</script>粘貼到輸入中是可以的,並且在將表單數據提交給服務器時,該文本將用作輸入字段的值。

XSS的問題是當一個站點使用先前提交的數據和鞘它變成一個響應的HTML

處理所述輸入字段作爲HTML 的例子(如在RichouHunter's answer所述)而不要去服務器:

// Assuming jQuery: 
$('div').html($('input').val());