我見過很多網站(包括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更新數據庫。
身份驗證?如果用戶沒有發表評論#250,他們就不應該在服務器端訪問來修改它。 – ceejayoz
您無法阻止某人使用客戶端工具來篡改THEIR計算機上THEIR瀏覽器中存儲的數據。這是Wild Wild Web - 永遠不要相信任何來自客戶端的東西。如果你不希望評論#250被提高,那麼如果用戶不在評論#250應該被提升的頁面上,則不要允許提高評論。 –
您的選擇是爲註釋密鑰使用GUID或其他不可增量的數據類型,或對提交的值執行安全檢查,這對匿名用戶可能不可行。 – Grax