Probleem met opvragen variable
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?
en deze ID meegenomen moet worden in de SELECT query? Zo ja: .
bedoel je dat er bijvoorbeeld in het adresbalk staat: Gewijzigd op 18/06/2012 23:08:11 door Maikel Haas
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?
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
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.
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 ;)
Maar ik zal het eerst zelf eens gaan proberen...
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";
?>
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
Lees dit eens en kijk eens of je er dan uitkomt?
http://nl.php.net/manual/en/function.mysql-real-escape-string.php
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
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!
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 ;-)
Controleer of id een getal is _en_ of het id bestaat. Zo niet; toon default pagina.
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.