Avatar billede Mik2000 Professor
10. november 2019 - 13:40 Der er 8 kommentarer og
1 løsning

PDO Prepare på feltnavn

Hej

Jeg benytter PDO og laver binds, prepare osv. for at undgå SQL injections

I nogle enkelte tilfælde har jeg dog være nødt til at medsende f.eks. et feltnavn, en limit eller lign.

Ved limit kan jeg tjekke det er et tal og på den måde sikre det er i orden
Ved felter kan har jeg kunne tjekke op mod et array

Nu skal jeg dog sende et felt og et tabelnavn med hvor det vil være super bøvlet at lave et array over alle felter og vedligeholde det.

Hvordan sikrer man at der ikke kan laves sql injections i de ting, da jeg jo ikke kan binde dem?
Avatar billede erikjacobsen Ekspert
10. november 2019 - 14:23 #1
Lad være med at gøre det på den måde. Det tyder på at du ikke har lavet strukturen på dine tabeller ordentligt.

Det lyder lidt som Excel-syndromet, hvor man gør li'som man ville gøre i et regneark med mange kolonner. Dvs. man tænker vandret, hvor man i stedet for skal gøre det "SQLsK" og tænke lodret.

Eksempel:
Man skal finde ud af noget for hver uge, og laver i regnearket kolonenr: Uge41, Uge42, Uge43, osv. Det skal man ikke i en database.

I databasen skal man hellere lave en tabel med et felt, der hedder uge, og så i de relevante rækker skrive 41, 42, 43, osv.

(Og ja, et ugenummer skal nok ikke stå uden sit årstal, så ovenstående er bare en skitse)
Avatar billede arne_v Ekspert
10. november 2019 - 14:53 #2
Du kan godt bede MySQL om en liste over alle felter i en tabel (og om en liste over all tabeller i en database).

Og du kan saa checke op mod den liste. Om det er et godt design er et andet spoergsmaal.
Avatar billede Mik2000 Professor
11. november 2019 - 12:56 #3
erikjacobsen
Det er det ikke - det er mere for at kunne lave en metode i en class som er lidt fleksibel, så man kan medsende feltnavne mv.
Problemet er bare at det i nogle tilfælde giver meningen hvis de bliver sendt med via AJAX hvilket jo giver brugeren en mulighed for at manipulerer navnene

arne_v
Ja det kan jeg godt se er muligt - men tænker også det er meget at gøre ud af det hvis der fandtes en metode til at sikre det input

Omkring struktur, så tænker ikke det har så meget med database strukturen at gøre, da jeg jo sagtens kan lave tingene uden - det var blot for at lave en metode der f.eks. kunne styre rækkerfølge i mange tabeller da navngivningen på kolloner er den samme bortset fra et prefix

Dermed kunne man jo medsende prefix og tabelnavn til en metode som så kunne lave order ligegyldigt hvilken ting man var på
Men prefix og tabel udgør jo en trussel da de kommer ind i sql sætningen og ikke kan laves prepare på
Avatar billede Mik2000 Professor
11. november 2019 - 12:58 #4
I samme ombæring er der lavet så man kan sende et where array med hvor key er feltnavn og value er værdi
Der kan det jo være alle felter.
value bliver bindet så der er ikke noget, men key skal igen ind i SQL sætningen
Avatar billede Mik2000 Professor
11. november 2019 - 13:01 #5
Så konkret simplificeret eksempel

TabelA
aId, aNavn, aType, aOrder

Det man kunne medsende eksempelvis
$table = "TabelA"
$prefix = "a"
$where = ["aType"=>1]

Her kommer $table, $prefix og key i $where jo til at være i SQL, mens 1 i $where kan blive bindet

På den måde vil den også virke på TabelB hvor der måske ikke er where og prefix er B
Avatar billede arne_v Ekspert
12. november 2019 - 01:16 #6
Jeg kan se to muligheder:

1) Auto generer liste med gyldige tabel- og feltnavne og check mode den.

2) Check om input matcher regex [A-Za-z0-9]+ for at forhindre SQL injection og saa er kommer der en gejl ved ikke eksisterende tabeller/felter.

PS: Ja - det er muligt at bruge navne som ikke matcher den regex, men alle gode navne matcher den regex!!
Avatar billede Mik2000 Professor
12. november 2019 - 20:26 #7
Nåh ja 2'eren burde vel egentlig være sikker nok - og alle vores navne matcher det :)
God ide :)
Avatar billede arne_v Ekspert
12. november 2019 - 20:41 #8
Muligvis er [A-Za-z][A-Za-z0-9]* mere korrekt (jeg tror ikke at navne maa starte med et ciffer). Man kan ogsaa diskuetere om man vil tillade underscore eller ej.

Men pragmatisk loesning.

Prepared/parametre er virkeligt godt.

Men der er nogle smaa hjoerner. Tabel og felt navne er et. Et andet er er IN med variabelt antal vaerdier.
Avatar billede Mik2000 Professor
12. november 2019 - 22:43 #9
Jeg bruger camelCase hele vejen så i princippet kan det klares med bogstaver og tal (og i princippet nok med bogstaver, men tallene er smart at have med) :)

Mange tak for hjælpen endnu engang :)
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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