2012-11-11 34 views
6

也許是一個noob問題,但我真的很困惑。
我正在嘗試進行在線測驗,用戶必須在4個可能的答案中進行選擇。但是我被困住了,好吧,因爲1個問題真的困擾着我。所以:

我有一個JavaScript函數,當用戶點擊錯誤的答案時,它會改變按鈕的背景顏色並禁用它。正確的答案按鈕(提交)要求不存在的功能,只是爲了迷惑人們,如果他們決定快速查看源代碼。一切都很順利,但我開始思考。如果用戶決定深入瞭解我的源代碼,該怎麼辦?他將能夠看到我的JavaScript函數,而且,他可以在沒有真正玩的情況下找出正確的答案。

有沒有什麼辦法可以隱藏源代碼(據我瞭解,這是不可能的JavaScript),但也許我可以使用別的東西?其他開發人員在這些情況下使用什麼?有什麼建議麼? :)用於在線測驗的JavaScript?

+4

「一切都很順利,但後來我開始思考」 - 大錯誤 –

+0

這就是網絡的本質,你可以混淆代碼(不推薦)或縮小代碼 – elclanrs

+6

如果你想保留人們看不到正確的答案,他們不需要成爲嵌入式源代碼的一部分,在這種情況下,所有的驗證和檢查都需要通過AJAX回調(或者同樣「安全」的方式異步處理服務器端) – zzzzBov

回答

6

如果您想要非常安全,您必須在服務器端(例如PHP)執行此操作。你可能做什麼來讓作弊者變得更加困難的是通過諸如this one之類的各種js混淆器混淆你的javascript代碼,這些混淆不會帶來完全的安全性。

+0

模糊處理(IMO)保護邏輯不僅僅是數據本身...從來沒有,它*是一個讓迂迴用戶克服的另一個障礙 - 從這個意義上說,它有助於OP。 +1 – Lix

+0

謝謝!我認爲這會做到。 – destripet

2

這是一個很好的問題和一個每個web開發人員應該問自己......

這是我們作爲Web開發人員每天面對的一大難題。我們的JavaScript可以查看,有時甚至可以編輯。信任沒有來自客戶!

我最常做的是

  1. 生成某種類型的唯一的哈希的服務器
  2. 嵌入此散列成HTML和JavaScript上。
  3. 將此散列和任何請求一起發送到服務器。
  4. 通過再次重新創建哈希並確保它與發送的哈希相匹配,驗證服務器上的哈希。

哈希可以是項目的id,會話id,一些鹽和任何其他可識別的數據的串聯,您可以重建以驗證請求。

+0

咦?當然,任何生成哈希的JavaScript都可以由客戶端操縱。無論從安全角度來看,從客戶端獲得的驗證散列都是無用的。 – Anko

+0

@aku - 這不是我的意思。哈希是在服務器上生成的,嵌入到JS中併發送回服務器進行驗證。我編輯了我的答案,將重點放在這個過程上。感謝您的反饋! – Lix

5

用戶可以作弊的原因是因爲答案在JavaScript代碼中。

解決方案:不要把答案放在JavaScript代碼。請將其保留在服務器上。

事情是這樣的:每當用戶他們的回答改變的問題...

  1. 的JavaScript發送答案到服務器。
  2. 服務器以YES或NO回覆。
  3. JavaScript顯示回覆給用戶。

用戶從來沒有看到答案,只是它是真是假。

TL;博士瞭解AJAX。

0

要完成其他的答案,提供如何學習如何建立一個服務器可能會花費你幾天,我將快捷方式,你有5分鐘的指導來設置一個簡單的node.js服務器,將隱藏你的答案。

安裝node.js.

創建一個名爲server.js與下面的內容的文件。

var express = require("express"), 
    app = express(); 
app.get("first_answer",function(req,res){ 
    res.send("b"); 
}); 
app.listen(8080); 

打開端子,類型

npm install express 
cd path_to_the_folder_you_placed_the_file 
node server.js 

這將安裝express.js模塊和運行服務器。

現在,您的網站,使用jQuery,只需從服務器請求的答案。例如使用jQuery:

var user_answer = ... 
$.get("http://localhost:8080/first_answer",function(answer){ 
    if (answer == user_answer) 
     alert("you got it right!"); 
}); 

對於更爲複雜的例子,最好使用服務器的,只是閱讀express.js文檔。 (;