Avatar billede udvikler Nybegynder
04. februar 2006 - 22:44 Der 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.
Avatar billede fixxxer Nybegynder
04. februar 2006 - 22:58 #1
Avatar billede fixxxer Nybegynder
04. februar 2006 - 22:59 #2
Af ren nysgerighed, hvad dælen vil du bruge det til? Skal du skrive din egen highlighter til SQL?
Avatar billede udvikler Nybegynder
04. februar 2006 - 23:09 #3
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 :-)
Avatar billede udvikler Nybegynder
04. februar 2006 - 23:13 #4
og læg et svar tak
Avatar billede Slettet bruger
04. februar 2006 - 23:19 #5
Heh, så dine brugere må ikke kunne skrive på hverken dansk eller engelsk???

Flere af ordene kan forekomme både på dansk og engelsk ved normal sprogbrug.

Du ville få mere ud af at kode dine sql-sætninger ordentlig, samt håndtere data fra form-felter korrekt.

Så vil det være fuldstændig ligegyldigt hvad folk skriver i dine tekst-felter.
Avatar billede udvikler Nybegynder
04. februar 2006 - 23:26 #6
og hvad er din defination af at håndtere form data korrekt? :)
Avatar billede 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å.
Avatar billede barklund Nybegynder
05. februar 2006 - 00:02 #8
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 :)
Avatar billede barklund Nybegynder
05. februar 2006 - 00:05 #9
Det, som man skal passe på med er, hvis du blot indsætte post-data direkte som:

mysql_query("SELECT * FROM brugere WHERE username LIKE '$POST[username]'");

Så kan jeg jo skrive:

foo'

Og så vil det blive indsat til sql-sætningen;

mysql_query("SELECT * FROM brugere WHERE username LIKE 'foo''");

Og så er der jo en fejl med den ekstra '. Derfor skal du bare bruge mysql_real_escape_string inden du indsætter tekst som:

mysql_query("SELECT * FROM brugere WHERE username LIKE '´" . mysql_real_escape_string($POST['username']). "'");

Så er der ingen problemer :)
Avatar billede fixxxer Nybegynder
05. februar 2006 - 10:38 #10
Giv hellere pointene til barklund, det er en langt mere holdbar løsning end at filtrer nogle ganske almindelige ord fra dine tekstfelter..
Avatar billede udvikler Nybegynder
05. februar 2006 - 12:48 #11
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! :)

Læg et svar! :)
Avatar billede barklund Nybegynder
05. februar 2006 - 13:03 #12
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.

--
Morten Barklund
Avatar billede udvikler Nybegynder
05. februar 2006 - 14:19 #13
Der er nogle brugere herinde fra som siger det stik modsatte med hensyn til mysql_real_escape_string :-)

Hvem skal jeg dog stole på? hehe
Avatar billede barklund Nybegynder
05. februar 2006 - 15:02 #14
Hvem? Og med hvilke argumenter? :)
Avatar billede udvikler Nybegynder
05. februar 2006 - 15:14 #15
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)
Avatar billede polle007 Nybegynder
05. februar 2006 - 15:17 #16
Om den beskytter eller ej, kommer an på sammenhængen. Der hvor jeg sagde den ikke beskyttede, var da satte du ikke benyttede apostroffer...

$id = mysql_real_escape_string($id);
$sql = "select * from tabel where id=$id";

i sådan et tilfælde beskytter den ikke. Men det gør den her:

$sql = "select * from tabel where id='$id'";
Avatar billede barklund Nybegynder
05. februar 2006 - 15:25 #17
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 :)

--
Morten Barklund
Avatar billede udvikler Nybegynder
05. februar 2006 - 15:29 #18
Nej nej, det har jeg skam heller ikke sagt ;)

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.
Avatar billede Slettet bruger
05. februar 2006 - 15:31 #19
Svar :)
Avatar billede barklund Nybegynder
05. februar 2006 - 15:37 #20
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 :)

--
Morten Barklund
Avatar billede udvikler Nybegynder
05. februar 2006 - 15:49 #21
Tak for svarene indtil videre

har lige opdateret pointene til 30, vil nemlig gerne have at denne tråd forsætter lidt endnu! :-)
Avatar billede muddi Praktikant
07. februar 2006 - 00:07 #22
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 ;)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester