Går det att använda värdet på ORDER BY som en placeholder?

  • Författare
  • Meddelande

desk15

html-guru

  • Inlägg: 68
  • Blev medlem: 03 sep 2015, 11:28

Går det att använda värdet på ORDER BY som en placeholder?

Inlägg24 dec 2015, 23:34

Tja,

Jag försöker skriva min Movie klass som kommer hantera alla filmer.
Jag har gjort en enkel metod som hämtar alla filmer från databaser men det funkade inte som jag ville.
Om jag vill t.ex. hämta alla filmer och sortera de efter titeln så kommer min metod skapa en SQL statement så här:
Kod: Markera allt
"SELECT * FROM VMovies ORDER BY ? LIMIT 18446744073709551615"


Jag är inte hundra men jag tror att MySQL vill inte ha värdet på ORDER BY som en placeholder.
När jag kör detta SQL statement så får jag inget error och får osorterade filmer.

Om jag testar att skriva min metod så den istället kör detta istället:
Kod: Markera allt
"SELECT * FROM VMovies ORDER BY title LIMIT 18446744073709551615"


Så kommer det funka.
Problemet är att metoden kommer senare få ORDER BY värdet genom $_GET.
Om jag då kan inte använda placeholder så måste jag validera värdet genom att kontrollera om värdet
är antingen någon av dessa kolumner i tabellen.
Finns det inte ett sätt att ha en placeholder för ORDER BY för jag vill inte helst inte hårdkoda för då blir det jobbigt om man lägger till en kolumn i tabellen i framtiden.



En till fråga:
Om man kan då inte använda placeholder, är det säkert att använda preg_replace för att ta bort alla ";" på värdet i ORDER BY för att undvika luriga personer som försöker ta bort min tabell eller något.

Exempel på vad jag menar:
Kod: Markera allt
$sortby = $_GET["sortby"]; // Innehåller "title; DROP TABLE Movies;"
preg_replace(";", "", $sortby); // Ta bort alla ";"

$db->execute("SELECT * FROM VMovies ORDER BY $sortby");
// SELECT * FROM VMovies ORDER BY title DROP TABLE Movies

// Ger error för att det blev syntax fel istället för att ta bort min tabell.


Mvh Dennis Skoko
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rick Cook
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10972
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Går det att använda värdet på ORDER BY som en placeholde

Inlägg25 dec 2015, 00:30

Som placeholder? Nej.

Här är ett exempel som fungerar och validerar inkommande, kikat på det?
http://dbwebb.se/kunskap/kom-igang-med- ... ql#sortera
...
..:
.... /mos

desk15

html-guru

  • Inlägg: 68
  • Blev medlem: 03 sep 2015, 11:28

Re: Går det att använda värdet på ORDER BY som en placeholde

Inlägg25 dec 2015, 01:21

Jag har kikat på det men vill helst inte hårdkoda. Vill att man ska inte behöva ändra valideringen varje gång man ändrar databasen.

Kan man undvika SQL injections genom att använda preg_replace för att ta bort alla ";" på de $_GET variablerna. På så sätt kommer SQL statement ge en error istället för att t.ex. mina tabeller.

T.ex istället för:
Kod: Markera allt
// Check that incoming is valid
in_array($orderby, array('id', 'title', 'year')) or die('Check: Not valid column.');
in_array($order, array('asc', 'desc')) or die('Check: Not valid sort order.');


så gör man så här:
Kod: Markera allt
$orderby = preg_replace(";", "", $orderby);
$order = preg_replace(";", "", $order);


På så sätt kan man inte köra flera SQL statements.
Men kan man lita på detta eller kommer det finnas andra sätt att hacka sig in?

Mvh
Dennis Skoko
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rick Cook
Användarvisningsbild

mos

dbwebb

  • Inlägg: 10972
  • Blev medlem: 10 nov 2011, 09:52
  • Ort: Ronneby / Bankeryd

Re: Går det att använda värdet på ORDER BY som en placeholde

Inlägg25 dec 2015, 02:20

Jag hade börjat med att läsa igenom dessa två inlägg:
http://stackoverflow.com/questions/2542 ... -statement
http://stackoverflow.com/questions/1061 ... aceholders

Det ser ut som vissa delar kan lösas med placeholder.

Sen hade jag kikat igenom manualen för att se om jag kunde klura ut vilka möjligheter jag har. Alltid ett bra tips.

Men, det ser svårt ut att lösa namnet på de kolumner som kan sorteras via. Jag hade undvikit preg_replace och istället försökt att antingen skicka in en array med giltiga värden på kolumnnamnen, eller med preg_match, kontrollera att värdet på orderby är ett kolumnamn genom att kontrollera att det bara innehåller tecken som kan forma ett kolumnnamn.

I vissa databaser kan man läsa in namnen på kolumnerna och jämföra så att värdet är ett giltigt kolumnnamn. Det är också en variant. Men som du märker blir det mer kod att skriva så denna biten är lite lurig att göra flexibel.
...
..:
.... /mos

desk15

html-guru

  • Inlägg: 68
  • Blev medlem: 03 sep 2015, 11:28

Re: Går det att använda värdet på ORDER BY som en placeholde

Inlägg25 dec 2015, 14:43

Jag leta runt på internet och hitta:
http://dev.mysql.com/doc/refman/5.0/en/columns-table.html

Jag kan nog använda den för att hämta alla namn på kolumnerna men just nu använder jag in_array() för att validera.
Är det så jag har tid över på projektet så kan jag försöka göra det mer flexibelt.

Tack för hjälpen
"Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning." - Rick Cook

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 17 gäster