2013-08-27 69 views
0

我見過很多網站(包括SO和我的網站),用於將從數據庫中提取的數據的行ID存儲在HTML屬性中。我知道它可以由客戶端的用戶編輯,並可能發送到服務器端以根據更新數據。就拿這個查詢爲例,記住,它是upvoting評論:保持數據更新安全

SELECT comment_id, comment FROM comments

一個正常的人會做這種印刷:

<td data-commentid="<?php echo $row['comment_id']; ?>"><?php echo $row['comment']; ?></td>

和輸出:

<td data-commentid="1">+1, beat me to it.</td> 
<td data-commentid="2">Damn! What is this?</td> 
... 

當它顯示給一些黑客類型的用戶時,他會嘗試用類似的東西來編輯紀念日250,點擊則給予好評按鈕,我們無辜的腳本將接受它,並給予好評其它評論ID爲250,雖然它是用肉眼ID爲1或2

問題評論:

有什麼辦法擺脫這個?你可以打開你的控制檯並檢查SO,當你改變它的屬性引用來評論重要信息時,它似乎用更新屬性的ID更新數據庫。

+1

身份驗證?如果用戶沒有發表評論#250,他們就不應該在服務器端訪問來修改它。 – ceejayoz

+0

您無法阻止某人使用客戶端工具來篡改THEIR計算機上THEIR瀏覽器中存儲的數據。這是Wild Wild Web - 永遠不要相信任何來自客戶端的東西。如果你不希望評論#250被提高,那麼如果用戶不在評論#250應該被提升的頁面上,則不要允許提高評論。 –

+0

您的選擇是爲註釋密鑰使用GUID或其他不可增量的數據類型,或對提交的值執行安全檢查,這對匿名用戶可能不可行。 – Grax

回答

7

這實際上並不是一次攻擊。

執行「破解」和實際查看註釋#250並將其加上之間沒有區別。

如果用戶將ID或操作更改爲他不允許執行的操作,則必須使用服務器端授權/訪問控制來拒絕該請求。

總之:

永遠不要相信客戶提供的任何信息。

總是驗證輸入是否有意義,並允許用戶採取措施。

+0

永不相信的邏輯結果是**驗證所有內容**。 – tadman