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?
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
Ik ben dit inderdaad al tegen gekomen, maar ik zal anders even laten zien wat ik niet snap...

Dit is het voorbeeld:
<?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));
?>

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:

<?php
$opdracht = SELECT * FROM portfolio_image WHERE portfolio_ID ='$_GET[portfolio_ID]' order by image,
mysql_real_escape_string($_GET[portfolio_ID]);
?>


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:
"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 [php]strintf[/php] 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:
<?php
$name = 'Jasper';
$age = 45;

echo sprintf(
// %s = string, %d = decimal = getal
'Hallo, ik ben %s en ik ben %d jaar oud.',
// de eerste plaats (%s) wordt 'Jasper'
$name,
// de tweede plaats (%d) wordt 45
$age
);
// in het totaal komt er nu 'Hallo, ik ben Jasper en ik ben 45 jaar oud.'
?>
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!
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.

<?php
$id_maxlengte = 2;
$id_lengte = strlen($_GET['id']);

if ($id_maxlengte < $id_lengte) {
// set to default
$_GET['id'] = 1;
}
?>

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.
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.
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:
<?php
$query = "SELECT foo FROM bar WHERE something='".(int) $_GET['portfolio_ID']."'";
?>
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.


Dat kan inderdaad. Kun je helemaal naar je eigen hand maken.
Gaat om het principe.

Veel plezier.

[size=xsmall]Toevoeging op 23/06/2012 10:51:21:[/size]

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.

Reageren