Avatar billede alex15 Nybegynder
23. december 2007 - 21:37 Der er 21 kommentarer og
3 løsninger

Problemer med at nægte adgang til personer der ikke er logget på.

Hej Eksperter

Jeg har nu lavet et login system på min side. Og vil gerne gøre så nogle af siderne man kommer ind på KUN skal være tilgændelige for personer som er logget ind.

Hvordan gør man det?

Har selv prøvet mig lidt frem, og gjorde det på følgende måde (virkede dog ikke, da der sikkert ligger en fejl et sted, kan bare ikke finde ud af hvor):

(Smider kun et udsnit af koderne fra filerne ind)

-----
fil (login-ok.php)
...
session_start();
...

if(...)

$_SESSION['adgang']="ok";

?>

<meta http-equiv="Refresh" content="0;URL=forside.php" />

<?php

...

//Denne del virker fint. Det er bare lige for at vise at den sender en videre til forside.php. Samt smider OK ind i session kaldet (adgang).

-----

fil (forside.php)

...

<?php

session_start();

require("connect.php");

$adgang = $_SESSION['adgang'];

if ($adgang != "ok")
{
?>

<meta http-equiv="Refresh" content="0;URL=fejl1.php" />

<?php

} else {

?>

...

---

Problemet kan i selv se her:

www.alexanderchristensen.dk/admin

brugernavn: Alex
Kode: 2222
Avatar billede nielle Nybegynder
23. december 2007 - 22:00 #1
meta er ikke nogen seciel god måde at sikre at folk bliver sendt et bestemt sted hen. Det er op til browseren at bestemme om den vil. I stedet børe du gøre det med header:

http://dk2.php.net/header
Avatar billede alex15 Nybegynder
23. december 2007 - 23:45 #2
Hmm.. Har også prøvet at få det der header til at virke, uden held..! Ved bare ikke hvad jeg gør galt. Mener skriver jo bare:

(udsnit fra min kode)

        if($array_user['brugernavn'] == $brugernavn AND $array_pw['password'] == $password) {
       
        $_SESSION['adgang']="ok";
       
header('Location: forside.php');   
       
        } else {//Her starter condition FALSE på password kontrol
   
header('Location: fejl2.php');
   
    }

---

Hvad er det som jeg gør forkert?
Avatar billede alex15 Nybegynder
23. december 2007 - 23:47 #3
problemet er at den ikke sender mig "videre" til den side som jeg beder den om.

www.alexanderchristensen.dk/admin

Brugernnavn: Alex
Kode: 2222
Avatar billede nielle Nybegynder
24. december 2007 - 07:48 #4
Så skal vi nok se noget mere kode.
Avatar billede stengaard Praktikant
24. december 2007 - 10:50 #5
f.eks.

mysql (dump til mysql databasen)


CREATE TABLE `login` (
  `ID` int(11) NOT NULL auto_increment,
  `user` varchar(50) NOT NULL default '',
  `passwd` varchar(16) NOT NULL default '',
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `idx_brugere` (`user`),
  FULLTEXT KEY `profiltekst` (`profiltekst`)
) TYPE=MyISAM PACK_KEYS=0 AUTO_INCREMENT=1 ;

login modul

<?
ob_start();
?>

<form action="loggerin.php" method="post">
<table width="250" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Brugernavn:</font></td>
    <td><input name="bruger" type="text" size="12" maxlength="12"></td>
  </tr>
  <tr>
    <td><font size="2" face="Verdana, Arial, Helvetica, sans-serif">Password:</font></td>
    <td><input name="pass" type="password"  size="12" maxlength="12"></td>
  </tr>
  <tr>
    <td><input name="submit" type="submit" value="Login"></td>
    <td>&nbsp;</td>
  </tr>
</table><br>
</form>
<a href="create.html">Opret bruger</a>
<?php
session_start();

if ($_SESSION['status'] == "nobrugerpass") {
print("    <font face='verdana' size='2' color='#ff0000'>
    <b>Du SKAL indtaste et Brugernavn OG et Password!!!</b></font>");
}

if ($_SESSION['status'] == "fejl") {
print("    <font face='verdana' size='2' color='#ff0000'>
    <b>Der var noget galt med enten dit Brugernavn
    eller dit Password!!!</b></font>");
}

if ($_SESSION['status'] == "nobruger") {
print("    <font face='verdana' size='2' color='#ff0000'>
    <b>Du SKAL indtaste et Brugernavn!!!</b></font>");
}

if ($_SESSION['status'] == "nopass") {
print("    <font face='verdana' size='2' color='#ff0000'>
    <b>Du SKAL indtaste et Password!!!</b></font>");
}
else
{
print("");
}
ob_flush();
?>

access.php (modul)

<?PHP
mysql_connect("hostname", "brugernavn", "password");
mysql_select_db("database");
?>

loggerin.php (mudul tester om bruger og kode stemmer over ens)

<?php
session_start();




if ($_POST['bruger'] == "" AND $_POST['pass'] == "") {
        $_SESSION['status'] = "nobrugerpass";
    print("    <script language='javascript'>
        location.href='login.php';
        </script>");
}

elseif ($_POST['bruger'] == "") {
       
        $_SESSION['status'] = "nobruger";
    print("    <script language='javascript'>
        location.href='login.php';
        </script>");
}

elseif ($_POST['pass'] == "") {
       
        $_SESSION['status'] = "nopass";
    print("    <script language='javascript'>
        location.href='login.php';
        </script>");
}

else

{
include("access.php");
$query = "SELECT user, pass FROM login WHERE user = '".$_POST['bruger']."' AND pass= '".$_POST['pass']."'";
$result = mysql_query($query)or die("MySQL fejl: " . mysql_error());
$log = mysql_fetch_array($result);

if ($_POST['bruger'] == $log['user'] && $_POST['pass'] == $log['pass']) {
   
        $_SESSION['status'] = "login";
        $_SESSION['navn'] = $_POST['bruger'];
    print("    <script language='javascript'>
        location.href='index.php';
        </script>");
       
}

else
{
        $_SESSION['status'] = "fejl";
    print("    <script language='javascript'>
        location.href='login.php';
        </script>");
       
}
}
?>

sider.php (modul styrer browserne)

<?php
$login['form'] = "login.php";
$login['index'] = "index.php";
?>

på alle de sider du vil beskytte skal du i starten af kkoden pladser denne kode

<?php
session_start();
include("sider.php");
if ($_SESSION['status'] == "login")
{

}
else
{
print("    <script language='javascript'>
        location.href='login.php';
        </script>");
}

?>
Avatar billede stengaard Praktikant
24. december 2007 - 10:55 #6
fandt en fejl i table til mysql
brug denne i stedet


CREATE TABLE `login` (
  `ID` int(11) NOT NULL auto_increment,
  `user` varchar(50) NOT NULL default '',
  `pass` varchar(25) NOT NULL default '',
  PRIMARY KEY  (`ID`),
  UNIQUE KEY `idx_brugere` (`user`),
  FULLTEXT KEY `profiltekst` (`profiltekst`)
) TYPE=MyISAM PACK_KEYS=0 AUTO_INCREMENT=1 ;
Avatar billede alex15 Nybegynder
27. december 2007 - 19:30 #7
Sorry for ikke at have svaret igen. Men der har jo lige været de her juledage.

Her kommer noget mere kode Nielle:

--------

Index.php

<?php
include "adminheader.php";
?>

<div id="loginboks">
<H1 class="login">Admin Login</H1>

<div id="login">

<div id="login-v-op">
Brugernavn:<br /><br /><br />
Kode:
</div>

<div id="login-h-op">
<form action="login-ok.php" method="post">
<input type="text" name="brugernavn"><br><br>
<input type="password" name="password"><br><br>
</div>

<div id="login-h-ned">
<input type="submit" name="login" value="Login">
</form>
</div>

</div>

<?php
include "adminfooter.php";
?>

-------------------------

login-ok.php

<?php
include "adminheader.php";
?>

<?php
require("connect.php");

$login = ($_POST['login']);

if (empty($login)) {

header("Location: http://www.google.dk");

} else {

    $brugernavn = ($_POST['brugernavn']);
    $password = ($_POST['password']);

    if (empty($brugernavn) OR empty ($password)) {

header('Location: http://www.example.com/');

    } else {
   
        $result_user = mysql_query ("SELECT brugernavn FROM users WHERE brugernavn = '".$brugernavn."'") or die (mysql_error());
        $result_pw = mysql_query("SELECT password FROM users WHERE brugernavn = '".$brugernavn."'") or die (mysql_error());

        $array_user = mysql_fetch_array($result_user);
        $array_pw = mysql_fetch_array($result_pw);

        if($array_user['brugernavn'] == $brugernavn AND $array_pw['password'] == $password) {
       
        $_SESSION['adgang']="ok";
       
header('Location: forside.php');   
       
        } else {//Her starter condition FALSE på password kontrol
   
header('Location: fejl2.php');
   
    }
   
    }
   
    }
   
?>

<?php
include "adminfooter.php";
?>

---------------------------------------

adminheader.php

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

session_start();

require("connect.php");

?>

<head>
<link rel="stylesheet" type="text/css" href="css.css">

</head>
<body>

<div id="site">

<div id="banner">
<A HREF=""><img border="0" src="../billeder/banner/adminbanner.jpg" /></A>
</div>

----

Dette skulle være nok right?
Avatar billede alex15 Nybegynder
27. december 2007 - 23:52 #8
Stengaard:

Det der ser faktisk meget fornuftigt ud. Sidder og er igang med at læse i det. Prøve mig lidt frem og sådan. For at forstå det.. (det er ikke fordi jeg bare lader være med at kigge på det).

Kan se at du bruger noget Javascript.

"
<script language='javascript'>
        location.href='login.php';
        </script>");
"

Det har har hverken lært eller læst noget om endnu. Men går ud fra at det giver samme resultat som " if (empty($login)){header("Location: http://www.google.dk");
} right?
Avatar billede nielle Nybegynder
28. december 2007 - 07:31 #9
=== Index.php ===

Bortset fra at du har nogle problemer med antallet af startende og afsluttende div-tags, og at du har i øvrigt fået flettet dine div-tags sammen med din form på en ulovlig måde rent HTML-mæssigt, så ser denne ok ud.

Det er måske lidt sprogmæssigt uheldigt at du kalder det script der henvises til for "login-ok.php" eftersom det jo ikke er sikkert at login faktisk er ok. Det er o det det modtagende script skal tjekke.


=== login-ok.php ===

Sådan en knostruktion som:

$result_user = mysql_query ("SELECT brugernavn FROM users WHERE brugernavn = '".$brugernavn."'") or die (mysql_error());

er nu lidt sjov: hvorfor gå i databasen hvis det eneste den kan udtrække er det du allerede har i $brugernavn (og så selvfølgelig tom). Der er heller ikke nogen speciel grund til at lave det over 2 udtræk. Saml det i een SQL:

$result = mysql_query ("SELECT * FROM users WHERE brugernavn = '$brugernavn' AND password = '$password'") or die (mysql_error());

og tjek på hvor mange rækkjer der udtrækkes:


<?php
include "adminheader.php";

require("connect.php");

$login = ($_POST['login']);

if (empty($login)) {
    header("Location: login-ok.php");
} else {
    $brugernavn = mysql_real_escape_string($_POST['brugernavn']);
    $password = mysql_real_escape_string($_POST['password']);

    if (empty($brugernavn) || empty ($password)) {
        header('Location: login-ok.php');
    } else {
        $result = mysql_query ("SELECT * FROM users WHERE brugernavn = '$brugernavn' AND password = '$password'") or die (mysql_error());
        if (mysql_num_rows($result) == 1) {       
            $_SESSION['adgang'] = "ok";
                header('Location: forside.php');   
        } else { //Her starter condition FALSE på password kontrol
            unset($_SESSION['adgang']);
            header('Location: fejl2.php');
        }
    }
}
include "adminfooter.php";
?>


=== adminheader.php ===

Du har et problem med at include denne på login-ok.php siden. Header() kræver at der ikke er udskrevet noget som helst, og din ADMINHEADER.PHP STARTERE MED AT UDSKRIVE:

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

Det går ikke. Men hvorfor også include disse filer på login-ok.php? Siden bliver jo aldrig vistr for brugers idet denne straks bliver sendt videre til en anden side.
Avatar billede alex15 Nybegynder
30. december 2007 - 18:27 #10
Okay, sidder lige og prøver at gå det HELE igennem igen HELT fra starten af. Samt læser læser dit igennem.

Så vender jeg lige tilbage..
Avatar billede alex15 Nybegynder
01. januar 2008 - 15:50 #11
Perfekt. Fik det til at virke. Der var et problem med session. Noget med at browseren havde sendt header afsted. Men brugte bare koden:

ob_start(); i toppen af doc. så virkede det hele som det skulle.

Der ud over har jeg valgt og gøre det på nedenstående måde. For at afgøre om folk skal have adgang til min hjemmeside eller ej (Er denne metode holdbar?):

Når de logger ind:

$_SESSION['adgang']="XXX";


-----

forside.php

<?php

session_start();

if (!$_SESSION['adgang'] == "XXX")    {

    header('Location: fejl1.php');

    } else {

    //så kommer hjemmesiden
Avatar billede alex15 Nybegynder
01. januar 2008 - 15:54 #12
Men lav lige nogle svar alle sammen. For i fortjener stadigvæk nogle point. :) og forresten godt nytår..! :)
Avatar billede stengaard Praktikant
01. januar 2008 - 19:24 #13
stengaard :) ilm
Avatar billede nielle Nybegynder
02. januar 2008 - 09:12 #14
Du bør *ikke* bruge ob_start() - den er kun til helt specielle formål og den belaster serveren unødigt meget.

I stedet bør du omstrukture din kode sådan at eventuelle kald til header() bliver sendt før at du overhovedt begynder at udskrive noget. Jeg ville mene at det, i dette tilfælde, var nok at fjerne linjerne:

include "adminheader.php";
include "adminfooter.php";

- fra den side hvor du bruger header() til at sende videre (siden login-ok.php). Hvorfor forresten have dem? Det er jo under alle omstændigheder en side som der aldrig er nogen som skal se.
Avatar billede alex15 Nybegynder
02. januar 2008 - 12:10 #15
Hmm.. Øv.. Nu troede jeg lige at jeg havde fundet en smart løsning på problemet.. Men havde jeg åbenbart ikke..

Det smarte ved have disse include "adminheader.php"; filer. Var det der i disse filer alligevel er kode som skal gå igen på stort set ALLE sider i min hjemmeside. f.eks. sådan noget som menuen osv. Så behøver jeg nemlig kun og gå ind i adminheader.php for at rette i menu linjen. på resten af sidderne på hjemmesiden.

Og med hensyn til siden login-ok.php. Så ved jeg det ikke. Man kan jo lige så godt integrerer koden i index.php. Men gjorde da kun pga. jeg funlgte med i en vejledning til hvordan man lavede et brugersystem. og der gjorde de det på den måde nemlig.
Avatar billede nielle Nybegynder
02. januar 2008 - 12:46 #16
Hvis siden alligevel blot sender videre til en anden side er der ikke nogen grund til at udskrive noget som helst. Der er intet i vejen med din include-opskrift, men den må bare ikke lige bruges der.
Avatar billede alex15 Nybegynder
02. januar 2008 - 15:55 #17
nej, rigtig nok. Jeg kan jo bare gøre så det er selve index siden der finder ud af hvor folk skal sendes hen. MEN hey. hvis jeg nu får index siden til at finde ud af om en bruger er logget ind med det rigtig brugernavn og kodeord. Så skal der jo stadigvæk være en kode til at sende denne person videre i systemet? Eller kan man bare gøre det med: <form> altså sådan noget med en knap man skal trykke ned?

Synes ellers lige at jeg havde forstået det hele. men så ikke alligevel. Du siger at der intet i vejen er med min include-opskrift..? men hvad er det så, som der er galt med den? Kan som sagt ikke helt forstå det.
Avatar billede nielle Nybegynder
02. januar 2008 - 16:05 #18
De sider som kræver at man skal være logget ind, enten som almindelig bruger eller som adminsitrator, skal have et tjek i toppen af siden hvor der tjekkes om de rent faktisk er logget ind. Hvis de ikke er det, bør de vel straks sendes videre til siden med login formularen.

For admin-sidene kan dette tjek passende lægges i toppen af adminheader.php koden, sådan at det er denne kode som sender folk til den rette formular.
Avatar billede alex15 Nybegynder
02. januar 2008 - 16:41 #19
Hmm ja okay. Jeg er slet ikke begyndt og lave selve siden endnu (laver også kun denne hjemmeside for at lære at lave / programere mine egne hjemmersider). Men synes det ville være smartest og lave admin delen med det samme. Så derfor har jeg gjort det på den måde.

Hva så med måden hvorpå jeg chekker om brugeren skal have adgang til siden eller ej? er den okay?

-----------------

if (!$_SESSION['adgang'] == "XXX")    {

    header('Location: fejl1.php');

    } else {
...

------------------

Som jeg forstår det på dig, så skal jeg ligge denne kode i TOPPEN af alle sider? og bagefter kan jeg include en anden fil right???

Det eneste problem med at ligge det i toppen af adminheader var at man skal jo skrive:

---

else {

//Her slutter selve adminheader.php filen.

//Her starter f.eks. forside.php

}

//og det er her hvor det fucker op. Man SKAL jo afslutte ens tuburg parantes i adminheader.php delen. men hvis man gør det, så "DØR" else filen jo? - Forstår du hvad jeg mener? eller kan man bare skrive if (//IKKE LOGGET IND) {header:'Location: fejl1.php'}

Og så lade være med at skrive else bagefter?
Avatar billede nielle Nybegynder
02. januar 2008 - 16:47 #20
Husk at starte sessionen først.

Og ret så:

if (!$_SESSION['adgang'] == "XXX") {
    header('Location: fejl1.php');
} else {
    // resten af siden her
}

- til:

if (!isset($_SESSION['adgang']) || $_SESSION['adgang'] != "XXX") {
    header('Location: login.php');  // Send folk til login-formularen i stedet.
    die;
}
// resten af siden her


Der er intet i vejen for at du laver admin-login på samme måde.
Avatar billede alex15 Nybegynder
03. januar 2008 - 22:52 #21
Arh. Dejligt dejligt dejligt.. Efter at have siddet og kæmpet med det et per timer, fik jeg endelig alt til at lykkes. Så det kan ikke blive bedre kan man sige.

Fik også kigget dit eksempel igennem Stengaard. SUPER godt eksempel. Har jeg kunne bruge ritig meget af. Og har lært rigtig meget af det. Har kunne slette 5 filer som jeg alligevel ikke skulle bruge. Super fedt..

Nielle: Dit var også bare perfekt. Kan godt se at det var en meget smartere måde at gøre det på. Samt mere korrekt. Jeg behøver ikke længere benytte mig af:

ob_start()

Så i skal have mange gange tak for den store hjælp.
Avatar billede alex15 Nybegynder
03. januar 2008 - 22:55 #22
Hvorfor gad den ikke give jer 30 point hver..!?!? Der stod noget med at et evt rest point vil blive delt mellem jer? er det blevet det? ellers laver jeg lige et point spørgsmål. :)
Avatar billede nielle Nybegynder
04. januar 2008 - 20:02 #23
Tjaa, det virker godt nok lidt underligt - der plejer ikke at være problemer med den slags. Men pyt med det. :^)
Avatar billede alex15 Nybegynder
04. januar 2008 - 20:30 #24
Hmm.. Nej nej, synes i har været til super stor hjælp.. Så derfor skal i også have de point..

Går ind her og lave et svar :o)

http://www.eksperten.dk/spm/813010
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