[PHP] variabele in URL werkt niet

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hallo medetweakereraars,

Ik ben bezig met een website, en ik ben tegen een probleem aangelopen. Het gaat om dit deel van het script. Het moet stellen welke pagina moet worden gegenereerd.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
if (isset($pagina)) {
include "connect.php";
$query = "SELECT `cat` FROM `hoofdtekst` WHERE `url` = '$pagina'";
$sql = mysql_query($query);
$cat = mysql_fetch_object($sql);
$url = "$pagina";
}
else
{ 
$cat = "Home";
$url = "home";
} ?>


Ik heb de volgende url:
code:
1
http://<snipped_ip>/lp/index.php?pagina=*


Het sterretje geeft de waarde van de variabele aan.
Het probleem is nu standaard nu stelt dat de variabele $pagina niet is gespecificeerd, terwijl dat toch wel zo is omdat dat in de url gebeurt. Weet iemand waardoor dit komt?

Alvast bedankt.

[ Voor 1% gewijzigd door een moderator op 26-02-2009 19:59 . Reden: IP even uit de url gehaald ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
http://nl3.php.net/register_globals
http://en.wikibooks.org/w...ming:PHP:Register_Globals

En als we toch bezig zijn: Wikipedia: SQL injection

Dus in dat kleine beetje code zitten al 2(!!) grote security risks ;) Ik ben dus maar even zo vrij geweest je IP uit de URL te halen voor iemand je DB dropped ;) :D

[ Voor 96% gewijzigd door RobIII op 26-02-2009 19:59 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Morax
  • Registratie: Mei 2002
  • Laatst online: 20:32
Op de betreffende server staat waarschijnlijk register_globals uitgeschakeld.

En als tip: zoek ook meteen even op SQL injectie ;)

Edit:
doh RobIII, net te laat ;(

[ Voor 7% gewijzigd door Morax op 26-02-2009 19:56 ]

What do you mean I have no life? I am a gamer, I got millions!


  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 21:30

Sebazzz

3dp

En lees dus ook na waarom je geen reg_globals moet gebruiken ;) Grootste fout in de ontwikkeling van PHP geweest.

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Verwijderd

Topicstarter
Heel erg bedankt allemaal! Ik heb alles gelezen en ik schrok er wel van moet ik zeggen. Maar goed dat register_globals nu nog uit staat.

Ik heb nu dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
include "connect.php";
if (!isset($pagina)) {
if ($pagina == mysql_fetch_object(mysql_query("SELECT `url` FROM `hoofdtekst` WHERE `cat` = 'Home'"))) {
$hackerpreventie = mysql_real_escape_string($pagina);
$pagina2 = $hackerpreventie;
$query_start = "SELECT `cat` FROM `hoofdtekst` WHERE `url` = '$pagina2'";
$sql_start = mysql_query($query_start);
$cat = mysql_fetch_object($sql_start);
$url = "$pagina";
}
else
{ 
if ($pagina == mysql_fetch_object(mysql_query("SELECT `url` FROM `hoofdtekst` WHERE `cat` = 'Wie zijn wij?'"))) {
$hackerpreventie = mysql_real_escape_string($pagina);
$pagina2 = $hackerpreventie;
$query_start = "SELECT `cat` FROM `hoofdtekst` WHERE `url` = '$pagina2'";
$sql_start = mysql_query($query_start);
$cat = mysql_fetch_object($sql_start);
$url = "$pagina";
}
else
{ 
if ($pagina == mysql_fetch_object(mysql_query("SELECT `url` FROM `hoofdtekst` WHERE `cat` = 'Wat doen wij?'"))) {
$hackerpreventie = mysql_real_escape_string($pagina);
$pagina2 = $hackerpreventie;
$query_start = "SELECT `cat` FROM `hoofdtekst` WHERE `url` = '$pagina2'";
$sql_start = mysql_query($query_start);
$cat = mysql_fetch_object($sql_start);
$url = "$pagina";
}
else
{ 
if ($pagina == mysql_fetch_object(mysql_query("SELECT `url` FROM `hoofdtekst` WHERE `cat` = 'Acties'"))) {
$hackerpreventie = mysql_real_escape_string($pagina);
$pagina2 = $hackerpreventie;
$query_start = "SELECT `cat` FROM `hoofdtekst` WHERE `url` = '$pagina2'";
$sql_start = mysql_query($query_start);
$cat = mysql_fetch_object($sql_start);
$url = "$pagina";
}
else
{ 
if ($pagina == mysql_fetch_object(mysql_query("SELECT `url` FROM `hoofdtekst` WHERE `cat` = 'Fotos & Videos'"))) {
$hackerpreventie = mysql_real_escape_string($pagina);
$pagina2 = $hackerpreventie;
$query_start = "SELECT `cat` FROM `hoofdtekst` WHERE `url` = '$pagina2'";
$sql_start = mysql_query($query_start);
$cat = mysql_fetch_object($sql_start);
$url = "$pagina";
}
else
{ 
if ($pagina == mysql_fetch_object(mysql_query("SELECT `url` FROM `hoofdtekst` WHERE `cat` = 'Gastenboek'"))) {
$hackerpreventie = mysql_real_escape_string($pagina);
$pagina2 = $hackerpreventie;
$query_start = "SELECT `cat` FROM `hoofdtekst` WHERE `url` = '$pagina2'";
$sql_start = mysql_query($query_start);
$cat = mysql_fetch_object($sql_start);
$url = "$pagina";
}
else
{ 
if ($pagina == mysql_fetch_object(mysql_query("SELECT `url` FROM `hoofdtekst` WHERE `cat` = 'Contact'"))) {
$hackerpreventie = mysql_real_escape_string($pagina);
$pagina2 = $hackerpreventie;
$query_start = "SELECT `cat` FROM `hoofdtekst` WHERE `url` = '$pagina2'";
$sql_start = mysql_query($query_start);
$cat = mysql_fetch_object($sql_start);
$url = "$pagina";
}
else
{ 
// Niet gelegitimeerde invoer, fallback naar home pagina
$pagina = "0"
$url = "home";
$cat = "Home";
}
}}}}}}}
else {
echo "Niks aan de hand!";
}
 ?>


Ik heb nu iets gedaan tegen die SQL-injectie, maar hoe kan ik het laten werken, zonder dat ik register_globals aan hoef te zetten?

En ja, deze code is veel te omslachtig, maar zo weet ik eventjes zeker dat ik het goed doe :P

  • harrald
  • Registratie: September 2005
  • Laatst online: 16-09 08:44
Zoek eens op wat een functie is en hoe je daarmee je code kan inkorten ;)
(een switch statement is mischien ook nog wel een leuke google term.)

[ Voor 32% gewijzigd door harrald op 26-02-2009 21:12 ]


  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

harrald schreef op donderdag 26 februari 2009 @ 21:10:
(een switch statement is mischien ook nog wel een leuke google term.)
Wat is het verschil met verschillende if-lussen die doorlopen worden, of een switch te gebruiken? :? Qua performance scheelt het niets.

Verwijderd

Topicstarter
harrald schreef op donderdag 26 februari 2009 @ 21:10:
Zoek eens op wat een functie is en hoe je daarmee je code kan inkorten ;)
(een switch statement is mischien ook nog wel een leuke google term.)
Badankt :P , ik weet wat een functie is. Ik maak het straks wel mooier, maar het gaat me er nu om dat ik het werkend krijg.

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:26
In plaats van $var moet je $_GET[ 'var' ] gebruiken. Let ook even op de quotes, die worden nog wel eens weggelaten en afhankelijk van je instellingen wil PHP dat wel accepteren, totdat je met onvoorspelbaar gedrag te kampen krijgt. $_GET is een bijzondere, gereserveerde variabele die overal bereikbaar is.

En ga een echte cursus PHP volgen, want als je zo doorgaat zal je nog vaak je hoofd stoten. Er kan erg veel foutgaan wat je niet direct in de gaten hebt. Ik ga nu niet allemaal in op de dingen die beter kunnen, als je zelf meer van PHP te weten komt ontdek je dat wel.
GJtje schreef op donderdag 26 februari 2009 @ 21:17:
[...]
Wat is het verschil met verschillende if-lussen die doorlopen worden, of een switch te gebruiken? :? Qua performance scheelt het niets.
Het gaat niet om performance, het gaat om goed code kloppen, wat vindt je hier van?
PHP:
1
2
3
4
5
6
}
else
{ 
...
}
}}}}}}}

Is dat onderhoudbaar of niet?

Of je dat nu vervangt door een elseif(), else if() of iets met switch, dat maakt minder uit.

[ Voor 57% gewijzigd door doeternietoe op 26-02-2009 21:30 ]


Verwijderd

Topicstarter
Ja, dat moet ik eigenlijk wel gaan doen ja, want dit is erg gênant. Bedankt voor de hulp allemaal!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 21:30

Sebazzz

3dp

Ik weet niet wat voor editor je nu gebruikt, maar ik denk %windir%\notepad.exe ;)
Gebruik een editor zoals Notepad++ of Ultraedit en indent je code (leesbaar maken dus). Daarnaast moet je inlezen op basis constructies zoals switches en loops.

Ook snap ik niet waarom je
PHP:
1
$url = "$pagina";
doet in plaats van
PHP:
1
$url = $pagina;

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
Persoonlijk bevalt de functie van deze pagina me wel goed om sql injection tegen te gaan.

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
BazzPsychoNut schreef op vrijdag 27 februari 2009 @ 11:35:
Persoonlijk bevalt de functie van deze pagina me wel goed om sql injection tegen te gaan.
Dat is alleen nodig als je zelf totaal geen controle hebt over de omgeving waarin je applicatie komt te draaien. Als je er gewoon voor zorgt dat je minimaal PHP 5 hebt en dat gekke dingen als register_globals en magic_quotes_gpc uit staan, dan heb je voldoende aan mysql_real_escape_string().

Acties:
  • 0 Henk 'm!

  • doeternietoe
  • Registratie: November 2004
  • Laatst online: 21:26
BazzPsychoNut schreef op vrijdag 27 februari 2009 @ 11:35:
Persoonlijk bevalt de functie van deze pagina me wel goed om sql injection tegen te gaan.
Ik zou er persoonlijk voor kiezen om magic quotes gewoon uit te zetten en als je daar geen toegang toe hebt om gelijk bij het binnenkomen van COOKIE, POST en GET de inhoud te ontdoen van de slashes. Dat moet je niet af laten hangen van de vraag of het wel of niet in een database hoeft. Als je invoer bijvoorbeeld wilt printen zit je ook met die slashes, dan moet je ze er daar weer uit halen. Hetzelfde als het in een plaintext file moet of een xml file. Zet gewoon een paar regels bovenaan je script als je bij je host de magic quotes niet uit kunt zetten, waarmee je de magic quotes weer ongedaan maakt.

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
BazzPsychoNut schreef op vrijdag 27 februari 2009 @ 11:35:
Persoonlijk bevalt de functie van deze pagina me wel goed om sql injection tegen te gaan.
Zoek eens op 'SQL Injection' in PRG, staat een mooi topic over met veel uitleg waarom mysql_real_escape_string niet goed genoeg is. Komt erop neer dat prepared statements eigenlijk de enige veilige manier is tegen SQL inecjection.

Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 19-09 10:19
GJtje schreef op donderdag 26 februari 2009 @ 21:17:
[...]
Wat is het verschil met verschillende if-lussen die doorlopen worden, of een switch te gebruiken? :? Qua performance scheelt het niets.
Het doel van een switch statement:
In some languages and programming environments, a case or switch statement is considered
easier to read and
easier to maintain than an equivalent series of if-else statements, because it is also
more concise.

Additionally, as mentioned above, an optimized implementation
executes much faster than an equivalent series of if-else statements, often implemented by using an indexed branch table

For example, deciding program flow based on a single characters value, if correctly implemented, is vastly more efficient than the alternative, reducing instruction path lengths considerably.

However, when implemented with fall-through, it is claimed[citation needed] that switch statements are a frequent source of bugs among programmers who are previously unfamiliar with the switch statement.

~ Mijn prog blog!

Pagina: 1