jQuery führt alte funktion aus

risdesign

Mitglied
Hallo ihr lieben

ich hab folgendes Problem:

ich lade die user in das div#seite

script.js
Code:
// USER LADEN
function user_laden(){
	$.ajax({
			type: "POST",
			url: "../script/ajax.php",
			data: "seite=user_laden",
			success: function(data){
				var json = $.parseJSON(data);
				$("#seite").html(json.seite);
				
				// HIER MUSS MAN DIE REINGELADENEN FUNKTIONEN EINFÜGEN	
												
				// USERNAME EDITIEREN
				$(".editieren").change(function(){
					var id = $(this).parent().attr('id');
					var name = $(this).val();
					var superadmin = $(this).parent().siblings().attr('id');
					user_editieren(id,name,superadmin);
				});

				// USER LÖSCHEN
			  $(".loeschen").click(function(){
					var id = $(this).siblings().attr('id');
					var name = $(this).siblings().find("input.editieren").val();
					user_loeschen(id,name);
				});

				// USER -> ADMIN
				$(".user_wechsel").click(function(){
					var id = $(this).siblings().attr('id');
					var name = $(this).siblings().find("input.editieren").val();
					user_wechsel(id,name);
				});

				// ADMIN -> USER
				$(".admin_wechsel").click(function(){
					var id = $(this).siblings().attr('id');
					var name = $(this).siblings().find("input.editieren").val();
					admin_wechsel(id,name);
				});
				
				// PASSWORT ÄNDERN
				$(".passwort_eingabe").click(function(){
					var id = $(this).siblings().attr('id');
					var name = $(this).siblings().find("input.editieren").val();
					
					$("#passwort_eingeben").fadeIn();
					
						$(".passwort_speichern").click(function(){
						
						var passwort = $("#passwort_neu").val();
							
						passwort_eingeben(id,name,passwort);
						
						$(this).parents('div.modal-box').fadeOut('slow');
						user_laden();
					});
						
				});
			}
	});
}

dann möchte ich per klick auf den schlüssel (passwort ändern) eine dialogbox öffnen in der man das neue passwort eingibt.
per speichern button wird ein ajax request an die mysql datenbank gesendet und das passwort wird dem user mit der übergebenen id zugewiesen.
alles wunderbar bis ich dann dem nächsten user ein passwort eingeben will.
dann schreibt es das passwort des letzten users inklusiv aktueller user mit dem passwort des aktuellen users. und bei den nächsten das selbe.

script.js
Code:
// PASSWORT ÄNDERN
function passwort_eingeben(id,name,passwort)
{
	$.ajax({
		type: "POST",
		url: "../script/ajax.php",
		data: "seite=passwort_aendern&user_id="+id+"&user_pass="+passwort,
		success: function(data){
			var json = $.parseJSON(data);
			
			if(json.seite != "" && json.seite != null && json.seite == "ja")
			{
				$("#ok").fadeIn(function(){
					$(this).find("p").text("Das Passwort von "+name+" wurde erfolgreich geändert");
				});
			}
			else
			{
				$("#fehler").fadeIn(function(){
					$(this).find("p").text(json.seite);
				});
			}

			$("#passwort_neu").val('');
		}
	});
}

ajax.php
PHP:
//
//	PASSWORT ÄNDERN
//

if($_POST['seite'] == "passwort_aendern")
{
	$user_id = $_POST['user_id'];
	$user_pass = $_POST['user_pass'];
	
	if($user_id == "superadmin")
	{
		$sql = "UPDATE user SET passwort = '".$user_pass."' WHERE superadmin = 1";
	}
	else
	{
		$sql = "UPDATE user SET passwort = '".$user_pass."' WHERE id = ".$user_id;
	}
	
	if(mysql_query($sql))
	{
		$ergebnis_text = "ja";
	}
	else
	{
		$ergebnis_text = "Fehler beim ändern des Passwortes aufgetreten!";
	}
	
	$ret = Array("seite" => $ergebnis_text, "status" => $user_id);
}

was mache ich falsch?
 
Hi,

zwar kann ich dir nichts zu deinem Problem sagen, da ich mir nicht alles angeschaut habe, aber ich kann dir folgendes sagen:

Ich kann dein Admin-Passwort ändern.
Ich kann alle Passwörter ändern.
Ich habe kompletten Zugriff zu deinem Benutzersystem.

Du hast folgende Sicherheitslöcher:

-SQL Injection
-Du traust dem AJAX-Request "superadmin" nur dann zu übergeben, wenn ein "superadmin" angemeldet ist. Ich kann die Anfrage mit 0 Aufwand fälschen.

(-Du nutzt die alte MySQL-Erweiterung)

Nutze PDO/MySQLi mit Prepared Statements. Wg. dem aktuellen Nutzer, speicher den beim Anmelden in der Session oÄ.
 
Danke für die Antwort, aber das klappt mit dem SQL-Injection nicht ;)

Von der PHP/MySQL Seite her klappt alles so wie es soll. Javascript macht mir hier den Strich durch die Rechnung.
JS übergibt immer die letzten werte inklusiv neuen werte.

mit
Code:
wert = null;
wert = "";
oder wert = 0;

klappt das nicht

wenn ich die seite komplett neu lade (F5) dann geht das mit dem nächsten wieder. aber ich will doch nicht nach jeder aktion die komplette seite neu laden. darum brauch ich doch jquery ;)
 
ComFreek erwähnte ein paar Sicherheitslöcher, die du unbedingt schließen solltest.

Ich vermute mal das dein eigentliches Problem "Cache" sein wird, deshalb würde ich folgendes austesten:

Javascript:
// PASSWORT ÄNDERN
function passwort_eingeben(id,name,passwort)
{
    $.ajax({
        type: "POST",
        url: "../script/ajax.php",
        cache:false,
        data: "seite=passwort_aendern&user_id="+id+"&user_pass="+passwort,
        success: function(data){
            var json = $.parseJSON(data);
            
            if(json.seite != "" && json.seite != null && json.seite == "ja")
            {
                $("#ok").fadeIn(function(){
                    $(this).find("p").text("Das Passwort von "+name+" wurde erfolgreich geändert");
                });
            }
            else
            {
                $("#fehler").fadeIn(function(){
                    $(this).find("p").text(json.seite);
                });
            }
 
            $("#passwort_neu").val('');
        }
    });
}

oder

Javascript:
// PASSWORT ÄNDERN
function passwort_eingeben(id,name,passwort)
{
    $.ajax({
        type: "POST",
        url: "../script/ajax.php?rand="+Math.random(),
        data: "seite=passwort_aendern&user_id="+id+"&user_pass="+passwort,
        success: function(data){
            var json = $.parseJSON(data);
            
            if(json.seite != "" && json.seite != null && json.seite == "ja")
            {
                $("#ok").fadeIn(function(){
                    $(this).find("p").text("Das Passwort von "+name+" wurde erfolgreich geändert");
                });
            }
            else
            {
                $("#fehler").fadeIn(function(){
                    $(this).find("p").text(json.seite);
                });
            }
 
            $("#passwort_neu").val('');
        }
    });
}

Somit werden die Ajax-Abfragen nicht zwischengespeichert. Es kann nämlich sein, weil für Ajax augenscheinlich alles gleich ist und Ajax jede Anfrage auch sparen möchte, dass aufgrunddessen auf den Cache zurückgreifen wird.

Zudem ist auch die Speicherung des Passwortes in Klartext auch nicht ideal, zumindest könnte es bei eventuellen Rechtsfragen bzw. Datenschutz/Datensicherheit durchaus Probleme dir bereiten.

Passwörter solltest du in der Regel Hashen, mit md5() oder noch besser sha1(). Zudem kannste ja mal googlen nach gesalzene Passwörter. Es sind nur Tipps die ComFreek und ich dir weitergeben möchten.
 
Zuletzt bearbeitet:
Zudem ist auch die Speicherung des Passwortes in Klartext auch nicht ideal, zumindest könnte es bei eventuellen Rechtsfragen bzw. Datenschutz/Datensicherheit durchaus Probleme dir bereiten.

Passwörter solltest du in der Regel Hashen, mit md5() oder noch besser sha1(). Zudem kannste ja mal googlen nach gesalzene Passwörter. Es sind nur Tipps die ComFreek und ich dir weitergeben möchten.

Vielen Dank für deine Antwort. Ich habe mich nicht so sehr mit .ajax() befasst und somit nicht gewusst dass man noch mehr parameter einfügen kann. Ich kann mir vorstellen dass es an dem liegt. Werde dies dann mal testen sobald der Server wieder ON ist. Das mit den Passwörtern in Klartext: Jup ich weiss dass es nicht gut ist. Ist im moment auch nur zu testzwecken so damit ich besser sehen kann obs klappt.
Danach werden die Passwörter gepfeffert und gesalzen ;)
Und das mit den SQL-Injections werde ich natürlich auch testen ;)
 
Zu den Injections etc.: Ich bestätige das auch noch, dass du es uns auch ohne Test glauben kannst.
Sonst bin ich gern bereit, es dir vorzuführen :rolleyes:
:D
 
@Dimenson:
Ist das erste mal dass ich gehörte habe, dass ajax() Aufrufe gecached werden.
Kurz nachgelesen:
http://api.jquery.com/jQuery.ajax/

-> Hast halb recht, der Browser kann ein GET Request (mit gleichen Parametern) cachen, aber cacht keine POST Requests, somit ist das hier nicht der Fall.


@Threadstarter: Ich würde mal damit anfangen zu testen was dir den dein json zurück gibt: "console.log(json)" in der success Funktion deines Requests
 
@all danke aber wie ihr ja selber rausgefunden habt geht das nicht. müsste ich es als get versuchen? oder ist das doof?

das mit der console kann ich machen. meiner meinung nach ist es von der php seite gut aber von der javascriptseite eher nicht gut. es scheint mir als würde die id dazu addiert. hatte das mal mit nem alert versucht.
da kam dann immer wieder zuerst der neue wert und dann die alten nacheinander.
ich versuch das mit der console aber erst wenn ich wieder ran kann...
 
Passwörter solltest du in der Regel Hashen, mit md5() oder noch besser sha1(). Zudem kannste ja mal googlen nach gesalzene Passwörter. Es sind nur Tipps die ComFreek und ich dir weitergeben möchten.

MD5 ist schon seit längerer Zeit gebrochen. SHA1 würde ich für Kryptographie nicht nutzen.

Ich würde folgende Links empfehlen:
a) http://stackoverflow.com/a/6337021
b) http://security.stackexchange.com/a/16817
c) http://security.stackexchange.com/a/6415

Ich würde zu bcrypt oder scrypt tendieren. Vor allem scrypt wurde entworfen, um die Berechnung von Rainbow-Tabellen mittels schnellen GPUs zu verlangsamen (größere Arbeitsspeicherbedingungen und CPU-Last, siehe dazu auch Link (b) oben).
bcrypt ist langsamer berechenbarer als PBKDF2 auf GPUs, dazu siehe Link (c). Und bei Hash-Funktionen ist Geschwindigkeit ein Nachteil! Je langsamer (für den potentiellen Angreifer), desto besser.

Auf jeden Fall aber auch Salts benutzen!

Das war jetzt ein wenig viel Offtopic, musste aber unbedingt erwähnt werden! MD5/SHA1 nicht als Hash-Funktionen empfehlen!
 

Neue Beiträge

Zurück