04. februar 2006 - 22:44Der er
21 kommentarer og 1 løsning
liste over ALLE reseverede ord
Jeg kunne godt tænke mig en liste over ALLE reseverede ord i mysql, skrevet herind med et komma i mellem hvert ord. Må gerne være i alfabetisk rækkefølge
fx sådan her:
aaa,bbb,ccc,ddd,eee,fff
_________ Med reseverede ord mener jeg INSERT,COUNT,SELECT,CREATE,DELETE,UPDATE,JOIN,ADD,BY,WHERE osv.
Jeg vil bruge det til at lave en funktion som gør at folk ikke kan misbruge mine tekst felter på den måde at de skrive nogle mysql koder så de ødelægger min database. Derfor banner jeg dem samt andre ting hver gang de skriver nogle af de ord som jeg vil medtage fra den der liste :-)
og hvad er din defination af at håndtere form data korrekt? :)
Synes godt om
Slettet bruger
04. februar 2006 - 23:36#7
Checke om felterne indeholder det de skal: if (!eregi('^[a-z0-9æøå]+$', $_POST['felt1'])) { echo "Fejl, må kun indeholde bogstaver og tal!!"; } else { echo "Dit felt er korrekt udfyldt."; }
Checke om magic quotes er slået til på dit webhotel. Hvis ikke, så bruge magic_quotes på hvert felt: if (!get_magic_quotes_gpc()) { $felt1_ok = addslashes($_POST['felt1']; }
Lave alle forespørgsler, updates og inserts med "gnyffer" omkring: $sql = ("INSERT INTO `test_db` SET felt1 = '$felt1_ok'"); $query = mysql_query($sql) or die (mysql_error());
Jeg er ikke en haj til sikkerhed, men det er i hvertfald nogle af de elementer jeg baserer min sikkerhed på.
altså, du kan jo godt bruge "reserverede" ord i en streng:
SELECT * FROM brugere WHERE username LIKE "SELECT FROM WHERE LIKE";
Altså det er der jo ingen problemer i. Selvfølgelig kan man skrive en tekst i databasen, der indeholder et reserveret ord i SQL. Og alt andet ville da også være mærkeligt :)
Jo, men hør.. Jeg har allerede gjort præcis som barklund sagde i alle mine dokumenter. Det ved jeg nemlig i forvejen. :-)
Jeg har dog læst at hvis man virkelig vil sikre sig, så skal man udover det barklund skrev OGSÅ tjekke for alt input som kommer direkte fra brugeren - også selvom man bruger mysql_real_escape_string(); Derfor vil jeg gerne bruge det du skrev kfisker! :)
Har du nogensinde set et forum, hvor man ikke kan skrive insert? eller from? Det lyder meget mærkeligt - og det er løgn. Hvor har du læst det? For så vil jeg straks søge information om, hvordan de dog er kommet frem til den slags tåbeligheder :)
mysql_real_escape_string er netop at tjekke input fra brugeren så han under ingen omstændigheder kan få databasen til at gøre andet, end hvad den skal.
uuh kan sku ikke finde dem alle, men nogle af dem er her:
jakobdo,polle007
argumentationen er bla. at mysql_real_escape_string ikke beskytter mod injection. Man skal bla. tjekke for om ens variabel indeholder det den skal (tal, bogstaver, tegn)
Hvilket jeg er helt enig i. Men du kan aldrig nogen sinde injecte noget, hvis du bruger mysql_real_escape_string og indsætter i apostroffer eller quotes.
Kun hvis det er simple tal eller andet, der ikke er escape't i SQL-sætningen, som for eksempel i polle007's eksempel herover. Der skal du validere, at $id er et tal. Den slags laver man nydeligt med sprintf eller et databaseabstraktionslag med placeholders - fx PEAR.
Men du har næppe hørt hverken polle007 eller jacobdo sige, at man ikke må indsætte en streng med reserverede ord i - det ville godt nok være mærkeligt :)
Synes du desuden selv, at det giver mening? Altså at man med mysql ikke kan lave et sikkert forum, hvor man kan skrive "create"? Så tåbelig er mysql heldigvis ikke :)
Jakobdo og polle007 lyder til at vide hvad de snakker om gennem erfaring, og jeg stoler trykt på hvad de fortæller mig. Det var da gode nyheder, så dvs jeg er beskyttet mod injections? Jeg har både tjekket for om alt er tal eller bogstaver. Jeg har brugt mysql_real_escape_string();. Jeg har brugt quotes om alle variablerne i query sætningerne.
Hvad mere kan jeg så gøre for at sikre selve systemet, fx brugersystemet? lige nu bruger jeg kun md5. Kender ikke andre ting.
Altså, du behøver ikke sætte variabler i quotes, hvis du er sikre på, at de indeholder, hvad de indeholder. Andre DBMS'er laver faktisk fejl, hvis man indsætter et tal i quotes, hvor der skal være et tal. Og hvis du ved, at $id er et tal (for eksempel med intval(), sprintf(), (int)-cast eller noget fjerde), så kan du roligt skrive "WHERE id = $id".
Grundlæggende skal du blot sikre dig, at
* ints er ints * strenge er escape't med mysql_real_escape_string
Så er du 'home safe' lige hvad injections angår.
Der kommer selvfølgelig andre ting i spil, hvis du indsætter datoer som brugeren indtaster eller noget fjerde, hvor du skal validere input yderligere.
Og der kan være mange andre ting php-relateret, som der kan være problemer med :)
Jeg har faktisk arbejdet som webmaster for et internet-firma, hvis søgefunktion på hjemmesiden ikke tillod at man brugte reserverede ord i SQL Server... Det såkaldt professionelle firma der havde udviklet siden fik godt nok også på puklen for den bommert! Man kan ikke udelukke ord som BY, SORT, SET, INT osv.... De indgår jo i mange sammenhænge og i øvrigt også som del af andre ord. Hvilket der slet ikke var taget højde for i det system jeg omtaler. Bambus-programmering i mine øjne... Men der findes altså også dårlige programmører i den virkelige verden ;)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.