Home | Registrieren | Einloggen | Suchen | Aktuelles


Forum » PHP & MySQL » MySQL5 - Problem in der neuen Version Antworten
MySQL5 - Problem in der neuen Version

TeX
Feiertags-Poster


Beiträge: 30


Hi,

wenn man einen INSERT macht und hat z.b. solchen code:

1: 
2: 
3: 
4:
$anfrage = "INSERT INTO ".$tab_anf.TABLE_NAVI." (okate, pos, name)
values('$_POST[kid]', '$last_pos', '$_POST[kate_name]')";
mysql_query($anfrage, $link)
or die("Konnte Datensatz zur <b>".$tab_anf.TABLE_NAVI."</b>-Tabelle"." nicht hinzufügen<br>MySQL meldet: <b>".mysql_error()."</b>");


okate = INT(11) St.=0

Wenn nun z.B. die Var $_POST[kid] nichts enthält, dann erfolgt eine Fehlermeldung bei MySQL5: Out of range value adjusted for column 'okate' at row 1

Wenn man diese Var vorher prüft und wenn "" auf 0 setzt, dann funktioniert der INSERT, meine Frage ist nun ob sich das um nen Fehler in dieser Version handelt, so bleiben soll o. man vielleicht das mit Feld-Eigenschaften verändern kann?

Meine Version ist die 5.0.16-nt.

  Profil   E-Mail   Website   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Es ist kein Fehler sondern korrekt. In SQL können Zahlen zwar in Single-Quotes stehen (wie auch Strings), dennoch ist Standard-SQL eigentlich typensicher. Man muß also '0' schreiben. Ältere MySQL-Versionen machen ein automatisches Typecasting. Du solltest mit (int) sicherstellen, das die Variable eine Ganzzahl ist.

Bei dir fehlt außerdem völlig das Absichern der Formularwerte. Ein Angreifer kann daher beliebiges SQL bei dir einschleusen. Nutze mysql_real_escape_string().

Auch kommen Strings (wie die Arrayschlüssel) immer in Quotes. Unterbrich den String oder kennzeichne komplexe Variablen innerhalb des Strings mit {}.

---
Weaverslave

Diese Nachricht wurde geändert von: subjective
  Profil   Website   Editieren   Zitieren

TeX
Feiertags-Poster


Beiträge: 30


ok, dann ist der Standart-Wert bei INT-Felder in dem Fall=nutzlos, tolle Sache machen die da, öhm das einschleusen von fremden Code ist nicht möglich da das System nur dateien vom eigenen Server zulässt und darin enthaltene Werte stimmen müssen die mit dem System dynamisch wechseln.

Na prima, dann darf ich nun so ca. 100 Systeme durchgehen und diese Fuck 0 schreiben lassen.

Besten Dank an Dich!

  Profil   E-Mail   Website   Editieren   Zitieren

raiserle
Fachidiot


Beiträge: 144


also ich hab ne 4.1.14

habs dort gerade nochmal getestet
ich habe aber das feld gg , bei mir mit not null default '0' definiert

wenn ich jet nen insert mache

insert into tabelle (gg) values ('')

dann gehts bei mir, er setz dann den default wert 0 ein,
weis ja nun nicht ob es bei der 5er version anders ist, aber solte dort geanu so gehen
also die feldeigenschaften von standart 0 auf not null und default auf 0 setzen....
teste das mal und sag mir, ob es dann geht

gruß raiserle

---
Irren is Menschlich

Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!

Kameradschaft ist, wenn der
Kamerad schafft !!!!

  Profil   E-Mail   Website   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Der Standardwert wird bei "NOT NULL" Feldern genutzt, wenn man für sie als Wert NULL angibt. Er hat also sehr wohl eine Wirkung und Nutzen.

Das Einschleusen von SQL-Code ist möglich, da du die Werte aus dem Formular nicht absicherst. Ich kann also einfach die Formularwerte so manipulieren, so das ein mir genehmes SQL erzeugt wird. Mit Dateien hat dies nichts zu tun.

---
Weaverslave

  Profil   Website   Editieren   Zitieren

TeX
Feiertags-Poster


Beiträge: 30


$_POST[var]=CLEAR_USER_VARS($_POST[var]);

In der Funktion wird sozusagen alles in Strings verwandelt und das passiert über z.b. einem INSERT, Befehle die die DB Betreffen werden auch gefiltert, also was da ankommt is auf jedenfall kein Befehl mehr. Schick mir mal ne Email an tex@ohne-host.de was Dir da so vorschwebt. Bin mal gespannt ob das ne Wirkung hat.

Diese Nachricht wurde geändert von: TeX
  Profil   E-Mail   Website   Editieren   Zitieren

TeX
Feiertags-Poster


Beiträge: 30


raiserle schrieb am 14.12.2005 22:45

also die feldeigenschaften von standart 0 auf not null und default auf 0 setzen....
teste das mal und sag mir, ob es dann geht

gruß raiserle


Bei dem Feld ist `okate` int(10) NOT NULL default '0' eigestellt , das is ja das Prob, also in diesem Fall=nutzlos, o. mal andersrum, poste mal die Feldeigenschaften das der Code unter der 5er Version funktioniert wie er oben steht.

Diese Nachricht wurde geändert von: TeX
  Profil   E-Mail   Website   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Natürlich sind die Werte in $_POST Strings - sie sind immer Strings. Ich könnte beispielweise einen zweiten Datensatz einfügen, in dem ich das Feld beende. Interessanter wird es bei SELECTs - ich könnte da dann alle Daten aus der DB ziehen. Google halt einfach mal nach "SQL-Injection".



---
Weaverslave

  Profil   Website   Editieren   Zitieren

raiserle
Fachidiot


Beiträge: 144


@ tex:
das war ja meine frage, ob das bei der 5er dann auch so geht....
normalerweise sollte er ja auch dort, wenn das feld angegben wird
und kein value gesetzt wird der default genommen werden.

subjective, wenn ich das richtig verstanden habe, sollte meine aussage ja auch für die 5er stimmen, oder irre ich da?
wenn meine aussage stimmt, ist was an den feldeigenschaften bei dir nicht io , tex.

---
Irren is Menschlich

Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!

Kameradschaft ist, wenn der
Kamerad schafft !!!!

  Profil   E-Mail   Website   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Der SQL-Code ist fehlerhaft nicht die Attribute. '' ist ein leerer String - mit automatischem Typecasting wird daraus 0 - also das gleiche wie der Defaultwert (es wird _nicht_ der Defaultwert verwendet).

Korrekterweise muß dort also nicht '', nicht '0' sondern NULL stehen um den Defaultwert zu nutzen.

---
Weaverslave

  Profil   Website   Editieren   Zitieren

TeX
Feiertags-Poster


Beiträge: 30


Ander mal bitte den SQL-Code ab (Feld: okate) so wie es sein soll, ich hab nun alle möglichen Varianten probiert, aber der "Fehler" ist bei jeder Einstellung vorhanden.

1: 
2: 
3: 
4: 
5: 
6: 
7: 
8:
CREATE TABLE `gp_navi` (
  `id` int(11) NOT NULL auto_increment,
  `okate` int(11) NOT NULL default '0',
  `pos` int(10) NOT NULL default '0',
  `z_p` char(1) NOT NULL default '',
  `name` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
);

  Profil   E-Mail   Website   Editieren   Zitieren

raiserle
Fachidiot


Beiträge: 144


thx subjective, ;)
also bedeutet das die 5er keine automatische typconvertierung mehr macht,
der versteh ich das jetzt wieder falsch

---
Irren is Menschlich

Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!

Kameradschaft ist, wenn der
Kamerad schafft !!!!

  Profil   E-Mail   Website   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Und nochmal - der Fehler leigt nicht in der Tabellendefinition, sondern im SQL mit dem du das Insert machst. Dort muß entweder eine Nummer (optional in Quotes) oder NULL hin. Wenn du möchtest, das der Standardwert verwendet wird, muß da NULL hin oder das Feld gar nicht angegeben werden.

Im SQL-Standard ist strenge Typisierung vorgesehen. Wenn du zB mal PostgreSQL einsetzt, bemerkt man das recht schnell *g*. MySQL 5 behebt also eigentlich nur einen Mangel. Allerdings sollte das auch umschaltbar sein, wenn ich mich nicht irre.



---
Weaverslave

  Profil   Website   Editieren   Zitieren

raiserle
Fachidiot


Beiträge: 144


thx, subjective.
naja, das ist ja ein gut nutzbarer fehler von der 4.x.x, wenn man es mal von der seite betrachtet

---
Irren is Menschlich

Wer andern eine Grube gräbt,
sollte darüber nachdenken,
ob sie tief genug ist!!!!

Kameradschaft ist, wenn der
Kamerad schafft !!!!

  Profil   E-Mail   Website   Editieren   Zitieren

subjective
Forenheld


Beiträge: 848


Nein auch unter MySQL 4.x wäre es falsch. Da dort immer 0 eingesetzt wird (durch die Typkonvertierung) und nicht der Standardwert. Bei dir klappte es nur zufällig gerade weil dieser Wert dem Standardwert entsprach.

---
Weaverslave

  Profil   Website   Editieren   Zitieren
 

Antworten
Nach oben