PHP-Script nur per AJAX erlauben

Moin zamme,

ich habe ein PHP-Script, welches ich per AJAX aufrufe um Daten zu Speichern.
Habe ich irgendeine Möglichkeit im Script darauf zu prüfen, ob selbiges durch einen AJAX-Request aufgerufen wurde oder die Adresse des Skripts einfach in die Adresszeile eingegeben wurde, bzw kann ich letzteres irgendwie verbieten?

Man soll einfach keinen Schabernack mit dem Skript treiben dürfen.
Die Daten, die gespeichert werden, bestehen aus XML. Oder kann ich den String in PHP darauf prüfen, dass er nur gültiges XML enthält?

Gruß, Markus

Nein das geht nicht,weil man jeden Header fälschen bzw. erstellen kann.

Du kannst aber durch gezielte Session abfragen es ziemlich sicher machen.

Wie soll denn das gehen mit den Sessionabfragen?
Wenn ich auf der Hauptseite (die den AJAX-Request macht) ne Session eröffne und dann das Script direkt aufrufe is die Session doch immernoch gültig und hat die gleichen Werte, als wenn das nen AJAX-Request macht.

Kommt ja drauf an vor was du dich schützen willst.

Du kannst ja die Zeitabstände messen(ggn spam).

Du solltest es einfach so machen wie bei einer normalen Seite.

Und was wäre eigentlich das Schlimme daran …?

Dann hat er halt genau die gleichen Daten, die sein Browser sonst „hintenrum“ angefordert hätte, jetzt direkt vorliegen - und das vermutlich noch in einem nicht besonders verständlichen Format.

Und wo ist jetzt das Problem? Ich sehe keins.

Falls du dich entschieden haben solltest, per AJAX Daten zum Client zu transportieren, die aber vor dem Nutzer geheim bleiben sollen - dann liegt dein Fehler schon an dieser Stelle im Konzept.

Ja dann lies meinen ersten Beitrag vielleicht nochmal genau.
Das Script liefert keine Daten, sondern es speichert welche. Und es soll nur die Daten speichern, die die Seite liefert und nicht welche die irgendwer per Direktaufruf dem Script übermittelt.

Umgekehrt kommt’s immer noch auf’s gleiche raus.

Es gibt kein „Request kommt von“ bei HTTP.

Egal, woher extern Daten kommen - du hast ihnen immer zu misstrauen, und sie immer erst nach gründlicher Prüfung anzunehmen. Ob dabei AJAX im Spiel ist, oder auch überhaupt nur so etwas wie ein „Browser“, ist vollkommen unerheblich.

Jo das is ja auch das was ich wissen wollte. Das hab ich mir auch so gedacht aber hätt ja sein können, dass es da vielleicht doch ne Möglichkeit gibt das zu checken.
Dann muss ich sehen wie ich das validiert bekomme.

Aber selbst wenn’s ne sichere Möglichkeit gibt,zu testen ob der Header durch ein AJAX Script gesendet wurde,kann man es trotzdem Missbrauchen!

Jo bin mitlerweile auch davon ab, das auf die Weise zu lösen.
Jetzt muss ich aber im Script darauf testen, dass der übergebene String ein valides xml ist.
Hab bis jetzt mit ner RegExp auf erlaubte Zeichen geprüft. Aber das sagt mir ja noch lang nicht, ob es ein valides XML ist. Da hab ich noch keine vernünftige Lösung für gefunden. Muss ich wohl leider ne komplexere Prüfung draus machen.

Versuche doch einfach, den String per simplexml_load_string zu laden. Dann wirst du sehen, ob es einen Fehler gibt
php.net/manual/de/function.s … string.php

Danke für den Tip, den hab ich aber schon in nem anderen Forum gelesen und das Problem bei dem is, dass dann nicht nur die Funktion false zurückgibt, sondern auch ein PHP-Error (oder Warning oder was auch immer) rausgeschmissen wird.
Mal abgesehen davon, dass die Funktion nicht dafür gedacht is.

Diese fehlermeldung kannst du aber durch error_report unterdrücken lassen, oder direkt unterdrücken, indem du ein @ davor stellst :wink:

Das ist richtig. Aber ich unterdrücke keine Fehlermeldungen. Das is ganz schlechter Programmierstil. Fehler behebt man. Die unterdrückt man nicht.

PHP bietet nun mal nicht an allen Stellen die Möglichkeit, Fehler „still“ zu bearbeiten - manche Funktionen geben auch dann Rückmeldung, wenn alle denkbaren Fehler im Script abgefangen werden.
Und da ist es dann auch legitim, im Einzelfalle mal eine eventuelle Meldung mittels @ zu unterbinden.

(Wobei man im Produktivbetrieb Fehler idR. sowieso nicht an den Client ausgeben, sondern serverseitig loggen lässt. Das bietet einem über die Zeit immer noch die Möglichkeit, sich die Stellen, an denen evtl. öfter datenbezogene Fehler auftreten, anzuschauen und zu überlegen, ob es vielleicht ausgereifterer Maßnahmen bedarf, um eine spezielle Fehlerursache zu unterbinden.)

Da hast du meinetwegen recht. Aber wie chrisb schon gesagt hat, liefert man die Fehlermeldungen nicht an den Client aus, sondern Logt sie.
Zudem ist eine E_Warning-Meldung auch keine Fehlermeldung, sondern eine Warnung. Die du aus meiner Sicht nun mal nicht einfach so unterdrücken kannst, da in deinem Falle der Sinn des Parsen des XML-Strings nun mal auch der ist, zu überprüfen, ob er einen Fehler enthält. Von mir aus darfst du dir gerne etwas aufwändiges coden, dass dir das selbe ergebnis liefert, wie wenn du da einfach n @ vorne hin machst. :wink:
Aber auf meine Hilfe musst du in dem Falle verzichen :smiley: