MySQL5 - Problem in der neuen Version |
TeX
Otto-Normal-Poster Threadstarter
Beiträge: 51 |
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 ".$tab_anf.TABLE_NAVI."-Tabelle"." nicht hinzufügen MySQL meldet: ".mysql_error().""); |
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.
---
Ankauf leere Toner | Ankauf leere Tonerkartuschen
|
 Profil
E-Mail
Website
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
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
Otto-Normal-Poster Threadstarter
Beiträge: 51 |
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!
---
Ankauf leere Toner | Ankauf leere Tonerkartuschen
|
 Profil
E-Mail
Website
Editieren
Zitieren
|
raiserle
Mausakrobat
Beiträge: 172 |
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
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
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
Otto-Normal-Poster Threadstarter
Beiträge: 51 |
$_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.
---
Ankauf leere Toner | Ankauf leere Tonerkartuschen
Diese Nachricht wurde geändert von: TeX |
 Profil
E-Mail
Website
Editieren
Zitieren
|
TeX
Otto-Normal-Poster Threadstarter
Beiträge: 51 |
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.
---
Ankauf leere Toner | Ankauf leere Tonerkartuschen
Diese Nachricht wurde geändert von: TeX |
 Profil
E-Mail
Website
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
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
Mausakrobat
Beiträge: 172 |
@ 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
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
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
Otto-Normal-Poster Threadstarter
Beiträge: 51 |
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`)
); |
---
Ankauf leere Toner | Ankauf leere Tonerkartuschen
|
 Profil
E-Mail
Website
Editieren
Zitieren
|
raiserle
Mausakrobat
Beiträge: 172 |
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
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
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
Mausakrobat
Beiträge: 172 |
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
Editieren
Zitieren
|
subjective
Forenheld
Beiträge: 844 |
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
|