最近我遇到了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, "<$1>"));
e.preventDefault();
return false;
}
});
我不明白爲什麼輸入值中的腳本是由瀏覽器執行的,以及它的執行時間?有沒有什麼文章可以解釋這個機制或者是相關的?我有沒有被忽視的東西? 如果有任何您認爲有用的物品,請告訴我。 謝謝。
感謝所有的答案和評論。也許我沒有說清楚。當我複製<script>alert("hi");</script>
並將其粘貼到輸入時,我測試了,瀏覽器確實提示了一個警告窗口並顯示「hi」。
我也只是使用$("input").val('<script>alert("hi");</script>')
,它不會提示警報窗口,但如果我觸發輸入的focus
和blur
事件,它也會提示警報窗口。
那麼,爲什麼代碼被執行?
你不能依靠瀏覽器來處理這個問題。簡單地禁用JavaScript已經可以繞過這個了。 (即使這不是一個選項,沒有瀏覽器編寫自定義HTTP調用並不難)。在輸出給用戶之前,您需要通過轉義來處理此服務器端。 – Ivar
「我不明白爲什麼輸入值中的腳本是由瀏覽器執行的」>>它不是,除非你告訴它。 @RichouHunter下面舉了一個例子,告訴它什麼時候:當你輸入這個值時,把它存儲在你的服務器上(例如作爲一個用戶名),然後在其他頁面上顯示這個值。 – TKoL
不知道我的理解。當您在輸入字段中輸入腳本時,該腳本不會執行,只有在它被回送給客戶端時才能執行。然而,那時輸入應該已經被驗證並且逃脫了服務器端。 – Clinton