2013-08-16 40 views
0

假設我解析了某個用戶提交的日誌文件,並將解析的數據存儲在MySQL數據庫中。MySQL如何正確處理包含代碼/跨站點腳本的行?

現在,如果用戶足夠的話,他可以提交一個包含類似於nickname=<script>alert(hello);<script>的行的日誌文件。解析器會抓取後面的所有內容,等於符號並執行INSERT INTO nicknames (name) VALUE ('<script>alert(hello);</script>')

我試了一下,發現mysqli_real_escape_string()正在阻止日誌文件中的一行(如nickname=' AND 1 = 2)通過轉義'來中斷查詢。 我認爲它也會處理<script>/</>和其他代碼/字符,但顯然我錯了。

在上述情況下,當用戶提交包含行nickname=<script>alert(hello);<script>的日誌文件時,nicknames.name列將保留值<script>alert(hello);<script>

後來從表中讀取這些值並顯示在網站上的<table>中的每行一個暱稱。當然它不會在這種情況下顯示「暱稱」;跨站點腳本正在執行。而不是包含暱稱的表格行,會彈出一個消息框,說'你好'。

是否有任何常見的方法來防止使用類似mysqli_real_escape_string()的函數進行跨站腳本編程?什麼是適當的解決方案這個問題,或者甚至可能是最好的?

Ofcourse我可以脫掉INSERT荷蘭國際集團入列前<>,但我寧願的方式,將剛剛即使在它<script>標籤顯示的暱稱,在表中。

問候

回答

2

可以使用htmlspecialchars所有的HTML標記語法轉換爲相應的實體。這將導致顯示文字值<script>alert('name');</script>而不是被解釋爲腳本塊

+0

正是我在找的東西,謝謝! – phew