2012-11-13 119 views
2

我網站上的用戶可以點擊按鈕。如果他們這樣做,他們將獲得積分獎勵。防止用戶濫用javascript代碼

這個按鈕,當點擊時,正在向服務器發出AJAX調用以給予獎勵(存儲在數據庫中)。

該按鈕是一個「發推」按鈕,所以我想確保他們真的在做推特的事情。

我的問題是我想確保按鈕確實被點擊。由於JavaScript代碼完全可以被用戶看到,所以我想他們很容易在沒有點擊的情況下進行AJAX調用。

那麼,我能做什麼?混淆是我唯一的選擇,還是我可以加密某些東西,或使用標記或其他東西?

如果可能有所幫助,用戶登錄並且頁面與PHP一起提供。

感謝

+1

可以多次點擊按鈕來總結獎勵嗎?奇怪的概念......否則問題在哪裏?沒有人關心按鈕是否被鼠標指針或腳本按下。 – arkascha

+1

確保點只能授予一次(在一定的時間段內) - 只要按鈕是獲取積分的最簡單方法,就沒有動力以編程方式進行。 – Blazemonger

+0

我不在乎按鈕是否按下多次。很容易禁用它並檢查服務器端。但是,我想確保按鈕已被點擊,並且它不是一個腳本來打電話。 – Jean

回答

3

基本上你是出好運 - 沒有萬無一失的解決方案可以防止某人編寫一個簡單的腳本來下載頁面,解析它以獲取任何安全令牌,然後調用AJAX請求。

您只能通過添加一些由服務器呈現並通過AJAX調用返回的附加數據來使作業稍微難一些。

您可能會考慮在按鈕中添加一個CAPTCHA圖像 - 這會阻止漫遊器提交數據,但也會讓真實用戶的生活更難。

+0

好的,謝謝。驗證碼會對用戶造成嚴重的影響(要求他們發一條推文和一個...驗證碼,但不會這麼做),但我認爲你幾乎總結了它。 – Jean

+0

您可以允許用戶(通過IP或用戶名)在Y分鐘內製作X個請求,如果他們想要製作更多內容,則可以顯示驗證碼。 –

+0

是的,其他人認爲,但那不是重點,因爲我保留了數據庫中的獎勵記錄(並且只允許1,服務器端)。那部分是好的。 – Jean

1

您可能需要一個CSRF token附在您的請求,可以肯定的點擊已經從該頁面進行,並在當前會話中。

您可以實現一個即將到期的令牌 - 您在會話中設置一次,當用戶請求它時,它會失效並完成。

+0

我覺得用戶將能夠看到該令牌,不是嗎? – Jean

+0

是的,這基本上可以防止腳本自動泄漏。看看我的關於在你的'$ _SESSION'中創建一個到期的標記的編輯。 – moonwave99

+1

@ moonwave99這不會阻止用戶創建腳本來自動提交請求。 CSRF令牌阻止其他站點強制用戶進行操作。它不適用OP問題。 – HoLyVieR

1

您是否只允許在特定時間範圍內點擊一次按鈕?這可以在PHP中強制執行,並且非常安全。

即使您使用令牌或用戶可能會找到它並直接運行該腳本。需要進行某種服務器驗證,例如時間驗證,才能真正安全。

+0

這不會阻止腳本提交按鈕,否? – Jean

+0

那麼,如果腳本被調用,則檢查用戶上次按下按鈕時是否在特定時間範圍內,比如說一天。如果是這樣,那麼不要給他們按鈕通常給予他們的點。 –

0

1-看起來這些用戶是您網站的註冊會員。如果是這種情況,只需在數據庫中創建一個表,其中包含id,用戶名和其他關係列。讓你的腳本request工作,如果他們以前沒有得分(通過檢查第一個,用戶登錄,然後檢查用戶對用戶分貝,如果他們存在的關係拒絕請求否則接受它,內表)。

2-如果他們不是註冊用戶,請使用Google驗證碼進行檢查。

+0

似乎用戶應該能夠多次獲得積分。其餘的很容易編寫腳本(除了驗證碼) –

+0

@Knaģis然後關係列將處理該問題。 –

+0

非常感謝Yousuf,但我的問題不是爲了防止多次提交,而是爲了防止提交腳本(而不是真正的用戶提交)。 – Jean

1

基本上,用戶甚至可以重現令牌,嚴格來說不是一個完美的保護。 代碼的混淆可能會有所幫助。 我認爲你想防止編程或多次投票.. 你可以記錄ip以防止多次投票&使用csrf令牌,但提供你的用戶登錄它可以推測他們是可信的,在操縱的情況下,你只需刪除他們的帳戶。

我認爲你應該嘗試使用captcha,並且確定用戶誰是投票,並限制他從多個投票服務器端。

但僞造點擊仍然可行。

+0

謝謝,我100%同意。 – Jean