Autor Zpráva
Alphard
Profil
Dočasné* odkladiště věcí vyhozených z FAQ.

*snad

# Rekurzivní zipování

<?php
class Zipuj
{
    protected $jmeno_zipu;
    protected $root;
    protected $zip;

    public function __construct($root = ".", $jmeno_zipu = "zip.zip")
    {
        $this->root = $root;
        $this->jmeno_zipu = $jmeno_zipu;
        $this->zip = new ZipArchive();
        $this->zip->open($this->jmeno_zipu, ZIPARCHIVE::CREATE);
        $this->nactiAdr();
        $this->uloz();
    }

    public function nactiAdr($cesta = "")
    {
        $hn = scandir($this->root.$cesta);
        foreach ($hn as $file)
        {
            if ($file == "." || $file == "..")
            {
                continue;
            }
            if (is_dir($this->root.$cesta."/".$file))
            {
                $this->zip->addEmptyDir($cesta."/".$file);
                $this->nactiAdr($cesta."/".$file);
            }
            else
            {
                $this->zip->addFile($this->root.$cesta."/".$file, $cesta."/".$file);
            }
        }
    }

    public function uloz()
    {
        $this->zip->close();
    }
}

// zazipuje nám vše na cestě zadané v první parametru a výsledný zip pojmenuje dle druhého parametru
$zalohuj = new Zipuj('./test/test2', 'zaloha.zip'); 


Pozn: Vyžaduje knihovnu zip (nastavuje se v php.ini), není-li k dispozici, lze očekávat chybu Fatal error: Class 'ZipArchive' not found in …
Alphard
Profil

# Registrace uživatelů


Na začátek uvedu odkazy na několik pokročilejších technik zabezpečení (nebo jeho obejití).
Ukradli jsme účet k Facebooku. S Androidem za pět sekund
Série článků Nenechte si uhodnout Session ID od Jana Tichého.

Jednoduchá kostra přihlašovacího scriptu

Základ napsal srigi.
Tento script je návodem na jednoduchou realizaci přihlašování uživatelů na webu za pomoci databázové tabulky a sessions.


Databázová tabulka
Informace o uživatelích budeme uchovávat v databázové tabulce. Vytvoříte ji tak, že spustíte následující sql dotaz.
CREATE TABLE   users (
  id           int           NOT NULL  auto_increment,
  username     varchar(20)   NOT NULL,  # délka je na vás
  password     char(40)      NOT NULL,  # další sloupce lze doplnit dle potřeby, tohle je minimum
  PRIMARY KEY  (id)
);


Hned můžeme přidat nového uživatele. Heslo z bezpečnostích důvodů zahašujeme. Jméno je admin a heslo secret.

INSERT INTO users (id, username, password)
VALUES (
  NULL, 'admin', SHA1('secret')
);


PHP kód. Je podrobně komentován. V komentářích je mj. popsáno, kam vkládat obsah.
<?php
$path = "/";  // máte-li stránky v rootu, nechte bezezměny, pokud je provozujete v nějakém podadresáři, zadejte jeho jméno
              // např. stránky mám na moje-domena.cz/adresar/, tak zadám $path = "/adresar/";

// funkce pro ošetření vstupních dat od uživatele
// viz http://cz.php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc
function db_escape($str) 
{ 
    return mysql_real_escape_string(@get_magic_quotes_gpc() ? stripslashes($str) : $str);
} 


include "pripojeni_db.php"; // soubor pripojeni_db.php zajistí připojení k databázi a výběr databáze, se kterou pracujeme
session_start();  // tohle je nezbytné a je nutné uvést tuto funkci na všech stránkách, kam se přihlášený uživatel dostane
                  // možnost nastavit automatické spouštění session_start() nechávám stranou

// zjistíme, co chce uživatel dělat
if (isset($_SESSION['username']) && isset($_GET['logout']))
{
    // uživatel je přihlášen a chce se odhlásit, takže smažeme údaje o přihlášení
    $_SESSION = array();
    if (isset($_COOKIE[session_name()]))
    {
        setcookie(session_name(), '', time()-42000, '/');
    }
    session_unset();
    session_destroy();
    // a přesměrujeme na index.php
    header("location:http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303);
    exit;
}
elseif (isset($_SESSION['username']))
{
    //session_regenerate_id(); // ochrana před session fixation, lze vynechat
    // uživatel je přihlášen a nechce se odhlásit, zde zobrazíme obsah pro registrované
    // můžeme využit include apod.

    // tohle informuje uživatele, že je přihlášen a vypíše odkaz pro odhlášení
    // můžeme to ale přemístit do includovaného souboru (kam se nám hodí)
    echo "<p>Přihlášen: $_SESSION[username] <a href=\"http://".$_SERVER['SERVER_NAME'].$path."index.php?logout=1\">odhlásit</a></p>\n";
}
else
{
    // uzivatel není přihlášen
    // pokud odeslal přihlašovací údaje, snaží se přihlásit
    if (isset($_POST['username']) && isset($_POST['password']))
    {
        // ošetříme vstupní údaje od uživatele
        // funkce trim() má význam hlavně u hesla, ořeže bílé znaky (např. mezery) na začátku a konci řetězce
        $username = db_escape(trim($_POST['username']));
        $password = db_escape(trim($_POST['password']));

        // zjistíme, jestli je v databázi daný uživatel a jestli se prokazuje platným heslem
        // více o ukládání hesel, např. o tzv. solení, najdete na http://php.vrana.cz/ukladani-hesel.php
        $result = mysql_query("SELECT COUNT(*) FROM users WHERE username = '$username' AND password = sha1('$password')");

        if (mysql_result($result, 0))  // předpokládáme, že dotaz proběhl úspěšně, pokud ne, bude stejně vráceno false
                                       // true (a splnění podmínky) nastane pouze tehdy, když v databázi existuje správná kombinace uživatelského jména a hesla
        {
            // uložíme potřebné SESSION proměnné
            $_SESSION['username'] = $username;
            $_SESSION['cas_prihlaseni'] = time(); // čas, kdy se uživatel přihlásil, pozor, nejedná se o čas poslední akce, nevím, jestli ho využijete, může být smazán

            // po přihlášení uživatele přesměrujeme na index.php
            header ("location:http://".$_SERVER['SERVER_NAME'].$path."index.php", TRUE, 303);
            exit;  // aby bylo pravidlům učiněno zadost, zde stejně končí podmínka a jiná nemůže být splněna
        }
        else
        {
            // uživatel zadal neplatné přihlašovací údaje
            // přesměrujeme ho na index.php a zobrazíme chybovou hlášku
            header ("location:http://".$_SERVER['SERVER_NAME'].$path."index.php?incorrect_login=1", TRUE, 303);
            exit;
        }
    }
    else
    {
      // uživatel není přihlášen a ani neodeslal přihlašovací formulář, tak mu ho zobrazíme
      echo "<div>";
      if (isset($_GET['incorrect_login']))
      {
          echo "<p style=\"color: #F00\">Zadali jste neplatné uživatelské jméno nebo heslo</p>\n";
      }
      // zobrazíme formulář pro přihlášení
      ?>
      <form action="index.php" method="post">
        Jméno:  <input name="username" type="text"><br>
        Heslo: <input name="password" type="password"><br>
        <input name="submit" type="submit" value="Přihlásit">
      </form>
      </div>
      <?php
    }
}
?>
Toto téma je uzamčeno. Odpověď nelze zaslat.

0