[Ajax] Sicherheit - brauche Midenker ;)

klanawagna

Erfahrenes Mitglied
Hallo!
Ich spiele mich für ein kleines Projekt mit Ajax Datenbankabfragen (ich schreibe eine Funktion, die per POST einen Query an eine PHP Datei schickt, die dann den query ausführt)
Funktioniert ja alles so weit, aber ich mach mir gröbere Sorgen um die Sicherheit. Rein theoretisch könnte man ja dann meine JS-Datei verwenden und bösartige Querys an meinen Server senden.
Ich möchte, dass nur meine Dateien die JS-Funktion verwenden können.

Ich hätte einen kleinen Lösungsansatz, der im Gedankenexperiment funktioniert, aber ich frage hier, ob das überhaupt funktionieren könnte.

Wenn die Datei (eine .php Datei), in der mein JS-Code aufgerufen wird, aufgerufen wird (:P), schreibe ich zu Beginn eine Sessionvariable (nennen wir sie $_SESSION["lock"]). In der Datei, die dann in meiner Ajax-Funktion aufgerufen wird, überprüfe ich ob $_SESSION["lock"] gesetzt ist. Wenn nicht, dann wird die Funktion wohl nicht von meiner Seite auf meinem Server aufgerufen. Ist der Query fertig, setze ich $_SESSION["lock"] wieder zurück.

Jetzt die Frage an euch, ob das Sinn macht, ob das sicher ist.

Danke fürs Mitdenken!

lg
klanawagna
Wenn jetzt allerdings jemand eine Seite bei mir öffnet und dann von sich aus den Q
 
Hallo,

ob das mit den Sessions so funktioniert, bezweifele ich. Der Benutzer kann (wenn wirklich eine Query per AJAX geschickt wird) die komplette Anfrage ja auch ändern und dann wegschicken. Die SESSION-Variable ist gesetzt, der Server meint es ist alles OK.

Ich würde hier eher einen anderen Ansatz wählen. Schicke per AJAX nur abstrakte Befehle an den Server, welcher aus diesen dann die Query zusammenbaut. Somit hast du mehr Kontrolle, was der Benutzer über die API nun darf, oder nicht.

Beispiel:
http://example.com/api.php?action=getAll
-> wird auf dem Server zu "SELECT * FROM test;"
http://example.com/api.php?action=getSingle&id=13
-> wird auf dem Server zu "SELECT * FROM test WHERE id=13"

Gruß
BK
 
Hallo!
Ich spiele mich für ein kleines Projekt mit Ajax Datenbankabfragen (ich schreibe eine Funktion, die per POST einen Query an eine PHP Datei schickt, die dann den query ausführt)
Funktioniert ja alles so weit, aber ich mach mir gröbere Sorgen um die Sicherheit. Rein theoretisch könnte man ja dann meine JS-Datei verwenden und bösartige Querys an meinen Server senden.
Ich möchte, dass nur meine Dateien die JS-Funktion verwenden können.

Ist es nicht so das Browser so ein verhalten unterbinden, da das Cross-side-scripting ist? Ich hab mal versucht aus einem Frame meinen JS-Code auf einer fremden Seite auszuführen und das ist unmöglich.
 
Hallo,

wenn er die JS-Datei mit GreaseMonkey oder ähnlichem manipuliert, kann er aus dem Browser raus das einfach so machen, da ist keine Hexerei dabei. Da das JavaScript im Kontext der Seite ausgeführt wird ist es auch sicherheitstechnisch nicht falsch.

Gruß
BK
 
Hi!

Ich habe jetzt einen aus der "Branche" gefragt, wie das "Professionell" gelöst wird. er meinte, die Lösung wären Stored-Procedures. Ich glaube so werde ich es auch lösen, obwohl es mir die flexibilität nimmt. Ist mir aber jetzt mittlerweile egal, besser als unsicher ;)

lg
klanawagna!
 
Kannst du auch erklären wieso Stored-Procedures das ganze sicherer machen sollten? Es geht doch darum, dass nur berechtigte Leute eine Anfrage senden können und nicht darum, möglichst wenig Schaden auf der Serverseite anzurichten. Was hindert den Angreifer daran deine Stored Procedure aufzurufen?

Die korrekte Lösung (meiner Meinung nach) wäre es ein Token mitzusenden, welches z.b. noch gehasht die Anfrage enthält (zusammen mit einem geheimen Schlüssel). Der Angreifer kann zwar die Anfrage manipulieren, kann aber ohne den Schlüssel nicht den korrekten Hash zu seiner Anfrage erzeugen und ist aufgeschmissen. Das Prinzip hat sich bewährt und wird in den APIs der Welt verwendet (ClickAndBuy, Facebook, etc.).
 
Garnicht. Du sendest dem Client doch nur den Hash für die Anfrage mit, den er dir wieder zurücksendet.
Oder soll man beliebige SQL-Anfragen auf Client Seite "tippen" und "erstellen" können?
 
Vielleicht habe ich dich ja falsch verstanden, dann mach es vielleicht deutlicher.
Also du sendest per Javascript an die Datei sql.php eine Anfrage und sendest sie dort direkt weiter an die Datenbank.
Angenommen es handelt sich um "SELECT * FROM tabelle", dann sendest du beim Seitenaufruf ja "SELECT * FROM tabelle" an den client, damit du es dort wiederum zum passenden Zeitpunkt ausführen kannst. Jetzt sendest du einfach zusätzlich noch das gehashte Query samt Schlüssel zum Client. Der sendet beides an sql.php und du kannst sicher sein, dass die Anfrage nicht verfälscht wurde.

Falls du beim Seitenaufruf noch nicht genau weist, was der Client denn an sql.php sendet, hilft das natürlich nicht weitere. Aber genauso wenig wie die stored procedures, denn die schränken dich auch sehr ein.
 

Neue Beiträge

Zurück