2009-08-09 4 views
3

Wie kann sichergestellt werden, dass ein Benutzer die Ergebnisse einer PHP-Skript-URL nicht anzeigt?Wie kann sichergestellt werden, dass ein Benutzer die Ergebnisse einer PHP-Skript-URL nicht anzeigt?

Kürzlich, wenn die Quelle einer Website anzeigen, die einen AJAX-Aufruf machte, habe ich versucht, den Link im Browser

www.site.com/script.php?query=value 

Statt sich um das Ergebnis zu folgen ich sehe, zu erwarten, sah ich eine Meldung, Nur Skripts sollten diese Seite anzeigen.

Wie schränken Sie ein Skript so ein, dass nur ein Skript darauf zugreifen kann?

UPDATE:

hier ist die Seite DEMO page

+0

können Sie einen Link angeben? – Zed

+0

hat es meinem Beitrag über – JasonDavis

+0

hinzugefügt Vielleicht könnten Sie einen Link zu der Seite bereitstellen, die den Aufruf der Seite enthält, nicht die Seite selbst. – tomzx

Antwort

9

mit PHP können Sie überprüfen und nur Ergebnisse anzeigen, wenn die Seite über Ajax aufgerufen wird

function isAjax() { 
    return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')); 
} 

if(isAjax()) { 
    // display content 
} else { 
    // not ajax, dont show 
    echo 'Invalid Request'; 
} 
+0

Ja, ich habe schon davon gehört, aber ich habe es vergessen, bis du es erwähnst es, ich lese es funktioniert nur in einigen Browsern obwohl? – JasonDavis

+0

Ich bin mir nicht sicher, ob ich nicht in allen Browsern arbeiten kann. Es hat für mich in IE, FF und Chrome funktioniert. Ich habe es mit Prototyp und Jquery verwendet. – Tim

+0

Es funktioniert nur mit AJAX-Bibliotheken, die diesen spezifischen Header wie jQuery senden. –

10

Kurze Antwort: Sie können es nicht.

Lange Antwort: Sie können es schwieriger machen, indem Sie spezielle Header-Werte in der HTTP-Anfrage erfordern (Einstellung Accept to application/json ist eine häufige). Überprüfen Sie auf der Serverseite, ob der Header auf den erwarteten Wert gesetzt ist. Dadurch wird sichergestellt, dass normale Benutzer die Nachricht erhalten, die Sie erwähnen, und Ihre Skripts funktionieren einwandfrei. Natürlich können fortgeschrittene Benutzer solche Einschränkungen einfach umgehen, also verlassen Sie sich nicht auf die Sicherheit.

+0

Die Seite, auf die ich ging, zeigt Daten basierend auf einem Suchbegriff mit GET varibale, aber wenn Sie die URL manuell eingeben und auf die Seite gehen, anstatt Suchergebnisse zu sehen, wird dies auf einem Skript angezeigt Seite – JasonDavis

+0

Ich habe gerade die Seite gefunden http://qpoit.com/marcofolio_demo/apple_search/rpc.php?queryString=apple – JasonDavis

6

Sie können nicht. Ein Mensch kann die Anfrage immer spotten. Sie können Ihre Anfrage mit einer Post-Variable senden, um sicherzustellen, dass ein Mensch nicht versehentlich auf die Seite gelangt.

4

Eine mögliche Lösung besteht darin, die HTTP-Anforderung auf ihren Ursprung zu überprüfen. Eine andere Lösung besteht darin, bei jeder Anfrage ein "Passwort" zu senden. Werfen Sie einen Blick in this tutorial, wie dies zu tun ist.

Aber es ist nie 100% sicher, es macht es nur für mögliche Eindringlinge schwieriger.

0

Wenn Sie das Skript von AJAX aufrufen, MUSS es für Sie zugänglich sein, da ein AJAX-Aufruf ähnlich wie Ihr Browser nach der Seite fragt und somit nicht nur Skript zugänglich ist, sondern für jeden zugänglich ist.

Wenn es tatsächlich von PHP oder auf andere Weise aufgerufen wurde, könnten Sie "vielleicht" Apache-Regeln oder PHP-Scripting verwenden, um die Zugänglichkeit zu verringern.

+0

Ich habe einen Link zur obigen Seite hinzugefügt – JasonDavis

-2

Viele Open-Source-Anwendungen verwenden, um eine Variation dieses oben auf jeder PHP-Datei:

if (!defined('SOMETHING')) { 
    die('only scripts have direct access'); 
} 

Dann in index.php definieren sie etwas:

define("SOMETHING", "access granted."); 

edit: ich sage nicht, das ist ein guter Ansatz btw

edit2: Scheint, ich habe den Teil über eine Ajax-Anfrage verpasst. Ich stimme zu, dass dies keine Lösung ist.

+0

Das ist hier nicht der Fall. Es ist so gemacht, weil Sie Seiten vor direktem Zugriff schützen wollen und sie nur mit php einschließen(). In diesem Fall ruft Ajax call direkt rpc.php an. –

0

Sie können einen geheimen Wert in die PHP-Sitzung mit dem Skript 'view' setzen und mit den Ajax-Skripten überprüfen.

  • Fordern Sie index.php mit dem Browser an.
  • PHP erstellt die Seite, speichert einen Schlüssel in die Sitzung, sendet den Inhalt an den Browser zurück.
  • Der Browser erhält den Seiteninhalt und macht einige Ajax-Anfrage an Ihre Website.
  • Diese Ajax-Skripte haben auch Zugriff auf die gleiche Sitzung Ihre Hauptseite tat, die Sie nach einem Schlüssel überprüfen können.

Dies versichert, nur authentifizierte Browser sind erlaubt, die Ajax-Anfragen zu machen.

Rechnen Sie nicht damit, dass die Ajax-Anfrage in die Sitzung schreiben kann. Wenn viele Anfragen gleichzeitig erfüllt sind, wird der letzte Eintrag als letzter in den Sitzungsspeicher zurückgeschrieben.

http://us.php.net/manual/en/book.session.php

+0

Session wird gesperrt Ich glaube, also also jedes Skript müsste auf den vorherigen warten. Deshalb haben sie diese Funktion gemacht: http://us.php.net/manual/en/function.session-write-close.php –

1

Wie Tim erwähnt, wird dieses Skript suchen an Sicherheit grenzender Wahrscheinlichkeit für diesen Request-Header, die mit jeder Anforderung an rpc.php gesendet wird (über das Netz Panel in Firebug gefunden, natürlich):

X-Requested-With : XMLHttpRequest 

In Bezug auf die Cross-Browser-Kompatibilität scheint die setRequestHeader method sowohl mit den Verbindungen activex und xmlhttprequest verfügbar zu sein, so dass dies in allen gängigen modernen Browsern funktionieren sollte.

Verwandte Themen