2016-08-10 3 views
1

私は、ユーザーがGETリクエストなどのURLを変更する場合の悪用を防止する方法を見つけようとしています。以下のコードは、受信したリクエストをコレクションに入れるためのExpressルータ上のルートです。引数のためにコレクション "A"とし、そのコレクションからいくつかのものを返します。ユーザが「B」へのフロントエンドJavaScriptコードでURLで:collectionセクションを変更した場合REST URLのユーザー操作悪用の防止

router.get("/word/:collection/:language/:amount", function(req, res) { 
     getItems(req, res); 
    } 

今、彼はコレクション「B」を取得します。これをどうやって防ぐのですか?ユーザーIDを保持するコレクションのようなものの場合は、req.userに基づいてこれらのアクセスを禁止することはできますが(この場合は?)、この場合、ユーザーはコレクションAとコレクションAの両方にアクセスする必要があるため、 B、私はちょうど間違った時間にそこに入るのを制限したい(どちらも別のページで必要とされる)。

答えて

1

特定のユーザーのみの情報を含む残りのエンドポイントには、セキュリティを確保する必要があります。 (最も一般的な方法は、API、oAuthトークン、またはログインCookieに渡されるAPIトークンです)。 userAがcollectionBにアクセスしてはならない場合は、そのリソース内でチェックを行い、何らかのタイプのエラーコードをブラウザに返す必要があります。

標準エラーのほとんどのウェブサイトの実装は401: Unauthorizedです。ここでは簡単な例です:

router.get("/word/:collection/:language/:amount", function(req, res) { 
    if (!hasAccess(req.params.userToken)) 
    { 
     return res.send(401, {success: false, message: 'no permission'}); 
    } 
    var collection = req.params.collection, 
    var language = req.params.language, 
    var amount = req.params.amount; 
    return getItems(req, res, collection, language, amount); 
} 

編集:あなたの質問を再読み込みした後、私は今、ユーザーが1つのポイントまたは別の時に両方のコレクションへのアクセス権を持っている必要がありますことを実現しています。この場合でも、サーバー側の検証を実装する必要があります。ここでは(クイズ/答えと)別の例です:

router.get("/quiz/finish/:id", function(req, res) { 
    //Store that this user has taken this quiz 
    return recordQuizAnswers(req.params.userToken, req.params.quizAnswers); 
} 

router.get("/quiz/answers/:id", function(req, res) { 
    //Has this user taken this quiz? 
    if (!hasUserTakenQuiz(req.params.userToken)) 
    { 
     return res.send(401, {success: false, message: 'Trying to get the answers before taking the quiz? Cheater...'}); 
    } 
    return getQuizAnswers(req.params.id); 
} 

編集2:あなたのコメントを見た後、私はあなたが使用することができ、別の解決策を考えてきました。自動インクリメントの代わりにUUIDのIDを使用してください。これにより、ユーザは簡単に追加/減算して異なるクイズを得ることができなくなります。

+0

ありがとうございます。それは私の言いたいことではありませんが、私は思っています。 「特定のクイズのデータ​​を取得しなければならない場合、一般的にユーザーが利用できる複数のクイズがある場合はどうすればよいでしょうか?」というようなものがあります: "router.get("/quiz /:quizID /答え/ "、function(req、res)...."私が "quizID"を操作すると間違ったクイズの回答が得られますユーザーはこれらの両方のクイズにアクセスできます。 –

+0

更新された回答を見る@DeanVaessen(Edit 2) – FrankerZ

+0

Hmmmしかし、これを正しく理解すれば、私がページAに行くとそれを悪用することができます。そのUUIDをメモしてくださいそのコレクションに使用し、ページBに行き、JavascriptでUUIDを変更し、ページAのコレクションを取得します。 –

関連する問題