Probleem met opvragen variable

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Lotte leemreijze

lotte leemreijze

18/06/2012 23:02:41
Quote Anchor link
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?
 
PHP hulp

PHP hulp

26/12/2024 06:57:20
 
Maikel Haas

Maikel Haas

18/06/2012 23:07:46
Quote Anchor link
bedoel je dat er bijvoorbeeld in het adresbalk staat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
mijnpagina.php?portfolio_ID=17
en deze ID meegenomen moet worden in de SELECT query? Zo ja:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE portfolio_ID ='$_GET[portfolio_ID]'
.
Gewijzigd op 18/06/2012 23:08:11 door Maikel Haas
 
Lotte leemreijze

lotte leemreijze

18/06/2012 23:14:45
Quote Anchor link
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!
 
Ozzie PHP

Ozzie PHP

18/06/2012 23:22:03
Quote Anchor link
Denk wel aan je beveiliging he...
 
Lotte leemreijze

lotte leemreijze

18/06/2012 23:25:03
Quote Anchor link
Ozzie PHP op 18/06/2012 23:22:03:
Denk wel aan je beveiliging he...


Hoe bedoel je dat?
 
Frank WD

Frank WD

18/06/2012 23:48:31
Quote Anchor link
Ozzie bedoelt waarschijnlijk SQL-Injection.
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
 
Ozzie PHP

Ozzie PHP

18/06/2012 23:49:03
Quote Anchor link
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.
 
Lotte leemreijze

lotte leemreijze

19/06/2012 00:02:04
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

19/06/2012 00:05:06
Quote Anchor link
Als t niet lukt kun je altijd hier je vraag stellen hoor ;)
 
Lotte leemreijze

lotte leemreijze

19/06/2012 10:19:25
Quote Anchor link
Thnx! =) Ik kan de hulp goed gebruiken denk ik...
Maar ik zal het eerst zelf eens gaan proberen...
 
Erwin H

Erwin H

19/06/2012 10:24:39
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$opdracht
= "SELECT *
             FROM portfolio_image
             WHERE portfolio_ID = "
.intval($_GET['portfolio_ID'])."
             order by image"
;
?>
 
Lotte leemreijze

lotte leemreijze

21/06/2012 08:51:56
Quote Anchor link
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
 
Ozzie PHP

Ozzie PHP

21/06/2012 08:54:55
Quote Anchor link
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
 
Lotte leemreijze

lotte leemreijze

21/06/2012 09:14:47
Quote Anchor link
Ik ben dit inderdaad al tegen gekomen, maar ik zal anders even laten zien wat ik niet snap...

Dit is het voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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));
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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]);
?>
 
Wouter J

Wouter J

21/06/2012 09:24:56
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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.'
?>
 
Lotte leemreijze

lotte leemreijze

22/06/2012 15:57:39
Quote Anchor link
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!
 
B Polak

B Polak

22/06/2012 18:49:02
Quote Anchor link
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.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?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.
Gewijzigd op 22/06/2012 18:50:22 door B Polak
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

22/06/2012 19:12:56
Quote Anchor link
Dan hoef je jouw code ook niet te gebruiken ;-)
 
Obelix Idefix

Obelix Idefix

23/06/2012 10:38:17
Quote Anchor link
@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.
 
Wouter J

Wouter J

23/06/2012 10:43:41
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$query
= "SELECT foo FROM bar WHERE something='".(int) $_GET['portfolio_ID']."'";
?>
 
B Polak

B Polak

23/06/2012 10:45:57
Quote Anchor link
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.

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.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.