Http Auth beveiliging met mysql

Door Jens V, 17 jaar geleden, 4.089x bekeken

Met dit scripje kan je een pagina/pagina's beveiligen.
Ik heb dit scripje gemaak naar aanleiding van een reactie die ik juist zag staan (http://www.phphulp.nl/php/scripts/1/357/).

Je paginas moeten tussen de 2 aangegeven puntjes in de code staan.
De code is uitgelegd in het script zelf :-)

Een voorbeeldje:

User: Testuser
Pass: Testpass

Opbouwende commentaar is welkom:-)

Mvg,
Jens

EDIT 1: Foutje in de sql opgelost
EDIT 2: Superglobals gebruikt
EDIT 3: Anti-SQL-Injection toegevoegd (thx niek)

Voorbeeld: http://www.vandenreyt.be/phphulp/secure.php

Gesponsorde koppelingen

PHP script bestanden

  1. http-auth-beveiliging-met-mysql

 

Er zijn 25 reacties op 'Http auth beveiliging met mysql'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Arwin  vdv
Arwin vdv
17 jaar geleden
 
0 +1 -0 -1
Leuk!, lijkt me erg handig, ga ik zeker gebruiken.
Voorbeeld werkt ook goed!
Hipska BE
Hipska BE
17 jaar geleden
 
0 +1 -0 -1
als ik de pagina opnieuw bezoek moet ik het passwoord niet meer invullen (heb niet op onthouden geklikt). Hoelang blijf je dan ingelogd?
Ik zie het niet meteen in het script.
Jens V
Jens V
17 jaar geleden
 
0 +1 -0 -1
Je blijft ingelogd totdat je je browser venster sluit.
Als je dan een nieuw opent, en dan naar de site opnieuw gaat, moet je je pass opnieuw ingeven ;)

Jens
Legolas
Legolas
17 jaar geleden
 
0 +1 -0 -1
Superglobals, zie $_SERVER.
Jens V
Jens V
17 jaar geleden
 
0 +1 -0 -1
@Legolas: is dat op mij? Ik zou niet weten waarom je dat zegt :o
Legolas
Legolas
17 jaar geleden
 
0 +1 -0 -1
Sorry... was even telegramstijl, dacht dat je gewoon per ongeluk verkeerd had gedaan in je code...

$_SERVER['PHP_AUTH_USER'];
$_SERVER['PHP_AUTH_PW'];

Ik zie nu trouwens ook SQL injection
Jens V
Jens V
17 jaar geleden
 
0 +1 -0 -1
ja, cva.
Ik zie hem ook..

Ik pas het gouw aan

EDIT: Is het zo beter?
Niek s
niek s
17 jaar geleden
 
0 +1 -0 -1
lees mijn tutorial over SQL Injection eens.
Ennee, je zet een while? terwijl je eerst zeker weet dat het 1 resultaat is? die hele while kan dus weg.
Niek s
niek s
17 jaar geleden
 
0 +1 -0 -1
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
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?
include('includes/config.php');//Naar de database connecten.
if (!isset($_SERVER['PHP_AUTH_USER']))//Kijken of er al een form is gesubmit, anders een weergeven.
{
    header("WWW-Authenticate: Basic realm=\"Enter Password.\"");
    Header("HTTP/1.0 401 Unauthorized");
    exit;
}


elseif(isset($_SERVER['PHP_AUTH_USER']))//Als er een username is gesubmit, kijken of de logininformatie klopt.
{
  $sql = "SELECT * FROM users WHERE username = '".mysql_real_escape_string($_SERVER['PHP_AUTH_USER'])."' AND password = '".sha1($_SERVER['PHP_AUTH_PW'])."'";//Nu is het veilig tegen SQL Injection. Voor zo ver ik weet zet sha1() het nooit om in speciiale carcaters zoals ene quote.
  $res = mysql_query($sql) or die(mysql_error());
  if (mysql_num_rows ($res) == 1)
  {

    $row = mysql_fetch_array ($res)
      //HIER MOET DE SITE INHOUD
      header("Refresh: 3; URL=http://www.jouwsite.be/test.php");
      echo 'Dag '.$row['username'].'';
      echo '<br>U wordt zodadelijk doorverwezen...';
      //HIER STOPT DE SITE INHOUD
  }else//Als de logininformatie fout is, form opnieuw weergeven.
  {
    header("WWW-Authenticate: Basic realm=\"Enter Password.\"");
    header("HTTP/1.0 401 Unauthorized");
    exit;
  }
}

?>
Jens V
Jens V
17 jaar geleden
 
0 +1 -0 -1
Ik wou het juist gaan veranderen :)
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(255) NOT NULL default '',
  `password` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


SHA1 is altijd 40 karakters, dus dan wordt het:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
CREATE TABLE `users` (
  `id` int(11) NOT NULL auto_increment,
  `username` varchar(255) NOT NULL default '',
  `password` varchar(40) NOT NULL default '',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Jens V
Jens V
17 jaar geleden
 
0 +1 -0 -1
@ Andries:
Dat kan, daar heb ik nog niet naar gekeken... maar ok, dat weet ik dan ook al ;-)
Joeri
Joeri
17 jaar geleden
 
0 +1 -0 -1
Zeer handig en bondige script, duidelijk voor beginners en mits enkele beveiligingsaanpassingen ga ik het waarschijnlijk wel gebruiken, of toch de code die je geschreven hebt voor een eigen beveiliging. Mooi voorbeeld ook om PHP en MySQL samen te gebruiken.

Grtz.
K i p
K i p
17 jaar geleden
 
0 +1 -0 -1
Ik zou het zo doen:
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
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php //geen shorttag gewoon voluit
  include('includes/config.php'); //Naar de database connecten.
  
  //Waarom SELECT * als je de
  //gegevens niet eens gebruikt,
  //ik doe dus SELECT id, het maakt
  //misschien 1 miljoenste seconde
  //uit, maar toch vind ik dit netter.
  //Misschien is er nog een manier
  //om de database zo min mogelijk
  //te belasten.

  $sql = "
      SELECT
          id
      FROM
          users
      WHERE
          username = '"
.mysql_real_escape_string($_SERVER['PHP_AUTH_USER'])."'
      AND
          password = SHA1('"
.$_SERVER['PHP_AUTH_PW']."')
      ;
  '"
;//Het password in de database is omgezet met een SHA1 encryptie.
  //Ik laat de database er ook sha1 van maken
  //omdat ik SQL leuker vind dan PHP

  
  $res = mysql_query($sql) or die(mysql_error());
  if (mysql_num_rows ($res) != 1)
  {

    header("WWW-Authenticate: Basic realm=\"Enter Password.\"");
    header("HTTP/1.0 401 Unauthorized");
    exit;
  }

?>
Een soortgelijk script bestaat trouwens al op phphulp. Ik vind het niet een echte toevoeging aan de scriptlib ook al zit er nu MySQL in verwerkt, op Jens' manier. Ieder verwerkt het dus op zijn eigen manier.

Ik vind verder niet dat dit script verwijderd moet worden o.i.d., want ik ben van mening dat elk (beetje goed) script de beginners op weg helpt!

Dus je helpt de beginners in ieder geval.
The Beeding Clown
The Beeding Clown
17 jaar geleden
 
0 +1 -0 -1
Vind het script ook niet zo heel goed..
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
if(!isset($_SERVER['PHP_AUTH_USER']))
{
    ....
}

elseif(isset($_SERVER['PHP_AUTH_USER']))
{
    ....
}

?>


Is een dubbele check, is nergens voor nodig..

Verder:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
      //HIER MOET DE SITE INHOUD
      header("Refresh: 3; URL=http://www.jouwsite.be/test.php");
?>


Beetje lastig je hele site daar tussen te proppen..

Je kan volgens mij beter zoiets doen...

Auth.php:
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
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php

    $user
= 'username';
    $pass = 'password';


    function
check_auth($user, $pass)
    {

        if(isset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']))
        {

            // kan hier ook in database checken voor user en pass
            if(strtolower($_SERVER['PHP_AUTH_USER']) == $user && strtolower($_SERVER['PHP_AUTH_PW']) == $pass)
                return true;
        }

        return false;
    }



    if(!check_auth($user, $pass))
    {
  
        header('WWW-Authenticate: Basic realm="Restricted Section"');  
        header('HTTP/1.0 401 Unauthorized');
        
        die("<h1>Authentication Failed</h1>You are unauthorized to view this page");
    }


?>


Dan simpel deze page includen bovenaan de pages van je site..
Tim Groot
Tim Groot
17 jaar geleden
 
0 +1 -0 -1
Hier hebben we wat aan. ziet er netjes uit. het voorbeeld werkt goed. ;)
Leroy Boerefijn
Leroy Boerefijn
17 jaar geleden
 
0 +1 -0 -1
@nano, je kunt de refresh ook gewoon vervangen voor een Location: .. header
- -
- -
17 jaar geleden
 
0 +1 -0 -1
netjes, simpel en duidelijk!
- Jim  -
- Jim -
17 jaar geleden
 
0 +1 -0 -1
Misschien voor de uitbreiding:...
Nu wil ik me afmelden en als een andere gebruiker aanmelden...
(uiteraard gaat het dan om het afmelden.)
The Beeding Clown
The Beeding Clown
17 jaar geleden
 
0 +1 -0 -1
misschien het volgende, je zou je zelf even moeten testen. Ik weet niet of je die variabelen kan unsetten.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

unset($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);

?>
Rudie dirkx
rudie dirkx
17 jaar geleden
 
0 +1 -0 -1
Ik snap het voordeel niet van HTTP Authentication boven gewoon een formuliertje invullen... Het werkt anders ja, je browser handelt nu je sessie af (weet je zeker dat je dat wilt!?), ipv een cookie en server side sessions, maar is dat beter?
Daarnaast is een formuliertje iets gebruikersvriendelijker (vind ik) omdat je er links naast kan zetten etc, en toch het formulier in kan vullen. Een HTTP Auth box is echt alleen dat. Geen plaatje, woord of link te vinden. Pas als je op cancel drukt. Jammer.

@nano
Nee variabelen unsetten kan niet. Unsetten kan natuurlijk wel :) Maar probeer maar eens $_SERVER['REMOTE_ADDR'] te unsetten... Het komt elke keer terug ;) Wat een trut het, $_SERVER.

Een sessie afbreken kan dus alleen als je je browser afsluite, of als je browser er geen zin meer in heeft! Is dat wat je wilt!?

Edit:
Ook wordt in het geval van BASIC HTTP Auth de logindata redelijk plain (base64) over de lijn gegooid. Gebruik dus liever DIGEST, als je http auth wil gebruiken. Dat is iets veiliger: http authentication digest
Hipska BE
Hipska BE
17 jaar geleden
 
0 +1 -0 -1
kan je niet uitloggen dan zonder browser herstart?

wel wat onhandig hier op mac, want als alle vensters uit zijn is safari nog steeds open..

kan je niet uitloggen door dit te doen?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
$_SERVER
['PHP_AUTH_USER'] = '';
$_SERVER['PHP_AUTH_PW'] = '';
?>

EDIT: en waar kom je terecht als je op annuleren klikt?
Jens V
Jens V
17 jaar geleden
 
0 +1 -0 -1
@HIPSKA:
Probeer het eens?^^
Normaal gezien kom je dan bij hetzelfde form terecht, aangezien er gen username wordt gesubmit..

Jens
Ki ma
ki ma
15 jaar geleden
 
0 +1 -0 -1
$row = mysql_fetch_array ($res) //Array opbouwen.

Moet

$row = mysql_fetch_array ($res) ; //Array opbouwen.

zijn.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Douwe
Douwe
15 jaar geleden
 
0 +1 -0 -1
Waarom reageren na een jaar?

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. http-auth-beveiliging-met-mysql

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.