logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

PHP: Jak zabezpieczyć artykuły hasłem w CMS za pomocą nagłówków?

matel001 22 Sty 2007 11:19 1032 6
REKLAMA
  • #1 3473044
    matel001
    Poziom 20  
    Posty: 518
    Pomógł: 13
    Ocena: 8
    Hi all.
    Otóz mam taki problem, tworze sobie w PHP coś a la CMS, problem jest przy skrypcie który ma umożliwiać czytanie wybranych artykułów tylko użytkownikom którzy podali poprawne hasło. O to ten skrypt

    art_auth.php
    ---CUT HERE---
    <?php

    if (!isset($_SERVER['PHP_AUTH_USER']))
    {
    header('WWW-Authenticate: Basic realm="Konieczność autoryzacji"');
    header('HTTP/1.0 401 Unauthorized');
    exit;
    }
    else if (isset($_SERVER['PHP_AUTH_USER']))
    {
    include 'etc/mysql.php';
    include 'etc/shadow.php';
    $conn=mysql_connect($server, $username, $password);
    for($i=1;$i<999;$i++)
    {
    $username=strval($_SERVER['PHP_AUTH_USER']);
    $passwd=strval($_SERVER['PHP_AUTH_PW']);
    $passwd_shadow=md5($passwd);
    if (($users[i][i]=$user) && ($users[i][i+1]=$passwd_shadow))
    {
    $auth=true;
    break;
    }
    }
    if ($auth==true)
    {
    $query1=mysql_query("SELECT show_name,date,text FROM articles WHERE id=".$id."", $conn);
    while ($myrow=mysql_fetch_assoc($query1))
    {
    echo "<p align=center>".$myrow['show_name']."<br>";
    echo $myrow['text'];
    echo "</p>";
    }
    }
    else
    {
    echo 'Brak dostępu';
    }
    }
    ?>
    ---CUT HERE---

    Niestety efektem wykonania skryptu jest tylko głupawa informacja że strumień wyjściowy został już otwarty. Tylko że przecież nie został.

    O to ten komunikat
    ---CUT HERE---
    Warning: Cannot modify header information - headers already sent by (output started at d:\usr\apache\httpd\html\mtlnet\art_auth.php:1) in d:\usr\apache\httpd\html\mtlnet\art_auth.php on line 5

    Warning: Cannot modify header information - headers already sent by (output started at d:\usr\apache\httpd\html\mtlnet\art_auth.php:1) in d:\usr\apache\httpd\html\mtlnet\art_auth.php on line 6
    ---CUT HERE---

    Bardzo proszę o pomoc doświadczonych programistów PHP, dodam że jestem raczej średnio-zaawansowany w tym języku.

    Korzystam z Krasnala 2.7 z PHP 4
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #3 3473666
    praw
    Poziom 17  
    Posty: 192
    Pomógł: 17
    Ocena: 10
    Naglowki muszą być wysłane zanim wyślesz coś do przegladarki, a przed nagłówkami wysyłasz tekst:
    --CUT HERE--

    Jednym z wyjść jest własnie to co zaproponował kolega (czyli ob_start() i reszta finkcji ob_) - poczytaj sobie w manualu

    pozdrawiam
    Grzegorz
  • REKLAMA
  • #4 3476777
    matel001
    Poziom 20  
    Posty: 518
    Pomógł: 13
    Ocena: 8
    praw napisał:
    przed nagłówkami wysyłasz tekst:
    --CUT HERE--


    Ale to "---CUT HERE---", to nie jest część skryptu tylko oznaczenie miejsca w którym os się zaczyna.
  • REKLAMA
  • #5 3476802
    praw
    Poziom 17  
    Posty: 192
    Pomógł: 17
    Ocena: 10
    Cytat:
    --CUT HERE---
    Warning: Cannot modify header information - headers already sent by (output started at d:\usr\apache\httpd\html\mtlnet\art_auth.php:1) in d:\usr\apache\httpd\html\mtlnet\art_auth.php on line 5

    Warning: Cannot modify header information - headers already sent by (output started at d:\usr\apache\httpd\html\mtlnet\art_auth.php:1) in d:\usr\apache\httpd\html\mtlnet\art_auth.php on line 6
    ---CUT HERE---


    Jednak to --CUT HERE-- zostało wysłane do przegladarki.
    Z moich doswiadczen - czasami jeden glupi enter w dolaczanych plikach moze spowodowac taki blad (zostaje do przegladarki wyslany znak konca wiersza), więc już naglowków wysyłać nie można....

    pozdrawiam
    Grzegorz
  • #7 3480844
    matel001
    Poziom 20  
    Posty: 518
    Pomógł: 13
    Ocena: 8
    Dobra, trochę pokombinowałem. Przerobiłem ten kod tak że wygląda tak
    
    <?php
    function send_headers() {
    		header('WWW-Authenticate: Basic realm="Konieczność autoryzacji"');
    		header('HTTP/1.0 401 Unauthorized');
    		exit;
    }
    function show() {
    		$query1=mysql_query("SELECT show_name,date,text FROM articles WHERE id=".$id."", $conn);
    		while ($myrow=mysql_fetch_assoc($query1))
    		{
    		echo "<p align=center><b>".$myrow['show_name']."</b><br>";
    		echo $myrow['text'];
    		echo "</p>";
    		}
    }
    ob_start();
    if (!isset($_SERVER['PHP_AUTH_USER']))
      {
    	ob_start("send_headers");
    	ob_end_flush();
      }
    else if (isset($_SERVER['PHP_AUTH_USER']))
      {
    	include 'etc/mysql.php';
    	include 'etc/shadow.php';
    	ob_end_flush();
    	$conn=mysql_connect($server, $username, $password);
    	mysql_select_db($database, $conn);
    	for($i=1;$i<999;$i++)
    	{
    		$username=strval($_SERVER['PHP_AUTH_USER']);
    		$passwd=strval($_SERVER['PHP_AUTH_PW']);
    		$passwd_shadow=md5($passwd);
    		if (($users[i][i]=$user) && ($users[i][i+1]=$passwd_shadow))
    			{
    			$auth=true;
    			break;
    			}
    	}
    	if ($auth==true)
    	{
    		show();
    	}
    	else
    	{
    		echo 'Brak dostępu';
    	}
    }
    ?>
    

    Co ciekawe efektem jego wykonania jest pusta strona bez żadnych błędów, ale jest to spowodowane pewnie tym że wywołuje funkcję przez ob_start(). Co ciekawe po zamienieniu
    ob_start("send_headers");
    	ob_end_flush();
    na
    authenticate();
    , spowoduje pojaiwienie się błędu takieog jak wyżej go pokazałem, czyli wygląda na to że parserowi przeszkadzają te linijki wysyłające nagłówek.

Podsumowanie tematu

✨ Dyskusja dotyczy zabezpieczenia artykułów w CMS napisanym w PHP za pomocą uwierzytelniania HTTP Basic Authentication realizowanego przez nagłówki HTTP. Problemem jest wysyłanie nagłówków autoryzacji przed jakimkolwiek wyjściem do przeglądarki, co jest wymagane przez protokół HTTP. Wskazano, że nawet pojedynczy znak (np. znak końca linii) wysłany przed nagłówkami powoduje błąd i uniemożliwia ich poprawne przesłanie. Rozwiązaniem jest użycie buforowania wyjścia (funkcje ob_start() i ob_end_flush()), które pozwala na opóźnienie wysłania danych do przeglądarki do momentu wysłania nagłówków. Przykładowy kod pokazuje implementację funkcji wysyłającej nagłówki autoryzacji oraz funkcji wyświetlającej artykuł po poprawnym uwierzytelnieniu. Wskazano również na konieczność poprawnego sprawdzania danych użytkownika w bazie danych oraz na potencjalne błędy wynikające z nieprawidłowego dołączania plików (np. dodatkowe spacje lub znaki nowej linii).
Wygenerowane przez model językowy.
REKLAMA