Autor Zpráva
Hanisx
Profil
Zdravím,

Potřeboval bych, aby jedna stránka na mém webu nebyla přístupná pro lidi, kteří vstoupí na web, ale byla přístupná pouze pro admina. Jak to lze provést?

Děkuji za odpověď.
Joker
Profil
Podle čeho se pozná admin?
Hanisx
Profil
Joker:
Na webu mám jednoduché příhlášení a potřeboval bych, aby se na tu stránku dostal jen ten "admin", když je je přihlášený na webu.

Přihlášení vypadá nějak takhle:

<form method="POST" action="">
<?php
session_start();
if(isset($_GET['logout']))
{
session_destroy();
echo "Byl jsi odhlášen.<meta http-equiv='refresh' content='2;url=informace.php'><br>";
}
if(isset($_SESSION['username']))
{
echo "Uživatel: <b>".$_SESSION['username']."</b><br>";
echo "<br />";
echo "<a class='target' href='blabla.php?soubor=blablabla'>";
echo "Tabulka";
echo "</a>";
?>
<br />
<a class="target" href='?logout=true'>Odlásit se</a><br>
<?php
}
else
{
?>
<label>Jméno</label>
<br /> 
<input type="text" name="username">
<br />  
<label>Heslo</label>
<br />  
<input type="password" name="password">
<br />
<input class="button" type="submit" name="logme" value="Přihlásit se"><br>
<?php 
if(isset($_POST['logme']))
{         
include "pages/connect.php";
mysql_connect($mysql_ip,$mysql_user,$mysql_pass);
mysql_select_db($mysql_name);
$query = mysql_query("SELECT * FROM users WHERE username='".$_POST['username']."'");
if(mysql_num_rows($query) == 1)
{
$fetch = mysql_fetch_array($query);
if($_POST['password'] == $fetch['password'])
{
echo "<br />";
echo "Úspěšné přihlášení.<meta http-equiv='refresh' content='2;url=blabla.php'>";  
$_SESSION['username'] = $_POST['username'];
} 
else
echo "";
}
else 
echo "";
}
}  
?>
</form>
mimochodec
Profil
Hanisx:
Na Jokerovu otázku neodpovídáš. Kde je informace, že někdo je admin? Vyčleň k tomu nějaký sloupec v tabulce users, pak to dej třeba do $_SESSION['level'] a pak to budeš moct na stránce použít.
Joker
Profil
Hanisx:
Fajn. A podle čeho se pozná admin?

Ono to bude prostě a jednoduše něco jako:
if (/*uživatel není admin*/) {
  die("Nemáte oprávnění");
}
else {
  // zobraz stránku
}

Jinak ten výše uvedený skript není ideální.
Když zadám heslo „heslo“ a jméno „' OR password="heslo" LIMIT 1--“, přihlásí mě to pod účtem prvního uživatele, který má heslo „heslo“.
Giga
Profil
Hanisx
stránku pre admina pomenuj napr: dh5e5dmfhs.php a postaraj sa, aby na ňu nebol nikde žiadny odkaz!
Joker
Profil
Giga:
Tak tomu se říká zabezpečení :-D
Nebo tam může dát bílé písmo na bílém pozadí a doufat, že nikoho nenapadne si to označit :-)
Hanisx
Profil
Joker:
No prakticky žádní uživatelé tam nebudou, je tam pauze admin :D takže asi tak.....

zkouším to tedy napsat nějak takhle, ale nejde to napíše to "nemáte opravnění" i když sem přihlášený na admina....

if ($_SESSION['username'] != "admin") {
  die("Nemáte oprávnění");
}
else{

}
lionel messi
Profil
Hanisx:
zkouším to tedy napsat nějak takhle, ale nejde to napíše to "nemáte opravnění" i když sem přihlášený na admina....
Ukáž zvyšok kódu, v tomto úryvku chyba nie je.
snazimse
Profil
Hanisx

zkouším to tedy napsat nějak takhle, ale nejde to napíše to "nemáte opravnění" i když sem přihlášený na admina....

Pak zřejmě podmínka,není v pořádku.

Tohle, by se to mělo zapsat takto, podle mě.

if ($_SESSION['username'] !== "admin") {
  die("Nemáte oprávnění");
}
else{
 
}
martin1312
Profil
V $_SESSION['username'] zrejme nie je reťazec "admin". Pred tým overením si ho vypíš:
var_dump($_SESSION['username']);
if ($_SESSION['username'] != "admin") {
  die("Nemáte oprávnění");
}
else{
 
}
Štartuješ Sessions aj na stránke s týmto overením (session_start();)?
Joker
Profil
Hanisx:
No prakticky žádní uživatelé tam nebudou, je tam pauze admin
Což neznamená, že to takhle může zůstat.

Ale jestli nejsou potřeba žádní jiní uživatelé kromě admina, asi bych se vykašlal na tyhle pokusy o registraci a udělal jednoduše zaheslovanou stránku.

Nějak takhle:
Stránka:
<?php
  session_start();
  header('Content-type: text/html;charset=UTF-8');
  require "zaheslovani.php";
  
  vyhod_neprihlasene();
?>
Tajný obsah stránky

zaheslovani.php:

<?php define("HESLO", '$2y$10$7kpEx.sDSnDL3dTTrVOFueZC4fu7QgqW3EjqTSRk79F6Eoer0amSu');
// Trochu prasácký způsob definování HTML kódu formuláře, lepší by byl zvláštní soubor/šablona:
define('LOGINFORM', '<form action="" method="post"><label>Heslo?</label><input type="password" name="heslo"><input type="submit" value="Odeslat></form>');

function prihlasit($heslo) {
  if (password_verify($heslo, HESLO)) {
    $_SESSION["admin"] = true;
    return true;
  }
  return false;
}

function odhlasit() {
    unset($_SESSION["admin"]);
}


function vyhod_neprihlasene() {
  if (empty($_SESSION["admin"])) { // není už přihlášený
    if (empty($_POST["heslo"])) {
      echo '<meta charset="utf-8">';
      echo LOGINFORM; 
      exit();
    }
    elseif (!prihlasit($_POST["heslo"])) {
      echo "Špatné heslo!";
      echo LOGINFORM;
      exit();
    }
  } 
  elseif isset($_GET["odhlasit")) {
    odhlasit();
    echo "Odhlášen!";
    exit();
  }
}

Poznámka, password_verify funguje až od PHP 5.5. Do PHP od 5.3.7 je lze doplnit (klíčový soubor je lib/password.php, ten je potřeba napojit přes require).
Pro starší verze PHP je nutné použít jiné ověření hesla, třeba přes crypt(), v úplně krajním případě mít v kódu heslo otevřené a použít operátor ===.

Heslo je určené tou konstantou HESLO a v ukázce to je „admin“. Změna hesla se udělá vygenerováním nového hesla přes password_hash.
Například tenhle skript vygeneruje a vypíše hash zadaného vstupu:
<?php
header('Content-type: text/html;charset=UTF-8');
if (isset($_POST["password"])) {
    echo password_hash($_POST["password"], PASSWORD_DEFAULT);
}
?>
<form action="" method="post"><input type="text" name="password"> <input type="submit" value="Vytvořit hash"></form>
Funguje opět od PHP 5.5, nebo od 5.3.7 s připojeným password.php.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0