WordPress Ajax Datensicherheit

Ich bin mir der Tatsache bewusst, dass Nonces auf Absichten hin überprüft werden, aber kann es keinen Sinn ergeben, wenn ich sie verwenden kann, um irgendwie auf databaselesevorgänge einzuschränken? Ich meine, ich hole Datensätze aus der database mit AJAX, aber ich möchte nicht, dass jemand diese Daten auf andere Weise admin-ajax.php (POST-Anfragen an diese admin-ajax.php Seite).

Zum Beispiel habe ich in meinem AJAX-Handler so viel Arbeit (ich sende $myid zusammen mit der Aktion im AJAX-Aufruf):

 $myid = 5575; $query = "SELECT `id` FROM table WHERE `user_id` = $myid;"; $data = $wpdb->get_col( $query ); echo json_encode($data); die(); 

Ich rufe so viele Daten über AJAX an, wie kann ich sie vor bösartigen Benutzern schützen, die versuchen können, direkte POST-Aufrufe an diese Seite zu senden?

Edit: @Bainnetnet Danke für die detaillierte Erklärung, zu schätzen, aber meine Frage ist wirklich, was @Milo sagte und ich kann sehen, dass, wenn ich eine einzigartige Nonce für diese Anfrage erstellen kann, kann ich nichts wie @ @ goldenapples tun. Recht?

Ich kümmere mich um all diese Dinge mit dem Facebook JS SDK, also ist alles, was zu tun ist, nur mit AJAX (ohne Laden der Seite), und was auch immer ich daran denke, den Benutzer wp_signon() oder irgendetwas wp_signon() , kann jeder andere tun auch ohne Autorität. Also, ich habe keine Eindeutigkeit in einem Benutzer, der tatsächlich die Website verwendet und derjenige, der versucht, einige Daten zu lesen, anders als die Website den Aufruf zum Abrufen der Daten macht. Und was immer ich tun kann, um es einzuloggen oder irgendetwas, das kann auch von jemand anderem repliziert werden. Kann jemand an etwas denken?

Update: Ich denke, ich habe einen Workaround gefunden, indem ich es einfach mit action aufgerufen und andere Parameter von Facebook mit PHP SDK bekommen habe. Aber ich bin immer noch offen für Vorschläge oder irgendetwas anderes.

Solutions Collecting From Web of "WordPress Ajax Datensicherheit"

Es gibt einige Dinge, die Sie tun können, um sicherer zu machen:

Zuerst sollte der Ajax Aufruf selbst mit einem WordPress Nonce gemacht werden, wie du gesagt hast:

  

_ajax_nonce im obigen Code die beiden Attribute action und _ajax_nonce die beide benötigt werden, um den Aufruf von admin-ajax.php zu verifizieren. In den ersten Zeilen des Codes wird geprüft, ob eine Aktion an den Server gesendet wurde. die() ‘s ( FIRST CHECK ) dann mit dieser Aktion Sie mit einem Aktionshaken rufen Sie Ihre eigene Ajax-function:

 //if you want only logged in users to access this function use this hook add_action('wp_ajax_ACTION_NAME', 'my_AJAX_processing_function'); //if you want none logged in users to access this function use this hook add_action('wp_ajax_nopriv_ACTION_NAME', 'my_AJAX_processing_function'); 

Wenn Sie sowohl angemeldete Benutzer als auch keine angemeldeten Besucher auf diese function zugreifen möchten, verwenden Sie beide Hooks (SECOND CHECK).

dann in dir Ajax-function das erste, was Sie tun sollten, ist für die Ajax Referrer (DRITTE CHECK) zu überprüfen:

 function my_AJAX_processing_function(){ check_ajax_referer('my_ajax_nonce'); //do stuff here } 

Wenn Sie als Nächstes Abfragen für die database mit Benutzereingaben $wpdb->prepare sollten Sie $wpdb->prepare for $wpdb->prepare und validation verwenden, anstatt:

 $query = "SELECT `id` FROM table WHERE `user_id` = $myid;"; $data = $wpdb->get_col( $query ) 

benutzen:

 $data = $wpdb->query( $wpdb->prepare("SELECT `id` FROM table WHERE `user_id` = %d",$myid)); 

Ich bin mir nicht ganz sicher, wie sicher das ist, aber WordPress Ajax-Handler sind benutzerfreundlich (ich nehme an, die Anfrage ist immer noch eine Anfrage, also werden Cookies überprüft und wenn Benutzer angemeldet ist, der berücksichtigt wird). Sie können also current_user_can() einchecken.

vermutlich ist man bei dieser Anfrage eingeloggt? Sie können einige Daten hashen und eine eindeutige Benutzer-Nonce auf Ihrer Seite erstellen, diese mit Ihrer Ajax-Anfrage übergeben und sie mit dem angemeldeten Benutzer vergleichen. oder vielleicht missverstehe ich, was du hier machst.