2013-08-15 5 views
24

Ich möchte serverseitig prüfen, ob eine Anfrage an meine PHP-Seite eine Ajax-Anfrage ist oder nicht.Wie überprüfe ich, ob die Anfrage eine AJAX-Anfrage mit PHP ist?

sah ich zwei Möglichkeiten, dies zu tun:

Erste Möglichkeit: einen GET Parameter in der Anfrage zu senden, die die Seite sagt, dass dies ein AJAX-Request (= mypage.php?ajax)

mypage.php:

if(isset($_GET['ajax'])) { 
    //this is an ajax request, process data here. 
} 

Zweite Weise: Satz einen Header an den xmlHttpRequest:

clientseitige js:

xmlHttpRequestObject.open(“GET”,url,true); 
xmlHttpRequestObject.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 

mypage.php:

if (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { 
    //request is ajax 
} 

Die Tatsache ist, können diese zwei Möglichkeiten, es zu tun leicht gehackt werden, so ist es nicht zu überprüfen, zu sichern, wenn ich eine AJAX-Anforderung wie diese zu erhalten .

Wie kann ich überprüfen, ob ich eine AJAX-Anfrage erhalte?

+5

Denken Sie nur daran: "Vertrauen Sie niemals der Client-Seite". Sie können nicht wissen, woher eine Anfrage stammt. Du könntest (fast) alles parodieren/verkleiden. – DaGardner

+0

Mögliches Duplikat von http://stackoverflow.com/questions/4301150/how-do-i-check-if-the-request-is-made-via-ajax-with-php – JRizz

+0

@ ChristianGärtner Ich weiß das, deshalb Ich habe die Frage gepostet. Ich denke nicht, dass es einen 100% sicheren Weg gibt, es zu tun, aber ich denke, dass es einen Weg geben muss, es für Hacker schwierig zu machen, die Anfrage zu fälschen (vielleicht auf der Serverseite) – BackSlash

Antwort

20

Es gibt keine sichere Möglichkeit zu wissen, dass eine Anfrage über Ajax gestellt wurde. Sie können niemals den Daten vertrauen, die vom Client kommen. Sie könnten ein paar verschiedene Methoden verwenden, aber sie können leicht durch Spoofing überwunden werden.

+1

Ja. Ich bin mir ziemlich sicher, dass es keinen 100% sicheren Weg dafür gibt. Aber ich denke, dass es einen Weg geben muss, es für Hacker schwierig zu machen, die Anfrage zu fälschen (vielleicht auf der Serverseite?) – BackSlash

+3

@BackSlash Sie könnten es schwierig machen, aber das wäre Sicherheit durch Dunkelheit. Persönlich würde ich mich nicht darauf verlassen. Ihre beste Wette wären wahrscheinlich Tokens, die sich pro Anfrage ändern. Oder ein Captcha. –

+0

Ich habe über Cookies nachgedacht, werden sie mit einer Ajax-Anfrage gesendet? – BackSlash

-3

Sie könnten versuchen, eine $_SESSION Variable zu verwenden, um sicherzustellen, dass eine Anfrage von einem Browser gemacht wurde. Andernfalls könnte die Anforderung über eine Datenbank oder Datei [serverseitig] gesendet werden.

+1

Wie können Sie' $ _SESSION' vom Client definieren? – nmnsud

6

ein Session-Variable für jede Seite auf Ihrer Website Stellen (tatsächliche Seiten nicht enthalten oder RPCs), den die aktuellen Seitennamen enthält, dann in Ihrem Ajax-Aufruf eine Nonce mit dem _SERVER $ gesalzen pass [ ‚SCRIPT_NAME‘]:

<?php 
function create_nonce($optional_salt='') 
{ 
    return hash_hmac('sha256', session_id().$optional_salt, date("YmdG").'someSalt'.$_SERVER['REMOTE_ADDR']); 
} 
$_SESSION['current_page'] = $_SERVER['SCRIPT_NAME']; 
?> 

<form> 
    <input name="formNonce" id="formNonce" type="hidden" value="<?=create_nonce($_SERVER['SCRIPT_NAME']);?>"> 
    <label class="form-group"> 
    Login<br /> 
    <input name="userName" id="userName" type="text" /> 
    </label> 
    <label class="form-group"> 
    Password<br /> 
    <input name="userPassword" id="userPassword" type="password" /> 
    </label> 
    <button type="button" class="btnLogin">Sign in</button> 
</form> 
<script type="text/javascript"> 
    $("form.login button").on("click", function() { 
     authorize($("#userName").val(),$("#userPassword").val(),$("#formNonce").val()); 
    }); 

    function authorize (authUser, authPassword, authNonce) { 
     $.ajax({ 
      type: "POST", 
      url: "/inc/rpc.php", 
      dataType: "json", 
      data: "userID="+authUser+"&password="+authPassword+"&nonce="+authNonce 
     }) 
     .success(function(msg) { 
      //some successful stuff 
     }); 
    } 
</script> 

dann im rpc Sie anrufen Test die Nonce Sie bestanden, wenn es Chancen gut, ist dann ziemlich groß sind, dass Ihr rpc legitim genannt wurde:

<?php 
function check_nonce($nonce, $optional_salt='') 
{ 
    $lasthour = date("G")-1<0 ? date('Ymd').'23' : date("YmdG")-1; 
    if (hash_hmac('sha256', session_id().$optional_salt, date("YmdG").'someSalt'.$_SERVER['REMOTE_ADDR']) == $nonce || 
     hash_hmac('sha256', session_id().$optional_salt, $lasthour.'someSalt'.$_SERVER['REMOTE_ADDR']) == $nonce) 
    { 
     return true; 
    } else { 
     return false; 
    } 
} 

$ret = array(); 
header('Content-Type: application/json'); 
if (check_nonce($_POST['nonce'], $_SESSION['current_page'])) 
{ 
    $ret['nonce_check'] = 'passed'; 
} else { 
    $ret['nonce_check'] = 'failed'; 
} 
echo json_encode($ret); 
exit; 
?> 

edit: zu Ihrer Information die Art und Weise habe ich es eingestellt das nonce ist nur gut für eine stunde und wechsel, also wenn sie das pa nicht aufgefrischt haben Wenn Sie den Ajax-Anruf in der letzten Stunde oder 2 Stunden machen, wird die Ajax-Anfrage fehlschlagen.

29

Hier ist die tutorial des Erreichens des Ergebnisses.

Beispiel:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 
{  
    exit;  
} 
continue; 

Diese prüft, ob die HTTP_X_REQUESTED_WITH Parameter nicht leer ist, und wenn es zu xmlhttprequest gleich ist, dann wird es aus dem Skript verlassen.

+0

AFAIK '$ _SERVER ['HTTP_X_REQUESTED_WITH']' kann gefälscht werden, daher ist es nicht sicher, dass es sich um eine AJAX-Anfrage handelt. Wie auch immer, dies ist eine sehr schlechte Antwort, siehe [How To Answer] (http://stackoverflow.com/questions/how-to-answer): *** Kontext für Links bereitstellen *** - * Eine Verknüpfung zu einer möglichen Lösung ist immer willkommen, aber bitte fügen Sie Kontext um den Link hinzu, so dass Ihre Mitbenutzer eine Idee haben, was es ist und warum es da ist. * *** Zitiere immer den relevantesten Teil eines wichtigen Links, falls die Zielseite nicht erreichbar ist oder geht permanent offline. *** – BackSlash

+2

Diese Antwort ist jetzt EXTREM relevant, weil die Facebook Android App mit 'HTTP_X_REQUESTED_WITH = com.facebook.katana 'sendet. Das Hinzufügen der letzten Überprüfung' =' xmlhttprequest'' Sie müssen diese Prüfung von implementieren Tippe mit dem neuen Facebook-Browser, sonst können komische Dinge passieren. – Tschallacka

3
$headers = apache_request_headers(); 
$is_ajax = (isset($headers['X-Requested-With']) && $headers['X-Requested-With'] == 'XMLHttpRequest'); 
+1

Einige Header können leicht gefälscht werden. 'X-Requested-With' ist einer von ihnen, wie es vom Client festgelegt wurde. Deshalb möchte ich es nicht benutzen. – BackSlash

+0

Ja, es ist nicht sicher, aber wenn Sie sich einfach für das Format der Antwort entscheiden müssen, können Sie es verwenden. – revoke

+0

Dies funktioniert nicht mit Android Facebook-App, legen Sie die X-Anfrage-mit com.facebook.katana! – Blackfire

1

Diese Funktion ist in yii Rahmen verwendet für Ajax-Aufruf zu überprüfen.

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

nicht in yii dieser Code funktioniert auf allen Framework –

Verwandte Themen