Du tænker at 'table' i dit eksempel kunne være et brugervalgt?
Jeg tror det er vigtigt et skelne mellem validering og escaping. Escaping er at du vil indsætte data som er iorden, men vil undgå at det bliver misforstået af databasen pga. symboler. Validering er at det data som du har fået er korrekt struktureret.
Så hvis jeg skriver i 'Om mig' feltet på din hjemmeside følgende:
; DROP DATABASE accountingSå kan det f.eks. godt blive valideret, det er en gyldig tekststreng under en max længde. Dermed er det ikke en 'forbudt' streng, men for at indsætte den i databasen skal den escapes. Samme streng er derimod forbudt som et tabelnavn og kan i denne situation ikke valideres.
For selve escaping kan du bruge:
http://php.net/manual/en/function.mysql-real-escape-string.php hvis det er rent mysql.
Det lyder som om at det 'blot' er valideringen du mangler før du overvejer at indsætte det i databasen. Lad os sige at i din form kan man vælge enten Fakturaer med value table_faktura eller Personer med value table_person. Så når du får POST data fra formen er den enten $_POST['table'] = 'table_faktura' eller $POST['table'] = 'table_person'. Hvis nogen prøver at omgå vil den f.eks. være
$_POST['table'] = '; DELETE * FROM table_person'
Hvilket ikke er en gyldig table værdi. Så løsningen på det problem kunne være at have en whitelist over gyldige tabeller:
in_array($_POST['table'], array('table_faktura', 'table_person'), true)
Og hvis dette udtryk er sandt, er den sikker at bruge i din SQL streng som tabelnavn.
Men som Ronny siger så er PDO en nemmere måde end manuelt at kalde real_escape_string.
Indlæg senest redigeret d. 18.02.2017 09:56 af Bruger #14645