2013-03-15 16 views
13

Ich habe eine Website, die Werte in einer Datenbank basierend auf Benutzerinteraktion erhöhen muss. Wenn Benutzer auf eine Schaltfläche klicken, wird ein PHP-Skript aufgerufen, das den Wert erhöht. Ich möchte dieses Skript vor dem Zugriff durch externe Skripte schützen. Gegenwärtig könnte ein Benutzer seine eigene Webseite mit einer JavaScript-Funktion schreiben, die dieselbe php-Datei wiederholt anschlägt, um den Wert in der Datenbank zu erhöhen.Zugriff auf PHP-Datei nur über Ajax auf dem lokalen Server zulassen

Hier ist meine jQuery-Code, der das Inkrementieren tut:

jQuery(function(){ 
$('.votebtn').click(function(e){ 
    var mynum = $(this).attr('id').substring(0,5); 
    $.ajax({ 
      url:"countvote.php", 
      type:"GET", 
      data: { 
       thenum:mynum 
      }, 
      cache: false, 
      success:function(data) { 
       alert('Success!'); 
       } 
      } 
     }); 
}); 
}); 

Wie würde ich mich darüber, so dass nur ein Anruf von Ajax/jquery auf dem lokalen Server machen kann ‚countvote.php‘ zugreifen? Wenn das nicht der richtige Weg ist, bin ich offen für jeden Vorschlag, der verhindert, dass mein PHP-Skript von externen Skripten missbraucht wird.

+0

Können Sie die Websites einschränken, die countvote.php nur diejenigen auf Ihrer Domain zugreifen kann? – user829323

+0

@ user829323 Das ist mit 'wget' einfach außerhalb des Browsers zu fälschen –

Antwort

3

Sie können überprüfen, ob $_SERVER['HTTP_X_REQUESTED_WITH'] gleich xmlhttprequest ist, aber es ist keine zuverlässige Methode, um festzustellen, ob eine Anfrage eine AJAX-Anfrage ist oder nicht, es gibt immer einen Weg, um dies zu umgehen. Aber es schützt Sie vor zufälligen Treffern wie falsch eingegebene URLs, Crawler etc.

2

Theres nicht wirklich eine 100% Methode, dies zu tun. AJAX-Anfragen werden immer von einem Kunden kommen. Verwenden Sie POST-Anfragen anstelle von GET und das wird Ihnen helfen, Probleme zu vermeiden, aber nicht vollständig zu stoppen und in Ihrem PHP, nur alle Anfragen ablegen.

+2

Leider ist das keine Option. Ich habe herausgefunden, dass iOS 6 POST-Anfrageergebnisse von JQuery/AJAX zwischenspeichert. Auf Mobilgeräten sind die Antwortdaten daher ungenau. – LoneWolfPR

+0

Überprüfen Sie diese Antwort, um das zu beheben. http://stackoverflow.com/questions/12506897/is-safari-on-ios-6-caching-ajax-results – castis

+1

Wenn ich mich nicht irre, denke ich, dass Sie JQuery 1.5 oder höher benötigen, um das Header-Steuerelement zu verwenden. Leider habe ich auf die Verwendung von 1.3 gehämmert, was das nicht unterstützt. Es ist Teil eines CMS, das ich momentan nicht aktualisieren kann. Trotzdem danke. – LoneWolfPR

33

Die Lösung benötigt zwei Schritte.

Erstens muss die Ajax-Datei Zugriff nur in Ajax-Anfrage mit diesem Code erlauben.

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&  strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest'); 
if(!IS_AJAX) {die('Restricted access');} 

Zweitens die Ajax-Datei Zugriff hat im Namen der Datei, die es mit dem Befehl $ _SERVER nennen [ ‚HTTP_REFERER‘]. So können Sie den Zugriff nur auf dem Host-Server beschränken.

$pos = strpos($_SERVER['HTTP_REFERER'],getenv('HTTP_HOST')); 
if($pos===false) 
    die('Restricted access'); 

Vielleicht kann der Code arbeiten nur mit dem zweiten Teil

+1

das ist eine wirklich gute Idee. und es funktioniert. – Kiwy

+3

Dies funktioniert nicht. Jeder kann einen X-Requested-With- und Referer-Header mit beliebigen Werten senden. – Quentin

+0

@Quentin, was ist Ihre Lösung, um die Anforderungen zu lösen? Ein Geheimnis auf der Startseite? –

Verwandte Themen