2010-01-27 53 views
7

我對這個網站上的評論(類似的東西)做了一個投票,而且我對可能的http請求濫用情況略有擔心。你會明白我的意思後,我告訴你有問題的代碼:如何讓我的代碼更加安全

$.ajax({ 
    type: 'POST', 
    url: 'http://localhost/comments/vote_down/' + post_id 
}); 

現在,它仍然在本地主機,但它會得到網站最終。如果有人只是做了某種腳本will run n times此網址http://localhost/comments/vote_down/post_id

甚至沒有用戶身份驗證是非常有用的,你只需調整你的惡意腳本進行身份驗證,你可以再次做到這一點。我如何使這個請求更安全,我該怎麼辦?謝謝

編輯

我看到一些答案,而我一直在尋找迄今的。

也許我期待太多了,有沒有辦法可以直接拒絕這個請求給任何人,除非有人嘗試這樣做,否則有人從localhost(或website.com)重定向。

也許某種頭認證?我不是那麼認爲這就是我問的主要原因。

編輯

還什麼我不期而遇發現約一分鐘左右前,我在瀏覽低谷幾個類似的問題,我的螢火蟲是,我增加了一個問題,在您的收藏..看到控制檯響應後200 OK然後,我試了10次,只是爲了看看我什麼時候會被拒絕再次做同樣的事情。最終我感到無聊..所以,如果StackOverflow沒有解決..我在做什麼:=)

+1

你不需要拒絕請求。您只需要執行有關投票的業務邏輯。 – 2010-01-28 00:13:08

回答

6

至少,你可以確保每個用戶只能投一次。

  • 如果用戶沒有登錄,請不要投票。
  • 如果用戶已經登錄,每個評論限制投票爲一票(他們是否可以改變投票從上到下取決於你)
  • 如果你想讓未註冊的用戶投票, cookies和ip地址以及useragent檢查。 (遠離防彈,但會保留一些鬧事者在海灣)

附加選項:

  • 實現Captcha

在回答您的編輯:

如果你是談論檢查一個有效的推薦頁面,你是運氣不好。這非常容易被欺騙。您可以實施令牌檢查,在該檢查中生成一個有效時間爲X秒的散列,並拒絕包含無效或過期散列的所有請求。這不會阻止人們多次投票。

在回答你的第二個編輯:

的200狀態碼僅意味着該HTTP請求是成功的,哪些應用程序邏輯決定與要求做是完全不同的問題。你可以拒絕投票並返回一個200,就像你可以返回一個403(儘管這樣可能會更合適)。

+0

@Whover downvoted:發佈一個理由會很好:) – 2010-01-27 23:42:16

+0

但是,每次我做了我在這裏獲得成功,它是「{」成功「:真,」NewScore「:2,」消息「:空,」LastVoteTypeId「: null}「 – 2010-01-27 23:44:28

+0

這並不意味着得分發生了變化,成功的upvote返回: {」Success「:true,」NewScore「:2,」Message「:」「,」LastVoteTypeId「:2} Downvote: { 「成功」:真 「NewScore」:0, 「消息」: 「」, 「LastVoteTypeId」:3} 什麼也沒有發生: { 「成功」:真 「NewScore」:1,」消息「:null,」LastVoteTypeId「:null} – 2010-01-27 23:47:53

0

我認爲您需要跟蹤哪些(經過身份驗證的)用戶對哪些物品進行投票,並允許每個用戶只對每個物品進行一次投票。

0

讓用戶登錄並檢查他們是否已投票上/下,然後纔會要求投票表包含與用戶的鏈接,希望通過ID。

希望這有助於

3

你將不得不做的比存儲票理貨後ID的更多。您將不得不爲每個投票存儲記錄。

一旦你的數據庫模式設置爲,您就可以開始與每票附加信息相關聯 - 一個IP地址,用戶ID等

大多數地方只允許通過認證的用戶投票,並只允許一個用戶爲任何給定的帖子ID投票一次。 Stackoverflow超越了這一點,並允許用戶取消他們的選票並重新進行設置。

如果需要用戶進行身份驗證,他們可以投票之前是不能接受的,那麼你可以通過IP地址去,然後油門的票數,以便能夠從該IP在某個時間間隔投。例如,一旦XXX.XXX.XXX.XXX投了一票,它就不能再投票15分鐘。這不會破壞代理背後的人們的互聯網,但會減少可以完成的遊戲數量。

你可以走得更遠,嘗試探測某人正在遊戲系統,然後將其列入黑名單一段時間。

+0

- Stackoverfl ow超越了這一點,並允許用戶取消他們的選票並重新進行表決。我喜歡這個..我也試圖做到這一點 – 2010-01-27 23:30:46

+1

我可以推薦反對IP地址限制,因爲你會阻止大量的合法用戶。大型公司,辦公園區和摩天大樓通常將NAT轉換爲一個IP地址,事實上,一些國家的ISP通過代理服務器路由所有流量,代理服務器用代理IP代替IP。 雖然同意存儲對用戶的投票,但似乎解決這個問題的唯一方法是通過要求經過身份驗證的用戶。 – realworldcoder 2010-01-28 00:57:21

0

您可以使用CAPTCHA(我推薦reCAPTCHA,因爲它有助於同時數字化印刷作品)至少可以消除基於機器人的投票。爲防止多人投票,請考慮基於半唯一標識符進行計數,例如IP地址加瀏覽器的用戶代理字符串等。或根據用戶的帳戶驗證投票(顯然,在用戶註冊頁面上輸入驗證碼)。

1

您必須通過令牌認證。

潛在的,我可以只打印<img src="http://localhost/comments/vote_down/1">,並開始從鑄造用戶誰正在訪問我的網站投票。

你必須做什麼是一個服務器端驗證,讓我們說你將針對MD5哈希(md5(1) = c4ca4238a0b923820dcc509a6f75849b

http://localhost/comments/vote_down/1?hash=c4ca4238a0b923820dcc509a6f75849b 

驗證現在你的服務器上,你必須散列POST_ID和檢查哈希參數匹配,如果是,則允許投票。

但我仍然只是不停地從用戶發送垃圾郵件的投票不通過<img src="http://localhost/comments/vote_down/1?hash=c4ca4238a0b923820dcc509a6f75849b">

知道你必須做的是哈希兩個POST_ID和USER_ID(從Session),這樣一個散列從一個用戶的好評和其他人一樣。

User: 1 
Post_id: 1 
md5(11) = 6512bd43d9caa6e02c990b0a82652dca 

User: 2 
Post_id: 1 
md5(12) = c20ad4d76fe97759aa27a0c99bff6710 

很明顯,你應該使用哈希函數,但即使沒有它,你的應用程序也會非常安全。

+0

這樣一個好主意! :D – 2010-01-27 23:54:08

+0

我沒有看到這只是將用戶ID與投票記錄相關聯而獲得的結果。沒有額外的功能似乎是額外的複雜性。 – 2010-01-28 00:06:22

+1

這仍然允許單個用戶多次提出有效的請求。如果您使每個頁面負載的哈希值都是唯一的,並且在投票投票後過期哈希值,則會進行設置。 – sfrench 2010-01-28 00:07:37

1

我希望這有助於解答您的問題。看看這個網站:https://panopticlick.eff.org/。基本上,它所做的是嘗試根據您的各種系統設置,安裝的字體,瀏覽器功能,時區等來識別您。我剛剛將它發送到我的辦公室,到目前爲止我們都是獨一無二的。

現在這種方法並不完全安全,因爲您可以通過簡單地更改每次請求發送到服務器的數據來僞造所有這些信息,但是您必須知道您的網站使用這種技術才能一級攻擊(通過默默無聞的安全)。

我想我會傾向於採取多層次的方法來解決這個問題。因爲沒有任何方法是完全安全的,所有你可以做的就是把它們堆疊起來。

  • 不要讓市民投票,除非他們已經啓用Cookie
  • 基於安裝的字體(哈希他們的系統設置的哈希值在
  • 檔案用戶未登錄用戶誰實施CAPTCHA,瀏覽器功能,時區等)
  • 有一個登錄系統,這樣用戶就可以登錄到投票

現在,當有人票,您存儲的用戶ID(如果他們已經登錄),他們的系統哈希和其合作對他們的投票okie。這將防止登錄用戶進行投票,註銷和匿名投票 - 因爲他們的系統哈希和cookie(如果他們沒有打擾清除它)已經被綁定到投票。

你可以做的其他事情是做一個tripwire來檢測某個特定帖子上的投票是否在任何特定方向受到敲擊。如果它受到敲擊(例如,10分鐘內每分鐘20張投票,並且很大比例的投票都在同一個方向),請嘗試通過查看IP地址,系統散列等來分析upvotes。基於任意百分比的可能的惡意命中,你可以鎖定投票15分鐘。

這些方法都不是完全安全的,爲了簡潔起見,我省略了一些您可以輕鬆擴展此方法的方法。但我認爲多層次的方法是關鍵。當然,有一天,一個真正堅定的用戶不會介意整天解決驗證碼問題,這可能會找到一種方法來操縱系統,但只要你有非常好的日誌,你就可以描述這個攻擊並對其進行響應。

希望這有助於

乾杯 伊恩