Avatar billede jespercp Nybegynder
22. november 2004 - 16:46 Der er 18 kommentarer og
1 løsning

Fejl i PHP script!

Kære alle,

jeg har fundet et script til en simpel beskyttelse af visse sider.

Jeg har indsat koden

<?PHP
include("accessCheck.php");
?>

i head sektionen på mine beskyttede sider.

Filen accesssCheck.php indeholder så flg:

<?PHP

// Le mot de passe
$pass = "mdp";

// On initialise la variable
$can_view = 0;

$cookie = $_COOKIE['pass-check'];

// Si on n'a pas envoyé le formulaire de vérification, on teste le cookie
if (!isset($_POST['caller'])) {
    // Si le cookie n'est pas vide, on peut accéder à la page
    if (!empty($cookie)) {
        // Mais on fait une vérification
        if ($cookie == $mdp) {
            $can_view = 1;
        }
    }
   
    // Maintenant on contrôle la variable
    if ($can_view == 1) {
        // On met à jour le cookie pour un jour de plus (86 400 secondes)
        setcookie("pass-check","$mdp",time()+86400);
    } else {
        // Sinon, on affiche le formulaire
        echo "Avant de pouvoir accéder à cette page, vous devez entrer le mot de passe :"
            ."<br><br><form action=\"accessCheck.php\" method=\"POST\">"
            ."Mot de passe : <input type=\"password\" name=\"mdp\">"
            // On stocke dans une variable la page qui à fait appel au script
            ."<input type=\"hidden\" name=\"caller\" value=\"".$_SERVER['PHP_SELF']."\">"
            ."<br><br><input type=\"submit\" value=\"Vérifier\"></form>";
        // On n'oublie pas de bloquer la page !
        exit();
    }
// Sinon on fait la vérification
} else {
    $passw = $_POST['mdp'];
    $caller = $_POST['caller'];
    // On compare les mots de passe
    if ($passw == $pass) {
        // On crée le cookie et on redirige vers la page voulue
        setcookie("pass-check","$mdp",time()+86400);
        header("Location: $caller");
    } else {
        echo "Mauvais mot de passe !";
        // On n'oublie pas de quitter le tout
        exit();
    }
}

?>

Men når jeg afprøver den, får jeg flg. besked:

Warning: Cannot modify header information - headers already sent by (output started at /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/accessCheck.php:1) in /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/accessCheck.php on line 52

Warning: Cannot modify header information - headers already sent by (output started at /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/accessCheck.php:1) in /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/accessCheck.php on line 53


Hvad er det, der er galt her? jeg har afprøvet scriptet før uden problemer, og jeg mindes ikke at have gjort noget anderledes nu????

Pft

Jesper
Avatar billede jaw Nybegynder
22. november 2004 - 16:57 #1
Du har ikke et blankt output som f.eks. mellemrum eller linieskift over følgendende, vel?

<?PHP
include("accessCheck.php");
?>
Avatar billede jaw Nybegynder
22. november 2004 - 16:58 #2
...eller i accessCheck.php for den sags skyld ! :)
Avatar billede jespercp Nybegynder
22. november 2004 - 17:09 #3
Nej, dokumentet jeg (som en test) vil beskytte ser ud som flg:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<?PHP
include("accessCheck.php");
?>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
Dette er en testside!
</body>
</html>
Avatar billede jespercp Nybegynder
22. november 2004 - 17:11 #4
og accessCheck.php ser ud som flg:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Login</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<?PHP

// Le mot de passe
$pass = "mdp";

// On initialise la variable
$can_view = 0;

$cookie = $_COOKIE['pass-check'];

// Si on n'a pas envoyé le formulaire de vérification, on teste le cookie
if (!isset($_POST['caller'])) {
    // Si le cookie n'est pas vide, on peut accéder à la page
    if (!empty($cookie)) {
        // Mais on fait une vérification
        if ($cookie == $mdp) {
            $can_view = 1;
        }
    }
   
    // Maintenant on contrôle la variable
    if ($can_view == 1) {
        // On met à jour le cookie pour un jour de plus (86 400 secondes)
        setcookie("pass-check","$mdp",time()+86400);
    } else {
        // Sinon, on affiche le formulaire
        echo "Avant de pouvoir accéder à cette page, vous devez entrer le mot de passe :"
            ."<br><br><form action=\"accessCheck.php\" method=\"POST\">"
            ."Mot de passe : <input type=\"password\" name=\"mdp\">"
            // On stocke dans une variable la page qui à fait appel au script
            ."<input type=\"hidden\" name=\"caller\" value=\"".$_SERVER['PHP_SELF']."\">"
            ."<br><br><input type=\"submit\" value=\"Vérifier\"></form>";
        // On n'oublie pas de bloquer la page !
        exit();
    }
// Sinon on fait la vérification
} else {
    $passw = $_POST['mdp'];
    $caller = $_POST['caller'];
    // On compare les mots de passe
    if ($passw == $pass) {
        // On crée le cookie et on redirige vers la page voulue
        setcookie("pass-check","$mdp",time()+86400);
        header("Location: $caller");
    } else {
        echo "Mauvais mot de passe !";
        // On n'oublie pas de quitter le tout
        exit();
    }
}

?>

</body>
</html>
Avatar billede jaw Nybegynder
22. november 2004 - 17:16 #5
Der skal ikke være html-tags od doc-typer i accessCheck.php.
Avatar billede jespercp Nybegynder
22. november 2004 - 17:22 #6
ok, nu har jeg prøvet at fjerne alt fra fra siden udover scriptet, så der alene står:

<?PHP

// Le mot de passe
$pass = "mdp";

// On initialise la variable
$can_view = 0;

$cookie = $_COOKIE['pass-check'];

// Si on n'a pas envoyé le formulaire de vérification, on teste le cookie
if (!isset($_POST['caller'])) {
    // Si le cookie n'est pas vide, on peut accéder à la page
    if (!empty($cookie)) {
        // Mais on fait une vérification
        if ($cookie == $mdp) {
            $can_view = 1;
        }
    }
   
    // Maintenant on contrôle la variable
    if ($can_view == 1) {
        // On met à jour le cookie pour un jour de plus (86 400 secondes)
        setcookie("pass-check","$mdp",time()+86400);
    } else {
        // Sinon, on affiche le formulaire
        echo "Avant de pouvoir accéder à cette page, vous devez entrer le mot de passe :"
            ."<br><br><form action=\"accessCheck.php\" method=\"POST\">"
            ."Mot de passe : <input type=\"password\" name=\"mdp\">"
            // On stocke dans une variable la page qui à fait appel au script
            ."<input type=\"hidden\" name=\"caller\" value=\"".$_SERVER['PHP_SELF']."\">"
            ."<br><br><input type=\"submit\" value=\"Vérifier\"></form>";
        // On n'oublie pas de bloquer la page !
        exit();
    }
// Sinon on fait la vérification
} else {
    $passw = $_POST['mdp'];
    $caller = $_POST['caller'];
    // On compare les mots de passe
    if ($passw == $pass) {
        // On crée le cookie et on redirige vers la page voulue
        setcookie("pass-check","$mdp",time()+86400);
        header("Location: $caller");
    } else {
        echo "Mauvais mot de passe !";
        // On n'oublie pas de quitter le tout
        exit();
    }
}

?>

Men det har ikke det store resultat. Nu bliver formularen bare stående, selvom man taster det rigtige kodeord - der sker ganske enkelt intet...
Avatar billede jaw Nybegynder
22. november 2004 - 17:24 #7
Det har jo så præcis det store resultat. Det der egentlig var dit spørgsmål er vel ikke dit spørgsmål mere?

Hoppe den tilbage tild en side du har dine forms på, eller ser du en blank side, eller?
Avatar billede jespercp Nybegynder
22. november 2004 - 17:26 #8
ok, jeg mener selvfølgelig bare, at det jo gerne må komme til at virke hele vejen igennem :o)

Anyway, den hopper videre til siden index.php, hvorpå jeg har min include, men min form fra accessCheck.php bliver ståede, og den viser i øvrigt heller ikke noget fra index-siden, hvor der jo skulle stå det med testside...
Avatar billede jaw Nybegynder
22. november 2004 - 17:28 #9
Har du startet dine sessions? Prøv med: session_start(); over din doc-type.
Avatar billede jaw Nybegynder
22. november 2004 - 17:31 #10
<? session_start(); ?>
skal det så være
Avatar billede jespercp Nybegynder
22. november 2004 - 17:33 #11
Således?

<? session_start(); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<?PHP
include("accessCheck.php");
?>
<title>Untitled document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

Det gør ingen forskel - der sker det samme...
Avatar billede jaw Nybegynder
22. november 2004 - 17:34 #12
Ok, så må jeg jo lige afprøve det, 2 sek.
Avatar billede jaw Nybegynder
22. november 2004 - 17:49 #13
Okey, så har jeg rettet lidt. Jeg fandt aldrig ud af hvad $mdp indeholder - kan du lure det? Men jeg tror det var meningen $mdp skulle være passwordet, altså nærmere $passw.

Så jeg har ændret lidt, og det her ser ud til at virke:

<?PHP
session_start();

// Le mot de passe
$pass = "mdp";

// On initialise la variable
$can_view = 0;

$cookie = $_COOKIE['pass-check'];

// Si on n'a pas envoyé le formulaire de vérification, on teste le cookie
if (!isset($_POST['caller'])) {
    // Si le cookie n'est pas vide, on peut accéder à la page
    if (!empty($cookie)) {
        // Mais on fait une vérification
        if ($cookie == $pass) {
            $can_view = 1;
        }
    }
   
    // Maintenant on contrôle la variable
    if ($can_view == 1) {
        // On met à jour le cookie pour un jour de plus (86 400 secondes)
        setcookie("pass-check","$mdp",time()+86400);
    } else {
        // Sinon, on affiche le formulaire
        echo "Avant de pouvoir accéder à cette page, vous devez entrer le mot de passe :"
            ."<br><br><form action=\"accessCheck.php\" method=\"POST\">"
            ."Mot de passe : <input type=\"password\" name=\"mdp\">"
            // On stocke dans une variable la page qui à fait appel au script
            ."<input type=\"hidden\" name=\"caller\" value=\"".$_SERVER['PHP_SELF']."\">"
            ."<br><br><input type=\"submit\" value=\"Vérifier\"></form>";
        // On n'oublie pas de bloquer la page !
        exit();
    }
// Sinon on fait la vérification
} else {
    $passw = $_POST['mdp'];
    $caller = $_POST['caller'];
    // On compare les mots de passe
    if ($passw == $pass) {
        // On crée le cookie et on redirige vers la page voulue
        setcookie("pass-check","$passw",time()+86400);
        header("Location: $caller");
    } else {
        echo "Mauvais mot de passe !";
        // On n'oublie pas de quitter le tout
        exit();
    }
}

?>
Avatar billede jespercp Nybegynder
22. november 2004 - 17:58 #14
hmm - den hopper videre til index.php med følgende besked:

Warning: Cannot modify header information - headers already sent by (output started at /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/index.php:5) in /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/accessCheck.php on line 25

Og intet andet.

Fsva $mdp - så vidt jeg har forstået, er det kodeordet, der lægges i cookien, som den så checker og opdaterer ved hvert besøg - men øøh jeg er ikke ekspert...
Avatar billede jaw Nybegynder
22. november 2004 - 18:00 #15
Fik jeg sagt, at du skulle fjerne den <? session_start(); ?> du fik smidt ind i index.php? :)
Avatar billede jespercp Nybegynder
22. november 2004 - 18:07 #16
nej men det har jeg så gjort nu - med flg. resultat:

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/index.php:4) in /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/accessCheck.php on line 2

Warning: Cannot modify header information - headers already sent by (output started at /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/index.php:4) in /var/www/hotels/.dk/jnlaw/html/icjtest/members_area/accessCheck.php on line 25

Har i øvrigt lige forsøgt på en anden pc med lavere sikkerhedsniveau, for at checke om det er noget med at min ikke vil spise cookien eller hvad ved jeg - men det var det samme...
Avatar billede jaw Nybegynder
22. november 2004 - 18:13 #17
Nej, okey. Det var mig der havde fået redigeret lidt meget i det da jeg testede det. Min bedste løsning vil blive at din index.php skal se sådan ud:

<?PHP
include("accessCheck.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
Dette er en testside!
</body>
</html>

Og så må du indsætte alle dine tags i accessCheck.php hvor den udskriver login-forms. (Ikke nødvendigt for at få det til at funke, kun i forhold til W3C etc.)
Avatar billede jespercp Nybegynder
22. november 2004 - 18:30 #18
ok, det ser ud til at virke. Dog var det vist meningen, at den skulle lægge en cookie, der gælder i 24 timer, så man ikke skal indtaste kodeordet hver gang - men så vidt jeg kan se, kræver den kodeordet hver gang...

Men den beskytter da siden, så hvis du lægger et svar, giver jeg point...
Avatar billede jaw Nybegynder
22. november 2004 - 19:31 #19
Ja, jeg undrede mig også lidt over det. Men tænkte ikke mere over det :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester