Probleem met opvragen variable
Hallo,
Ik ben sinds 2 jaar weer een beetje begonnen met PHP en loop nu vast.
Ik heb een login en upload systeem gemaakt (dit werkt).
Alleen nu bij het uitlezen kom ik er niet helemaal aan uit.
Dit is de website: www.lotteleemreijze.com/test/portfolio3.php
Nu heb ik bij de image slider zelf een getal aangegeven:
$opdracht = "SELECT * FROM portfolio_image WHERE portfolio_ID = '17' order by image";
Maar eigenlijk moet deze variabel zijn en worden doorgegeven door de thumbs daaronder. Nu weet ik alleen niet hoe ik dit moet doen. In de adresbalk geeft hij al wel het portfolio_ID mee wat bij de thumb hoort. Verder kom ik even niet.
Zou iemand mij hiermee kunnen helpen?
Ik ben sinds 2 jaar weer een beetje begonnen met PHP en loop nu vast.
Ik heb een login en upload systeem gemaakt (dit werkt).
Alleen nu bij het uitlezen kom ik er niet helemaal aan uit.
Dit is de website: www.lotteleemreijze.com/test/portfolio3.php
Nu heb ik bij de image slider zelf een getal aangegeven:
$opdracht = "SELECT * FROM portfolio_image WHERE portfolio_ID = '17' order by image";
Maar eigenlijk moet deze variabel zijn en worden doorgegeven door de thumbs daaronder. Nu weet ik alleen niet hoe ik dit moet doen. In de adresbalk geeft hij al wel het portfolio_ID mee wat bij de thumb hoort. Verder kom ik even niet.
Zou iemand mij hiermee kunnen helpen?
bedoel je dat er bijvoorbeeld in het adresbalk staat: en deze ID meegenomen moet worden in de SELECT query? Zo ja: .
Gewijzigd op 18/06/2012 23:08:11 door Maikel Haas
Hij doet het nu inderdaad, super bedankt!
Ik was al zo bezig:
$portfolio_ID=$_GET["portfolio_ID"];
En $portfolio zette ik dan daar op de plaats van '$_GET[portfolio_ID]'.
Na 2 jaar gaat het toch allemaal wat moeilijker als verwacht.
Dus heel erg bedankt!
Ik was al zo bezig:
$portfolio_ID=$_GET["portfolio_ID"];
En $portfolio zette ik dan daar op de plaats van '$_GET[portfolio_ID]'.
Na 2 jaar gaat het toch allemaal wat moeilijker als verwacht.
Dus heel erg bedankt!
Denk wel aan je beveiliging he...
Ozzie PHP op 18/06/2012 23:22:03:
Denk wel aan je beveiliging he...
Hoe bedoel je dat?
Ozzie bedoelt waarschijnlijk SQL-Injection.
deze kun je opvangen door mysql_real_escape_strings() in je query op te nemen.
deze kun je opvangen door mysql_real_escape_strings() in je query op te nemen.
Gewijzigd op 18/06/2012 23:51:23 door Frank WD
Nou, dat je niet zomaar een variabele in een query plaatst, maar dat je eerst even controleert of die variabele ook daadwerkelijk is wat jij verwacht. En dat je mysql injection tegengaat.
Dit:
mijnpagina.php?portfolio_ID=17
kan je heel makkelijk veranderen in:
mijnpagina.php?portfolio_ID=een_stukje_code_die_jouw_site_hackt
en jouw query wordt dan:
WHERE portfolio_ID ='een_stukje_code_die_jouw_site_hackt'
waarbij 'een_stukje_code_die_jouw_site_hackt' nu gewoon een stukje tekst is, maar waar in de praktijk hackers iets heel anders kunnen invoeren.
Dit:
mijnpagina.php?portfolio_ID=17
kan je heel makkelijk veranderen in:
mijnpagina.php?portfolio_ID=een_stukje_code_die_jouw_site_hackt
en jouw query wordt dan:
WHERE portfolio_ID ='een_stukje_code_die_jouw_site_hackt'
waarbij 'een_stukje_code_die_jouw_site_hackt' nu gewoon een stukje tekst is, maar waar in de praktijk hackers iets heel anders kunnen invoeren.
Aha bedankt, zover ben ik dus nog nooit gekomen...
Maar ik zal eens gaan kijken of ik dat ga snappen.
Heb net wat opgezocht op internet en lijkt me nog redelijk ingewikkeld.
Maar in ieder geval bedankt voor de tip!
Ik ga ermee aan de slag.
Maar ik zal eens gaan kijken of ik dat ga snappen.
Heb net wat opgezocht op internet en lijkt me nog redelijk ingewikkeld.
Maar in ieder geval bedankt voor de tip!
Ik ga ermee aan de slag.
Als t niet lukt kun je altijd hier je vraag stellen hoor ;)
Thnx! =) Ik kan de hulp goed gebruiken denk ik...
Maar ik zal het eerst zelf eens gaan proberen...
Maar ik zal het eerst zelf eens gaan proberen...
En als het toch een integer is (wat een id normaal gesproken is en in je voorbeeld ook zo is), dan moet je zorgen dat dat een integer is. Ten eerste dus de enkele quotes weglaten uit je query, die zijn alleen nodig voor strings, niet voor integers. Daarnaast je user input typecasten naar een string. Daarmee weet je zeker dat het in het juiste formaat is en dat je query geen probleem gaat krijgen en dat er geen sql injectie op dat punt mogelijk is. Dus:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$opdracht = "SELECT *
FROM portfolio_image
WHERE portfolio_ID = ".intval($_GET['portfolio_ID'])."
order by image";
?>
$opdracht = "SELECT *
FROM portfolio_image
WHERE portfolio_ID = ".intval($_GET['portfolio_ID'])."
order by image";
?>
Hoi,
Nou ik heb geprobeerd om mysql_real_escape_strings() te gebruiken.
Maar ik kom er dus niet aan uit.... =(
Ik heb ook op internet gezocht naar hoe ik hem moet gebruiken / en waar hij moet komen te staan.
Maar ik snap het dus niet...
Zouden jullie mij misschien weer kunnen helpen?
Groetjes
Nou ik heb geprobeerd om mysql_real_escape_strings() te gebruiken.
Maar ik kom er dus niet aan uit.... =(
Ik heb ook op internet gezocht naar hoe ik hem moet gebruiken / en waar hij moet komen te staan.
Maar ik snap het dus niet...
Zouden jullie mij misschien weer kunnen helpen?
Groetjes
Niet mysql_real_escape_strings(), maar mysql_real_escape_string(), dus zonder s aan het eind.
Lees dit eens en kijk eens of je er dan uitkomt?
http://nl.php.net/manual/en/function.mysql-real-escape-string.php
Lees dit eens en kijk eens of je er dan uitkomt?
http://nl.php.net/manual/en/function.mysql-real-escape-string.php
Ik ben dit inderdaad al tegen gekomen, maar ik zal anders even laten zien wat ik niet snap...
Dit is het voorbeeld:
In de query staat bij user en password %s, wat bedoelen ze hiermee?
En als ik naar het voorbeeld kijk dan zou het er bij mij zo uit komen te zien:
Dit is het voorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
OR die(mysql_error());
// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($user),
mysql_real_escape_string($password));
?>
In de query staat bij user en password %s, wat bedoelen ze hiermee?
En als ik naar het voorbeeld kijk dan zou het er bij mij zo uit komen te zien:
Code (php)
1
2
3
4
2
3
4
<?php
$opdracht = SELECT * FROM portfolio_image WHERE portfolio_ID ='$_GET[portfolio_ID]' order by image,
mysql_real_escape_string($_GET[portfolio_ID]);
?>
$opdracht = SELECT * FROM portfolio_image WHERE portfolio_ID ='$_GET[portfolio_ID]' order by image,
mysql_real_escape_string($_GET[portfolio_ID]);
?>
Quote:
En als ik naar het voorbeeld kijk dan zou het er bij mij zo uit komen te zien:
Nee, want de query is een string (een stukje tekst) en hoort dus tussen quotes (" of '). En ook protfolio_ID is een stukje tekst en dus een string en dus hoort ook dat tussen quotes
Tevens moet '$_GET[portfolio_ID]' dat weg. En daar moet je die mysql_real_escape_string($_GET[portfolio_ID]) neerzetten. (natuurlijk met punten ertussen). Dus zoiets:
Code (php)
1
"SELECT foo FROM bar WHERE something='".mysql_real_escape_string($_GET['portfolio_ID'])."'";
Als laatste wat doet die %s daar? Dat komt omdat ze de functie strintf gebruiken. Daarmee typ je een string en op sommige plaatsen in die string geef je met '%<type>' aan dat er iets hoort te staan. In dit geval %s de s staat voor string.
In de argumenten daarna van die functie kun je dan in volgorde de dingen plaatsen die erin horen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
Heel erg bedankt voor de hulp!
Ik moet nog heel veel leren zie ik zo maar weer...
Hij staat erin dus het zou nu beveiligd moeten zijn =)
Bedankt allemaal voor de tips!
Ik moet nog heel veel leren zie ik zo maar weer...
Hij staat erin dus het zou nu beveiligd moeten zijn =)
Bedankt allemaal voor de tips!
Wat betreft de _GET['id'] :
Mysql_real_escape geeft vertraging en het gaat alleen om ID.
Een portfolio ID heeft meestal maar 2 digits. Of je moet meer dan 99 portfolio items hebben.
De mysql_real_escape is overdreven.
Wanneer lengte langer is dan 2 digits klopt het niet
en dan wordt er een detault ID ingezet.
En in 2 digits kan er geen waardevol SQL-injectie uitgevoerd worden.
Zo min mogelijk vertragende factors gebruiken.
Mysql_real_escape geeft vertraging en het gaat alleen om ID.
Een portfolio ID heeft meestal maar 2 digits. Of je moet meer dan 99 portfolio items hebben.
De mysql_real_escape is overdreven.
Code (php)
Wanneer lengte langer is dan 2 digits klopt het niet
en dan wordt er een detault ID ingezet.
En in 2 digits kan er geen waardevol SQL-injectie uitgevoerd worden.
Zo min mogelijk vertragende factors gebruiken.
Gewijzigd op 22/06/2012 18:50:22 door B Polak
Dan hoef je jouw code ook niet te gebruiken ;-)
@B Polak: Als je zo snel mogelijk wilt programmeren, waarom dan variabelen aanmaken op regel 2 en 3? Dat kan toch allemaal in 1x op regel 5? Je controleert nergens of $_GET['id'] een getal is.
Controleer of id een getal is _en_ of het id bestaat. Zo niet; toon default pagina.
Controleer of id een getal is _en_ of het id bestaat. Zo niet; toon default pagina.
En ook wat als je nou een grotere website krijgt en Ids krijgt over de 100? Dan moet je weer verder gaan puzzelen.
Nee, deze micro optimalisatie is echt overdone. Optimalisatie is in PHP bijna niet nodig, behalve als je 1000x gaat lopen oid. In MySQL is het daarin tegen wel handig.
Tevens ben ik het wel op 1 puntje met je eens: De id is een integer en dus geen string, geen mysql_real_escape_string gebruiken dus, maar typecasten:
Nee, deze micro optimalisatie is echt overdone. Optimalisatie is in PHP bijna niet nodig, behalve als je 1000x gaat lopen oid. In MySQL is het daarin tegen wel handig.
Tevens ben ik het wel op 1 puntje met je eens: De id is een integer en dus geen string, geen mysql_real_escape_string gebruiken dus, maar typecasten:
Obelix en Idefix op 23/06/2012 10:38:17:
@B Polak: Als je zo snel mogelijk wilt programmeren, waarom dan variabelen aanmaken op regel 2 en 3? Dat kan toch allemaal in 1x op regel 5? Je controleert nergens of $_GET['id'] een getal is.
Controleer of id een getal is _en_ of het id bestaat. Zo niet; toon default pagina.
Controleer of id een getal is _en_ of het id bestaat. Zo niet; toon default pagina.
Dat kan inderdaad. Kun je helemaal naar je eigen hand maken.
Gaat om het principe.
Veel plezier.
Toevoeging op 23/06/2012 10:51:21:
Wouter J op 23/06/2012 10:43:41:
En ook wat als je nou een grotere website krijgt en Ids krijgt over de 100? Dan moet je weer verder gaan puzzelen.
Zijn dan hooguit 3 of 4 digits.
Kun jij een volwaardig SQL injectie plaatsen binnen 3 of 4 digits?
Wanneer het meer dan 5 digits wordt, snap ik wel dat het niet meer rendabel is.
Maar we hadden het nu over portfolio ID.




