2016-05-13 2 views
-1

私はRailsのポーリングサイトを作っていますが、結果は非常に正確です。ユーザーはPOSTリンクを使用して投票します。私はユーザーが一度だけ投票することを確かめるために苦労し、投票しているものを正確に知っています。特定のドメインからの要求を確実に受け取ることはできますか?

しかし、結果に関心のある第三者が自分のウェブサイトにPOSTリンクを張って、投票経路を指摘することができたのです。たとえば、誤解を招くような記述を追加するなどして、結果をこのように歪曲させることができます。

リクエストは自分のドメインからのみ送信されるようにする方法はありますか?したがって、別のドメインからのリンクは、私のコントローラのコードを実行しません。

答えて

2

確認する必要があることはさまざまです。最初はrequest.refererで、あなたのサイトへのリンクを参照したページが表示されます。それがあなたのサイトでない場合、それを拒否する必要があります。

if URI(request.referer).host != my_host 
    raise ArgumentError.new, "Invalid request from external domain" 
end 

しかし、これが唯一の正確HTTPヘッダーrefererを移入Webクライアント(ブラウザ)からあなたを守ります。それはウェブページからのものであると仮定しています。たとえば、誰かが電子メールでリンクを送信する可能性があり、電子メールクライアントがリファラーをまったく提供しない可能性があります。ノーリファラーの場合は

、あなたにも、それをチェックすることができます

if request.referer.blank? 
    raise ArgumentError.new, "Invalid request from unknown domain" 
elsif URI(request.referer).host != my_host 
    raise ArgumentError.new, "Invalid request from external domain" 
end 

をそれはHTTP「リファラ」を偽装することも簡単なスクリプトと非常に簡単ですので、あなたは、有効な取得する場合でも正当なPOSTであることを確認するためには、他のチェックが必要になります。スクリプトキディーは常にこのようなことをしています。そして、Ruby、Python、Perl、カール、さらにはVBAのダースラインで、「実ユーザ」による対話をシミュレートすることができます。

リクエスト/レスポンスキーメカニズムのようなものを使用することができます。この方法では、サイトから提供されるリンクには、ページへの訪問ごとに一意のキー(追跡する)が含まれており、そのキーを持つ人だけが投票できます。

投票者を特定する方法も重要です。受動的識別技術は、広告の提供や勧告のような重要でない活動には適しています。しかし、このアプローチは、一般の人口で使用された場合に、測定可能な割合の時間に定期的に失敗します。あなたが実際に人々がが投票活動を破壊するためにを望んでいるという事実を考慮する場合、良いコンセプトの「システムを打ち負かす」と空いている時間を誰もが突然ターゲットにすることは非常に簡単です。

早急にできるだけ多くのセキュリティを構築してください。予想よりもはるかに多くのセキュリティが必要になるためです。 2012年の大統領選挙では、41のオンライン投票サイトを事前テストするように求められ、最初の24時間(うち1時間以内に6人)で39人を破棄できました。過度に慎重にしてください。 「通常の」メカニズムを使用するだけでなく、攻撃者がどのように侵入できるかを理解する。コード内でも、使用しているテクノロジに関する情報を公開しないでください。 HTMLまたはJavascriptコード(またはURLパス名)のどこにでも "Rails-isms"があると、攻撃者は安全機構を破ることに直面します。あなたの利益にあいまいさを使用し、可能な限りあらゆる場所でセキュリティを使用してください。

注:request.refererを確認するには、銀行の金庫に南京錠をかけるようなものです:それは簡単に思いとどまらされているものを出しておこう、それでも決定した個人を遅くはありません。

+0

あなたの素晴らしい答えをありがとう!私があなたが言及したリクエスト/レスポンスキーメカニズムについてもっと知るために使用できるソースを知っていますか? –

+1

@DaSourcererが指摘しているように、RailsにはCSRF保護が含まれています。これは、あるWebサイトが別のWebサイトへの投稿を防止するのに役立ちます。 (その素晴らしい情報のために彼の答えをupvoteしてください!)。しかし、それはあなたのサイトを動かすためのスクリプトを書くことができる攻撃者にはあまり役立つことはない、カジュアルなサイト間ハッカーを排除します。私はいくつかの良い参考文献を掘り起こすことができるかどうかを見ます。その間に、 '機械化'宝石が何をすることができるのかを見るかもしれません - 人々が実際に投票を自動的に行うために使用する重大なウェブサイトのハッキングツールの代表です。 –

1

ここで防止しようとしているのは、基本的にはcross-site request forgeryです。マイケルが正しく指摘したように、Refererヘッダーをチェックすると何も買わないでしょう。

一般的な対策として、各ユーザーに各フォームと共に送信され、ユーザーのセッションに格納された個別のワンタイムトークンを与えることです。提出時に、提出された値と格納された値が一致しない場合、その要求は却下されます。幸いにもあなたのために、RoRはship such a featureのようです。確かに1ライナーのように見えます。

関連する問題