2011-09-19 70 views
8

我的頁面上有一個用戶輸入其信用卡數據的表單。是否有可能在HTML中標記表單的動作是不變的,以防止惡意JavaScript改變表單的動作屬性?我可以想象一種XSS攻擊,它會更改表單URL以使用戶將他們的祕密數據發佈到攻擊者的網站。防止更改HTML表單動作

可能嗎?或者,網頁瀏覽器有不同的功能可以防止這類攻擊的發生?

+0

惡意JavaScript如何首先進入表單?付款表單是否允許顯示用戶提交的內容(XSS)?這將是一種不尋常的付款方式。 –

回答

5

這種攻擊是可能的,但是這是錯誤的方法,以防止反對。如果黑客可以更改表單的細節,他們可以通過AJAX GET輕鬆發送祕密數據,而無需提交表單。防止XSS攻擊的正確方法是確保對頁面上的所有不可信內容進行編碼,以便黑客無法首先執行自己的JavaScript。


關於編碼的更多信息...

StackOverflow上的示例代碼是一個很好的編碼示例。想象一下,如果每次有人發佈一些示例JavaScript,它實際上都會在瀏覽器中執行,那會是多麼的混亂。例如,

<script type="text/javascript">alert('foo');</script>

如果不是事實,SO編碼上面的代碼中,你剛纔看到一個警告框。這當然是一個相當無害的腳本 - 我可以編寫一些JavaScript來劫持你的會話cookie並將它發送到evil.com/hacked-sessions。然而幸運的是,SO並不認爲每個人都有好意,並且實際上對內容進行了編碼。如果你查看源代碼,例如,你會看到SO已編碼的我完全有效的HTML和JavaScript到這一點:

&lt;script type="text/javascript"&gt;alert('foo');&lt;/script&gt;

因此,而不是嵌入實際<>人物,我使用過,它們已被其HTML編碼等價物(&lt;&gt;)取代,這意味着我的代碼不再代表腳本標記。

無論如何,這是編碼背後的一般想法。有關的更多信息,您應該如何編碼,這取決於您使用的服務器端,但大多數所有Web框架都包含某種「開箱即用」的HTML編碼實用程序。您的責任是確保用戶提供的(或其他不可信的)內容在呈現之前編碼爲ALWAYS

+1

「編碼」是什麼意思?聽起來不錯,但我不確定這會涉及哪些技術。 –

+0

我知道阻止XSS攻擊的最好方法就是對所有內容進行編碼。但很難,你可以永遠忘記一個領域。由於相同的原產地策略,使用AJAX發送祕密數據並不那麼容易。我仍然可以看到具有這種功能的一些優點。 –

+0

@Michal - 將數據發送到跨源服務器非常簡單。您只需在其他服務器上插入一個腳本標記,該標記指向腳本src = xxx「,並將數據作爲查詢參數添加到腳本標記URL。這就是JSONP的工作方式,儘管JSONP在此僅用於發送數據到其他服務器 – jfriend00

1

沒有什麼可以阻止它。

我會建議做的唯一的事情是有一些服務器端驗證從用戶表單到服務器的任何信息。

俗話說:永遠不要相信用戶

+0

我認爲這個問題更多的是關於保護用戶。 –

+0

保護用戶?從何而來? – Neal

+0

將他們的信息提交給攻擊者網站。 –