2016-05-13 7 views
-1

Ich mache eine Rails-Umfrage-Website, die Ergebnisse haben sollte, die sehr genau sind. Benutzer wählen über POST-Links. Ich habe mich bemüht, sicherzustellen, dass Nutzer nur einmal abstimmen und genau wissen, wofür sie wählen.Kann sichergestellt werden, dass Anfragen von einer bestimmten Domain kommen?

Aber mir ist aufgefallen, dass Dritte, die an den Ergebnissen interessiert sind, POST-Links auf ihren eigenen Websites veröffentlichen könnten, die auf meine Abstimmungswege zeigen. Sie könnten meine Ergebnisse auf diese Weise verzerren, zum Beispiel durch Hinzufügen einer irreführenden Beschreibung.

Gibt es eine Möglichkeit, sicherzustellen, dass die Anfragen nur von meiner Domain kommen können? Bei einem Link, der von einer anderen Domain kommt, würde der Code in meinem Controller nicht funktionieren.

Antwort

2

Es gibt verschiedene Dinge, die Sie überprüfen müssen. Die erste ist request.referer, die Ihnen die Seite mit dem Verweis auf Ihre Website mitteilt. Wenn es nicht Ihre Site ist, sollten Sie sie ablehnen.

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

Doch dies schützt Sie nur von Web-Clients (Browser), die genau den HTTP-Header referer füllen. Und das geht davon aus, dass es überhaupt von einer Webseite kam. Zum Beispiel könnte jemand einen Link per E-Mail senden, und ein E-Mail-Client wird wahrscheinlich überhaupt keinen Referer zur Verfügung stellen.

In dem Fall ohne referer, können Sie für das überprüfen, wie gut:

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 

Es ist auch sehr einfach, mit einfachen Skript der HTTP ‚referer‘ zu fälschen, so dass selbst wenn Sie einen gültigen erhalten tun Domain benötigen Sie weitere Prüfungen, um sicherzustellen, dass es sich um einen legitimen POST handelt. Script Kiddies machen diese Art der Sache die ganze Zeit, und mit einem Dutzend von Ruby, Python, Perl, Curl oder sogar VBA, können Sie die Interaktion von einem "echten Benutzer" simulieren.

Möglicherweise möchten Sie etwas wie eine Anfrage/Antwort-Schlüsselmechanismus verwenden. Bei diesem Ansatz enthält der Link, der von Ihrer Site geliefert wird, einen eindeutigen Schlüssel (den Sie verfolgen) für jeden Besuch der Seite, und dass nur jemand mit diesem Schlüssel wählen kann.

Wie Sie Wähler identifizieren, ist auch wichtig. Passive Identifikationstechniken eignen sich gut für nicht kritische Aktivitäten, z. B. Anzeigen oder Empfehlungen. Dieser Ansatz schlägt jedoch regelmäßig einen messbaren Prozentsatz der Zeit bei Verwendung in der allgemeinen Bevölkerung fehl. Wenn Sie auch die Tatsache betrachten, dass Menschen tatsächlich Wahlaktivitäten zu korrumpieren wollen, ist es sehr einfach, plötzlich ein Ziel für alle mit einem guten Konzept zu werden, "das System zu schlagen" und etwas Freizeit in ihren Händen.

Bauen Sie so früh wie möglich so viel Sicherheit wie möglich ein, denn Sie werden weit mehr benötigen, als Sie erwarten. Während der Präsidentschaftswahl 2012 wurde ich gebeten, 41 Online-Wahlsites vorab zu testen, und konnte 39 von ihnen innerhalb der ersten 24 Stunden (6 von ihnen innerhalb von 1 Stunde) brechen. Sei übervorsichtig. Wissen, wie Angreifer eindringen können und nicht nur "normale" Mechanismen verwenden. Veröffentlichen Sie keine Informationen zu den von Ihnen verwendeten Technologien, auch nicht im Code. Wenn Sie "Rails-Ismen" irgendwo im HTML- oder Javascript-Code (oder sogar in den URL-Pfadnamen) sehen, wird der Angreifer sofort einen enormen Vorteil bei der Bekämpfung Ihrer Sicherheitsmechanismen haben. Nutzen Sie die Dunkelheit zu Ihrem Vorteil und nutzen Sie Sicherheit, wo immer Sie können.

HINWEIS: Die Überprüfung der request.referer ist wie ein Vorhängeschloss in einem Banktresor: Es hält diejenigen ab, die leicht davon abzuhalten sind, aber wird die entschlossene Person nicht verlangsamen.

+0

Vielen Dank für Ihre großartige Antwort! Kennen Sie eine Quelle, die ich verwenden kann, um mehr über den von Ihnen erwähnten Request/Response-Schlüsselmechanismus zu erfahren? –

+1

Wie @DaSourcerer darauf hinwies, enthält Rails CSRF-Schutz, der dazu beitragen wird, zu verhindern, dass eine Website auf einer anderen Website veröffentlicht wird. (Bitte upvote seine Antwort für diese großartige Information!). Das wird die gelegentlichen Cross-Site-Hacker draußen halten, aber das wird nicht viel gegen Angreifer helfen, die in der Lage sind, Skripte zu schreiben, um Ihre Site zu betreiben. Ich werde sehen, ob ich ein paar gute Referenzen ausgraben kann. In der Zwischenzeit könntest du dir ansehen, was das "mechanize" -Gel zu tun hat - es ist repräsentativ für ein ernstzunehmendes Website-Hacking-Tool, mit dem Nutzer tatsächlich automatisch Stimmen abgeben können. –

1

Was Sie hier verhindern wollen, ist im Grunde cross-site request forgery.Wie Michael richtig gesagt hat, wird die Überprüfung der Referer Header Sie nichts kaufen.

Eine beliebte Gegenmaßnahme besteht darin, jedem Benutzer ein individuelles Einmal-Token zu geben, das mit jedem Formular gesendet und in der Benutzersitzung gespeichert wird. Wenn der übermittelte Wert und der gespeicherte Wert beim Absenden nicht übereinstimmen, wird die Anfrage abgelehnt. Zum Glück für Sie scheint RoR ship such a feature. Sieht in der Tat wie ein Einzeiler aus.

Verwandte Themen