2016-03-21 8 views
0

私は、ランダムに生成された質問の間に正しい答えを見つけなければならないWebアプリケーションでAngularJSとNodeJSを使っています。 クライアントからの回答を "保護"する方法がわかりません。NodeJSでオブジェクトサーバー側を保護/格納する方法は?

質問/回答はそのようなオブジェクトで生成されます。この例では

var question = { 
    answer: 'A', 
    choices: ['A', 'B'] 
}; 

、ユーザーがBを選択しなければならないと正解はです。

私はそのような何かをしたいと思います:

  1. クライアントは、サーバが質問/回答をロードし、の選択肢を返すのみクライアントに新しい質問
  2. のためのサーバーを頼む
  3. クライアントはサーバーに応答を送信します
  4. サーバーは、クライアントから送信された回答をの回答と比較し、その結果をクライアントに返しますNG)

質問/回答はランダムに生成されているので、答えは私のようなものを考えていたステップ1

後にサーバで定義する必要があります:

var answer = 0; 

app.get('/generateQuestion', function (req, res) { 
    var question = getQuestion(); 
    answer = question.answer 
    res.send(question.choices); 
}); 

app.post('/answer', function (req, res) { 
    if (req.answer === answer) { 
     res.send('Correct'); 
    } else { 
     res.send('Wrong'); 
    } 
}); 

しかし、この保存された回答は、競合を引き起こすユーザー間で共有されます...

私は質問が尋ねられたときにクライアントに回答を送信しないようにしたいと思いますが、サーバー側に "保存"する方法はわかりません。

どうやって対応しますか?この質問/回答を少し安全にするにはどうすればいいですか?

+0

これは本当にあまりにも一般的な質問ですが、一般的に、あなたはそのユニークなIDと一緒にブラウザに可能な答えを送信したいですサーバーからの実際の回答を要求するために使用されます。これを行う通常の方法は、ブラウザからサーバーへのリクエスト(ページを更新する必要はありません)とデータベースの一部に[AJAX](https://en.wikipedia.org/wiki/Ajax_(プログラミング))を使用することです可能な回答、および一意のIDで索引付けされた実際の回答を保存することができます。 –

+0

@RobRaischありがとうRob。私はそれに言及しなかったが、質問/回答をデータベースに格納することはできない(もっと簡単になるだろう...)。私は第三者のAPIから無作為に生成します。彼らは一度しか使われないので、私はそれらを保存したくない。しかし、私はそれらを一時的にJSONファイルに保存し、 "クイズ"の後に削除する必要があります。 – Alex

答えて

1

私はコメントを追加できませんので、これを回答として投稿する必要がありますが、データベース内に自動的にデータを保存するexpress-sessionのようなものを使用して、一緒に設定してください。これは、質問/回答のペアを配列に格納し、配列に質問とそのインデックスをクライアントに送信することで行うことができます。次に、回答とインデックスを配列に送り、答えが正しいかどうかを調べることができます。

+0

答えアダムありがとう。私がRobへのコメントで述べたように、私はQAをデータベースに保存したくありません。一時的で常に変化しています。あなたはユーザー間の共有配列が良い考えだと思いますか?ユーザーが答えたら(または一定の時間が経過した後)、アレイからQAを削除できます。また、ユーザーごとの一時ファイルについても考えていました。あなたはそれについてどう思いますか? – Alex

+0

こんにちは、あなたは共有配列にそれらを格納することができますが、私はそれがベストプラクティスではないと思います。データベースに保存するのではなく、一時的なJSONファイルに保存し、クイズの後に削除することについて上記で示唆したことをお伝えしましたか? NoSQLデータベースはこの機能を正確に実行し、より標準的なアプライアンスになります。 express-sessionsはデータベース全体をコードからアクセス/保存しなくても、通常の変数のようにアクセスするだけです。 – Adam

1

ブラウザ側のJavaScriptで質問の選択、オプションの選択、正解の表示を非表示にすることが考えられます。

(注)このが完全に誰もが、洗練されていないユーザーからの回答を保護していないだろうが、それはあなたのプライバシーのいくつかのささやかを与えるだろう。Caesar Cypher

  • ROT13変動の難読化実装rさ:

    <div>Q:&nbsp;<span id="q"></span></div> 
    <div>1:&nbsp;<span id="o1"></span></div> 
    <div>2:&nbsp;<span id="o2"></span></div> 
    <div>3:&nbsp;<span id="o3"></span></div> 
    <div>Placeholder:&nbsp;<span id='p'></span></div> 
    <div>A:&nbsp;<span id='a'></span></div> 
    
    <script> 
        var cc=''.charCodeAt,sh=[].shift,jo=[].join,sp=''.split, 
         ma=[].map,fc=String.fromCharCode,lo=''.toLowerCase, 
         fe=[].forEach, 
         /* #1 */ r=function(s){ 
         var f=function(c){ 
          var v=cc.call(lo.call(c)),t=v>=96,k=(v-96+12)%26+1; 
          if(v<97 || v>122) return c; return fc(k+(t?96:64)); 
         }; 
         return jo.call(ma.call(sp.call(s,''),f), ''); 
         }, 
         /* #2 */ d=[ 
         'Gur dhrfgvba gb nfx?', // The question to ask? 
         'Svefg cbffvoyr nafjre', // First possible answer 
         'Frpbaq cbffvoyr nafjre', // Second possible answer 
         'Guveq cbffvoyr nafjre', // Third possible answer 
         '[Naq gur nafjre vf...]', // [And the answer is...] 
         'Gur npghny nafjre!',  // The actual answer! 
         ], 
         /* #3 */ t=['q','o1','o2','o3','p','a']; 
    
        /* #4 */ fe.call(t,function(tr){ 
        document.getElementById(tr).innerText=r(sh.call(d)); 
        }); 
    </script> 
    

    • #1:ここでは

      は私が(jsfiddleでのライブ、それを参照してください)提案するソリューションです#2:dは、ROT13でエンコードされた文字列の配列で、新しいクエストごとに置き換える必要がありますイオンがユーザに提示される

    • tは、デコードされた文字列を挿入する要素を特定するDOM要素IDの配列です。
    • #4:デコードされた文字列を適切な要素に挿入します。各新しい質問を回答するためのサーバ、問題の符号化された値、回答の選択肢、プレースホルダから取り出され、実際の答え自体がdの値を置換する

    アプリケーションでは、onClickイベントハンドラが添付されたラジオボタンがあり、成功したか失敗したかを判断するために、復号化された回答に対してクリックされたオプションをチェックします。ここで

    がROT13暗号の非難読化されたバージョンです:

    var rot13 = function(s){ 
        return s.split('').map(function(c){ 
         var v=c.toLowerCase().charCodeAt(0); 
         if(v<97 || v>122) return c; 
         var t = v>=96, 
          k = (v - 96 + 12) % 26 + 1; 
         return String.fromCharCode(k + (t ? 96 : 64)); 
        }).join(''); 
    }; 
    
  • 関連する問題