PHP / MYSQL - Problem

B

b.o.fan

Guest
hallo @ all

Ich habe ein Problem....

Mein PHP - Script sieht so aus:

Die Datenbank:
http://pictransfer.de/uploads/PHPMyAdminan...fd4c10c7jpg.jpg
anzeige_ende INT(15)
anzeige_status CHAR(1)
anzeige_time INT(15)

Der Code
CODE
$artikel = $_GET['art'];
$anzeige_time = mktime();
$anzeige_update = "UPDATE `oxami_anzeige` SET `anzeige_time` = ".$anzeige_time.", `anzeige_status` = 1 WHERE anzeige_id = ".$artikel."";
$anzeige_sql = mysql_query($anzeige_update) or die(mysql_error());
$select = "SELECT anzeige_ende AS ende FROM oxami_anzeige
WHERE anzeige_id = '".$_GET['art']."' LIMIT 0,1";
$sql = mysql_query($select);
$ds = mysql_fetch_object($sql);
$anzeigen_ende = $ds->ende;
echo $anzeigen_ende."<br>";
$anzeigen_ende = $anzeigen_ende * (60*24*60);
echo $anzeigen_ende."<br>";
$anzeigen_ende = $anzeigen_ende - (60*60);
echo $anzeigen_ende."<br>";
$anzeigen_ende = $anzeige_time + $anzeigen_ende;
echo $anzeigen_ende."<br>";
$anzeigen_ende = date("Y-m-d H:i:s", $anzeigen_ende);
echo $anzeigen_ende."<br>";
$anzeige_ende_update= "UPDATE `oxami_anzeige` SET `anzeige_ende` = UNIX_TIMESTAMP('".$anzeigen_ende."') WHERE `anzeige_id` = '".$artikel."' ";
$anzeige_ende_sql = mysql_query($anzeige_ende_update)
or die(mysql_error());
echo $anzeige_update."<br>";
echo $anzeige_ende_update;



Durch die echo's kommt folgende Ausgabe zu Stande.



QUOTE
5
432000
428400
1199354011
2008-01-03 10:53:31
UPDATE `oxami_anzeige` SET `anzeige_time` = 1198925611, `anzeige_status` = 1 WHERE anzeige_id = 38
UPDATE `oxami_anzeige` SET `anzeige_ende` = UNIX_TIMESTAMP('2008-01-03 10:53:31') WHERE `anzeige_id` = '38'


Die "5" kommt aus der Datenbank, das sind die Tage in der Zukunft.

in anzeige_ende hat er anstatt von dem Timestamp in der Zukunft

709521820

gespeichert.....

Wenn ich aber:

UPDATE `oxami_anzeige` SET `anzeige_ende` =
UNIX_TIMESTAMP('2008-01-03 10:53:31') WHERE `anzeige_id` = '38'

unter PHPMyAdmin ausführe, dann macht er's richtig...

Warum?
 
QUOTE (b.o.fan @ Sa 29.12.2007, 13:08)Ich habe ein Problem....

Mein PHP - Script sieht so aus:

Der Code

QUOTE
$artikel = $_GET['art'];
$anzeige_time = mktime();
$anzeige_update = "UPDATE `oxami_anzeige` SET `anzeige_time` = ".$anzeige_time.", `anzeige_status` = 1 WHERE anzeige_id = ".$artikel."";
$anzeige_sql = mysql_query($anzeige_update) or die(mysql_error());
$select = "SELECT anzeige_ende AS ende FROM oxami_anzeige
WHERE anzeige_id = '".$_GET['art']."' LIMIT 0,1";



Stimmt. Du hast ein Problem bzw. der, der dein Script freiwillig verwendet.

Es ist nämlich offen wie ein riesengroßes Scheunentor. Wir haben das Jahr 2007 - Sql-Injektionen sind seit Jahren als eines der fundamentalen Sicherheitsprobleme für Webdatenbank-Systeme bekannt.

PS: Da das Wort oxami drin vorkommt, das auch hier auftaucht: Bist Du der Programmierer für @kekskruemel?

PPS: Programmiere erst einmal zwei Jahre offline, bis Du mit den grundlegenden Sicherheitsproblemen im Web vertraut bist.

PPPS: Kleines Beispiel: Eine Html-Seite basteln, die das Feld 'art' und den Senden-Button enthält. Dann in art etwas in der Form eingeben:


QUOTE irgendwas'; Delete From oxami_anzeige where 'a' = 'a


Ich nutze mySql nicht, weil mir die ganze Architektur PHP+clientseitig generiertes Sql + mySql zu unsicher ist, deshalb kann da auch irgendeine Kleinigkeit falsch sein. Aber im Prinzip wird dann die Tabelle gelöscht. Zuerst fragt man natürlich die Systemtabellen ab, welche benutzerdefinierten Tabellen es gibt.
 
jAuer hat schon recht. Sicherheit sollte man nicht vernachlässigen.
Benutz für php am besten: http://ch2.php.net/manual/de/ref.pdo.php
Geht allerdings erst ab php5

Ansonsten verstehe ich nicht ganz warum du aus einem UnixTimestamp ein Datum machst:
CODE
$anzeigen_ende = date("Y-m-d H:i:s", $anzeigen_ende);

und dann das Datum von MySQL wieder in einen UnixTimestamp umrechnen lässt?
Als schnell Lösung, schreib doch direkt den UnixTimestamp alsl Int in die Datenbank!

CODE
// $anzeigen_ende = date("Y-m-d H:i:s", $anzeigen_ende);
echo $anzeigen_ende."<br>";
$anzeige_ende_update= "UPDATE `oxami_anzeige` SET `anzeige_ende` = ".$anzeigen_ende." WHERE `anzeige_id` = '".$artikel."' ";
$anzeige_ende_sql = mysql_query($anzeige_ende_update)
or die(mysql_error());


Das eigentliche Problem dahinter kann ich allerdings auch nicht ausmachen.
 
ich hab eine function geschrieben, in der ich schaue ob der wert numerisch ist.

und ich formatiere ihn vorher...

CODE
function sql_ink($string, $art)
{
if($art == 1) // FILTERUNG OB WERT NUMMERISCH, LEERZEICHEN,
{
$string = trim($string);
return $string;
}
if($art == 2) // Überprüfung eines WortStrings, Vorkommen von DELETE, UPDATE, INSERT, FROM, INTo, SET
{
$replace_word = array("DELETE", "UPDATE", "INSERT", "FROM", "INTO");
for($i = 0; $i < count($replace_word); $i++)
{
$string = str_replace($replace_word[$i], '', $string);
}
return $string;
}
}

function test_string($string,$art)
{
if($art == 1)
{
$wert = is_numeric($string);
if($wert) { return $wert = TRUE;}
elseif(!$wert) {return $wert = FALSE;}
}
if($art == 2)
{
$string = trim($string);
if(is_string($string)) { return $wert = TRUE; }
elseif(!is_string($string)) { return $wert = FALSE; }
}
}



Also ungefiltert kommt nichts mehr durch.
 
QUOTE (b.o.fan @ So 30.12.2007, 16:32)ich hab eine function geschrieben, in der ich schaue ob der wert numerisch ist.
...
Also ungefiltert kommt nichts mehr durch.

Du beschäftigst dich seit einem Tag mit diesem Problem und behauptest, es bereits gelöst zu haben?

Du kennst all die Möglichkeiten, wie man Zeichen als Unicode-Datenstrom maskieren kann, so daß deine byte- bzw. varchar-orientierten Methoden das gar nicht erkennen, weil die Datenströme nvarchar oder UTF-8 sind?

Und all die Opensource-Produkte, die dynamisch Sql-Code zusammenbauen und seit Jahren immer wieder Löcher haben: Da hast Du nach einem Tag mehr Erfahrung als diese?

Alles außerhalb der strikten Verwendung von gespeicherten Prozeduren dürfte löcherig sein - der Link von Manuel liefert dir Infos.
 
ich habe nich behauptet, dass ich es glöst habe, aber ich hab angefangen es zu erschweren...
 
Zurück
Oben