Beim Erstellen einer fantastischen Web -App oder -webelle möchten wir manchmal, dass Personen Teile unserer Web -App/-website in ihre eigene einbetten können. Das könnte ein Iframe sein, der eine Schaltfläche "Gefällt mir", ein einfaches Bild, das sie wiederverwenden oder sogar unsere gesamte App in einem Iframe eingebettet haben.
Aber wie kontrollieren wir, wer Zugriff hat, wer unsere Bandbreite verbrauchen und unseren Service abfragen kann?
Wir definieren das Problem als Zugriff bis Assets
Mit Vermögenswerten meinen wir: alles, was von unserer Website abfragt werden kann.
Wenn wir über die Zugriffskontrolle sprechen, geben wir die Sicherheitsdomäne ein. Und wenn sie über Sicherheit spricht, sollte das Whitelisting der Ansatz sein, der zum Problem angegangen wird. Es ist einfacher zu kontrollieren, wer auf Ihr -Vermögenswerte zugreifen darf, als zu kontrollieren, wer nicht ist. Es ist einfach unmöglich, alle Boogie -Monster des Internets zu kennen.
Um unser -Vermögenswerte zu schützen , stellen wir einen Gatekeeper ein, um nur diejenigen zu lassen, denen wir vertrauen. Nachdem wir nach dem Einstellung Zugang zu einem Whitelist, den wir kontrollieren, und ihn das ganze schwere Heben machen lassen. Problem gelöst. Aber wie soll der Gatekeeper anheben?
Abhängig davon, wie sicher Sie möchten, dass der Gatekeeper sein soll und was der Kunde verlangt, kann verschiedene Taktiken angewendet werden.
Ein häufiger verwendeter Ansatz ist die Überprüfung des Referer -Headers. Diese Methode hat 3 große Nachteile:
Bei statischen Vermögenswerten wie Bildern, JS und CSS sind diese Nachteile jedoch kein Problem. Ihr Vermögen sollte nur geladen werden, wenn Benutzer unsere Website direkt (oder von einer vertrauenswürdigen Website) besuchen. Die allgemeine Idee ist es, andere zu blockieren, die sie heißen. Der Referator wird daher immer auf Ihrer Whitelist sein. Es sei denn, Sie vertrauen sich nicht selbst - aber dann haben Sie größere Probleme.
Abhängig vom verwendeten Setup fließt die Abfrage durch eine Reihe von Gates . Das einfache Setup ist: Client -> HTTP -Server -> Anwendungscode
Wo sitzt Ihr Gatekeeper? Der Kunde ist ein De -facto -No -GO -GO -GO -GEHALT, da er ein unzuverlässiger Lügenstück des Menschen ist. Der HTTP -Server und der Anwendungscode hingegen sind nützliche Optionen. Beide geben uns starke Werkzeuge, um den http_host zu überprüfen.
Die Stärke, wenn Ihr HTTP -Server Ihre Zugriffskontrolle verarbeitet, ist die Geschwindigkeit. Für jede Anfrage müssen der Anwendungscode nicht starten. Dies kann die Leistung drastisch verbessern, da wir keinen gesamten Anwendungsstapel/Thread (z. B. mod_php) in den Speicher laden müssen.
Abhängig von Ihrem HTTP -Server sind verschiedene Lösungen verfügbar.
In Apache gibt es zwei verschiedene Methoden. Wir können mod_rewrite verwenden oder zulassen/verweigern.
Die mod_rewrite -Methode:
# Turn mod_rewrite on RewriteEngine On # if it is not trusted.domain.tld block it RewriteCond %{HTTP_REFERER} !^trusted\.domain\.tld$ [NC] RewriteCond %{HTTP_REFERER} !^trusted\.tld$ [NC] RewriteRule ^ - [F]
mod_rewrite wird von den meisten Hosting -Anbietern unterstützt.
Die Methode zulassen/verweigern:
#specify the files to guard, block all the assets <files "*.*"> #block everyone Deny from all #allow trusted ones Allow from trusted.tld trusted.domain.tld </files>
nicht alle Hosts unterstützen diese Einstellungen.
Das httpreferermodul in nginx gibt uns die wirklich cool valid_referers: Also, was wir tun müssen, ist HTTP-Code 444, wenn eine nicht treue Domäne versucht, auf unsere Vermögenswerte zuzugreifen die Verbindung ohne Senden von Header…
http -Server denken nicht
location / { valid_referers trusted.tld trusted.domain.tld; if ($invalid_referer) { return 444; } }
Für jede kleine Bearbeitung müssten wir in unsere Konfigurationsdateien eintauchen - und je mehr Sie manuell wechseln, desto mehr kann schief gehen.
Anwendungscode weiß, was zu tun ist
Was ist mit diesen Iframes?
<span><span><?php </span></span><span><span>//the whitelist we control </span></span><span><span>$whitelist = array( </span></span><span> <span>'trusted.tld', </span></span><span> <span>'trusted.domain.tld' </span></span><span><span>); </span></span><span> </span><span><span>//the referer </span></span><span><span>$referer = parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST); </span></span><span> </span><span><span>//the gatekeeper </span></span><span><span>if ( !in_array($referer, $whitelist) ) </span></span><span><span>{ </span></span><span> <span>throw new GateKeeperDoesNotApprove; </span></span><span><span>}</span></span>
Wir könnten jedoch einen Killer beauftragen, um unserem Gatekeeper zu helfen. Unser Killer wird an die Menschen versandt, die misstrauisch aussehen (z. B. diejenigen mit einem nicht vertrauenswürdigen Referator). Der Killer wird JS als seine Waffe verwenden:
# Turn mod_rewrite on RewriteEngine On # if it is not trusted.domain.tld block it RewriteCond %{HTTP_REFERER} !^trusted\.domain\.tld$ [NC] RewriteCond %{HTTP_REFERER} !^trusted\.tld$ [NC] RewriteRule ^ - [F]
Leider hat jemand, der aus einer nicht vertrauenswürdigen Domäne kommt, denselben Referatoren wie jemand anderes, der auf uns zugreift, indem wir einen Iframe aus dieser nicht vertrauenswürdigen Domäne verwenden. In den Vermögenswerten wird der Referator jedoch auf unsere Domain festgelegt (auch in einer Iframe -Situation) - daher ist das Senden eines Killers hier übertrieben. Einfach zu leugnen ist ausreichend - oder Sie können ein zufälliges Kätzchenbild senden.
Deshalb haben wir unseren Hitman -Überprüfen, ob wir uns in einem Iframe befinden. Wenn ja, lassen wir ihn unser Ziel töten:
#specify the files to guard, block all the assets <files "*.*"> #block everyone Deny from all #allow trusted ones Allow from trusted.tld trusted.domain.tld </files>
Das einzige, was wir wissen müssen, ist, dass unser Gatekeeper den Killer zu der Nutzlast hinzufügt, die an den Kunden gesendet wird. Einfach!
location / { valid_referers trusted.tld trusted.domain.tld; if ($invalid_referer) { return 444; } }
Dieser Code ist kein Produktionsnachweis. Es dient als Beispiel.
Die hier gelieferten Lösungen werden Sie gegen die meisten Boogie -Monster schützen. Beide Lösungen sind jedoch nicht narrensicher. Der erste verwendet Daten vom Client, das zweite ist JavaScript, das vom Client ausgeführt wird.
Die sichere Art und Weise ist die Verwendung eines auf Token basierenden Gatekeeper. OAuth ist wahrscheinlich der Typ, den Sie für den Job hier wollen, aber das liegt außerhalb des Rahmens dieses Artikels.
Das obige ist der detaillierte Inhalt vonVermögenszugriffsbeschränkungsmethoden - unerwünschte Besucher blockieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!