SQL Datensätze bearbeiten mit möglichst wenig Informationen vom Client

rusty-spoon

New member
Hallo alle zusammen,

ich schreibe gerade an einem PHP / SQL CMS mit Shop System,

etwas genauer gesagt schreibe ich gerade einige Scripte die Daten in der dazugehörigen Datenbank verändern. Um die zu bearbeitenden Datensätze zu erkennen reiche ich durch die Scripte momentan per hidden input Feld die Datensatznummer weiter

Beispiel:

Code:
			$kategorienr = $HTTP_POST_VARS['kategorienr'];
			$sql = "SELECT name FROM mcs_produkt_kategorien WHERE kategorienr = $kategorienr";
			$result = mysql_query($sql, $Server);

...

			<form action="produkt-kategorie-bearbeiten.php" method="post">
<?php	
			if($result) {
				$data = mysql_fetch_array($result);
?>
				<input type="hidden" value="<?php echo $data['kategorienr']; ?>">
				<input type="text" value="<?php echo $data['name'] ?>" name="name"/>
				<input type="submit" value="bearbeiten"/>
<?php
			}
			else {
				echo $ErrorContent5;
			}
?>
			</form>
in einem anderem Script (momentan schaffe ich mir sowas wie eine code basis) wird der Wert dann geändert:

Code:
$sql = "UPDATE mcs_produkt_kategorien SET name = $name WHERE kategorienr = $kategorienr";
Die daten kommen auch wieder per $HTTP_POST_VARS rein. Jetzt weiss ich aber das hidden input Felder vom Client veränderbar sind und mehr als auf is_numeric(); kann ich da nicht prüfen.

Jetzt ist meine Frage (da dass Script später auf Logins per session ID laufen soll) ob es Sinn macht noch eine Datenbank Tabelle zu erstellen in der Solche Informationen (wie den zu bearbeitenden Datensatz usw) vorübergehend gespeichert werden.
Ich denke da an eine Tabelle mit Primary Key Feld 'editnr' mit dem Attribut AUTO_INCREMENT in dem dann die session ID und die Daten zur bearbeitung gespeichert werden.
So kann ich dann prüfen ob die Daten von einem Client mit der gleichen Session ID kommt und kann sicherstellen dass über änderungen im Quelltext wenigstens nicht direkt die zu bearbeitenden Datensätze geändert werden können.

Macht dass ganze Sinn oder bin ich da zu Paranoid? Ich gehe ja davon aus, das nur mit einem gültigem Login die Datensätze bearbeitet werden können. Ist dass Auslagern in der Datenbank dann nicht überflüssig da sich der jeweilige User ja schon "identifiziert" hat?

Ich hoffe ich konnte meine Überlegung eindeutig darstellen, falls ihr noch Informationen zum Aufbau der Datenbank o.ä. braucht sagt es ich poste es direkt.

vielen Dank im voraus
rusty
 

Elderan

Moderator
Hallo,
Original von rusty-spoon
reiche ich durch die Scripte momentan per hidden input Feld die Datensatznummer
arg, für soetwas gehört man erschlagen, besonders bei Sachen mit kommerziellen Hintergrund.

Deswegen, bitte bevor du weiter Codest, ne kleine Leserunde einlegen und die Grundlagen bzgl. sicheres Programmieren in/unter PHP erlernen.

$sql = "UPDATE mcs_produkt_kategorien SET name = $name WHERE kategorienr = $kategorienr";
Aua aua.
Bitte lass den Shop nie auf einen Kunden los.

Macht dass ganze Sinn oder bin ich da zu Paranoid?
Schön wärs wenn du paranoid wärst ^^
Dann würden solche Schnitzer nicht entstehen ;)


Also:
1. Lerne was Sessions sind.
2. Lerne sichere Programmieren, d.h. was ist die Ausgangsbasis (vertrau niemals auf Eingaben von Usern!), was SQL Injections sind, Cross Site Scripting, Code injection.

Und dann erst weiter programmieren, bzw. am besten gleich neu Anfangen.
Denn bisher scheint dein Shop ein sehr großes Sicherheitsfiasko zu sein, was für ein Nutzer sehr unangenehme Folgen haben könnte.

Denn jmd. mit etwas Ahnung und schlechten Absichten könnte jede Menge unfug machen, auf fremde Acc. Sachen bestellen, Kundendaten auslesen/ändern usw. usw.
 

rusty-spoon

New member
Loslassen auf einen Kunden wollte ich es nicht,

es ist sowas wie ein kleines Projekt um einen Überblick über die Sprache zu bekommen, danke für die Kritik kann ich gut gebrauchen.

Ich habe mir zwar schon Sachen zu XSS, SQL Injection usw angeschaut, aber wie es aussieht noch nicht genug. Dann werde ich wohl erstmal weiter lesen

EDIT// evtl sollte ich dazu sagen dass variablen wie $name vorher mit mysql_real_escape_string entschärft werden

gruß
rusty
 

Elderan

Moderator
Hallo,
Original von rusty-spoon
EDIT// evtl sollte ich dazu sagen dass variablen wie $name vorher mit mysql_real_escape_string entschärft werden
Das bringt rein gar nichts wenn man keine hochkommas verwendet.

Mit solch einem SQL Code könnte ein Angreifer ganz leicht die Kundentabelle auslesen und ausgeben lassen, egal ob mysql_real_escape_string oder nicht.

Finds aber gut, dass das nur zum Üben ist, beruhigt mich ^^.


Also, wie gesagt, zuerst solltest du $HTTP_POST_VARS mal durch $_POST ersetzen, das gleiche bei $_GET (programmier sind faul, _POST und $_GET sieht auch besser aus).
Dann wirklich verstehen was Sessions machen (diese sind verdammt wichtig), damit erübrigen sich deine Fragen auch schon.

Wenn du das mit Sessions soweit verstanden hast, schadet es nicht, wie schon gesagt, wirklich sich mal anzugucken wo so die Tücken liegen und auch wirklich verstehen warum das Gefährlich ist und was man dagegen unternehmen kann (bzw. worauf man achten muss).
Und bei SQL Anfragen immer schön auf Hochkommas achten sowie das escapen von Eingaben.
Wenn du eines vergisst, entsteht eine gigantische Lücke (wobei, wenn man das escapen vergisst wird dies je nach PHP Konfiguration auch aufgefangen, aber ' müssen immer vorkommen)
 

rusty-spoon

New member
Original von Elderan
Und bei SQL Anfragen immer schön auf Hochkommas achten sowie das escapen von Eingaben.
Wenn du eines vergisst, entsteht eine gigantische Lücke (wobei, wenn man das escapen vergisst wird dies je nach PHP Konfiguration auch aufgefangen, aber ' müssen immer vorkommen)
also sollten sql strings eher so aussehen?
Code:
$sql = "UPDATE 'mcs_produkt_kategorien' SET 'name' = '$name' WHERE 'kategorienr' = '$kategorienr' "
Danke für die Denkanstöße
 

M.D.Geist

Member
Hallo rusty-spoon,

die Hochkommas die die verwendest sind die falschen die Abfrage sollte so aussehen:

Code:
$sql=" UPDATE `mcs_produkt_kategorien` SET `name` = '{$name}' WHERE `kategorienr` LIKE '{$kategorienr}' "
 
Oben