Zabezpečte si své stránky pomocí PHP!

Jakmile si vytvoříte skripty např. pro správu databáze nebo pro jakýkoliv jiný účel, vždy každého napadne, jak si skripty zabezpečit tak, aby do nich nemohl vniknout neoprávněný uživatel.
Jakmile si vytvoříte skripty např. pro správu databáze nebo pro jakýkoliv jiný účel, vždy každého napadne, jak si skripty zabezpečit tak, aby do nich nemohl vniknout neoprávněný uživatel. Pomocí skriptu v tomto článku si stránky zabezpečíte tak, že se do nich nikdo žádným způsobem přes prohlížeč nedostane.

Každý, kdo si chce zabezpečit přístup ke svým skriptům, musí vytvořit přihlašovací formulář. Pomocí něho se odešlou proměnné a soubor, na který formulář poukazuje, se ověří srovnáním s databází, zda je uživatelské jméno a heslo v pořádku. Potom je teprve soubor přesměrován na určitý (chráněný) skript. Když ověření ve skriptu neproběhne správně a údaje se neshodují, skript automaticky přesměruje uživatele zpět na přihlašovací formulář, který mu vypíše, že údaje nebyly správné a že musí zkusit přihlásit se znovu.

Velkou otázkou ale zůstává, co dělat v situaci, když se neoprávněný uživatel bude chtít na skripty dostat přímým voláním, tj. když přihlašovací adresa bude např. www.server.cz/admin/index.php a chráněný skript bude na adrese www.server.cz/admin/secure.php. Pak se na skript jednoduše dostane a obejde tím authentifikaci. Když si ale do databáze při přihlašování uživatele zapíšeme několik údajů, nebude problém si ověřit, zda je uživatel přihlášen oprávněně, nebo jestli je systému neaktivní více jak 10 minut. Poté ho můžeme automaticky přesměrovat na přihlašovací skript (v našem případě index.php).

Název databáze je pouze a jenom na vás, já jsem si založil „secure“. Ale většinou když budete chtít vložit tyto skripty do již fungujícího systému, který běží na vytvořené databázi, budete nejspíše chtít, aby byly tabulky pohromadě.

Struktura tabulek je následující:

CREATE TABLE overeni (
  user text NOT NULL,
  datum int(11) NOT NULL
);

CREATE TABLE users (
  id int(11) NOT NULL auto_increment,
  login text NOT NULL,
  heslo text NOT NULL,
  PRIMARY KEY (id)
);

Přihlašovací formulář se bude jmenovat index.php:

<?
if ($vypsat=="wrong") {
echo "<center><font size=2 face=Verdana><b>Byly zadány chybné údaje.</b></font></center>";
}
?>
<form method="POST" action="auth.php" name="form">
<table width="300" border="0" align="CENTER">
<tr><td><div align="RIGHT"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Login:</font></b></div></td><td><input type="text" name="jmeno" size="20" maxlength="20"></td></tr>
<tr><td><div align="RIGHT"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Heslo:</font></b></div></td><td><input type="PASSWORD" name="heslo" size="20" maxlength="20"></td></tr><tr><td colspan="2"><center><input type="submit" name="Submit" value="Odeslat"></center></td></tr>
</table>
</form>

Jako další budeme potřebovat již zmíněný skript, který nám ověří, jestli jsou zadané údaje z formuláře správné. Bude se jmenovat auth.php:

<?
/* nastaveni promennych pro pripojeni do databaze */
$server = "localhost";
$login = "";
$pass = "";
$database = "secure";

/* pripojeni do databaze */
mysql_connect($server, $login, $pass);
mysql_select_db($database);

/* overime, zda takovy uzivatel exituje v databazi */
$vysledek=mysql_query("select * from users where login=`$jmeno` and heslo=`$heslo`");
$pocet = MySQL_Num_Rows($vysledek);

/* kdyz neexistuje, presmeruje nas to na prihlasovaci formular*/
if ($pocet=="0") {
Die(Header("Location: index.php?vypsat=wrong"));
}
/* zjistime aktualni cas, zjistime, jestli byl uzivatel za poslednich 10 minut prihlasen v systemu, a podle toho provedeme prikazy*/
$time = Time();
$vysledek=mysql_query("select * from overeni where user=`$jmeno`");
$pocet = MySQL_Num_Rows($vysledek);
/* kdyz uzivatel neni v databazi, tak ho pridame */
if ($pocet=="0") {
MySQL_Query("insert into overeni values(`$jmeno`, `$time`)");
}
/* kdyz v databazi je, tak mu prepiseme stare datum za nove */
else {
MySQL_Query("update overeni set datum=`$time` where user=`$jmeno`");
}

/* pomoci fce StrTr() zakodujeme login podle nastavenych znaku - prvni promennou urcime retezec, kde maji byt provedeny zmeny, druhou znaky, ktere maji byt zmeneny, a treti promenna obsahuje znaky, ktere prepisi ty z druhe promenne */
$a = StrTr($jmeno, "abcdefghijklmnopqrstuvwxyz1234567890", "qwertyuioplkjhgfdsazxcvbnm0147258369");

// presmerujeme vcetne zakodovaneho loginu na zabezpecenou stranku
Header("Location: secure.php?a=$a");
?>

A zde je zdrojový kód, který vložte do každého souboru, jenž chcete mít zabezpečený (měl by být vždy na začátku souboru):

<?
$server = "localhost";
$login = "";
$pass = "";
$database = "secure";

mysql_connect($server, $login, $pass);
mysql_select_db($database);

$a = StrTr($a, "qwertyuioplkjhgfdsazxcvbnm0147258369", "abcdefghijklmnopqrstuvwxyz1234567890");

$vysledek=mysql_query("select * from users where login=`$a`");
if (MySQL_Num_Rows($vysledek)=="0") {
Die(Header("Location: index.php"));
}
$time = Time();
$time_before = $time-900;
$vysledek=mysql_query("select * from overeni where datum < `$time_before`");
if (MySQL_Num_Rows($vysledek)=="1") {
Die(Header("Location: index.php"));
}
else {
MySQL_Query("update overeni set datum=`$time` where user=`$a`");
}

$a = StrTr($a, "abcdefghijklmnopqrstuvwxyz1234567890", "qwertyuioplkjhgfdsazxcvbnm0147258369");

echo "Pozor: toto je zabezpečený skript!";
?>

Jak vidíte, ve skriptu se připojuji k databázi tak, že v každém skriptu musím nastavit aktuální proměnné. Když se ale potom změní název databáze, budu muset v každém skriptu pracně měnit všechny proměnné. Tato situace se dá vyřešit díky funkci include(). Do souboru, který se bude jmenovat třeba config.php, dáme kód, kde se budeme připojovat do databáze, a do souboru, kde budeme chtít připojení použít, napíšeme pouze

include("config.php");

tím si rozhodně ušetříme práci.

Diskuze (22) Další článek: Slovensko: malý pohraniční styk

Témata článku: Software, PHP, Programování, Time, Maja, Login, Str, Nota, Pass, Select, Zeus, From


Určitě si přečtěte

Pojďme programovat elektroniku: Rádiový čip, který má skoro každá bezdrátová myš

Pojďme programovat elektroniku: Rádiový čip, který má skoro každá bezdrátová myš

** Bezdrátové myši řídí čip od Nordic Semiconductors ** Jeho rádiové vysílače si před lety oblíbila i komunita kutilů ** Dnes si je vyzkoušíme v praxi

Jakub Čížek | 9

Zorin OS 15: Vyzkoušejte další hezký a nenáročný linux pro mamku a taťku

Zorin OS 15: Vyzkoušejte další hezký a nenáročný linux pro mamku a taťku

** Ačkoliv je grafických linuxů plný internet, stále vládnou Windows ** Jeden z nich se jmenuje Zorin OS a nedávno se dočkal aktualizace ** Dělají jej dva kluci z Irska a je fakt hezký

Jakub Čížek | 115

Nejlepší notebooky do 20 000 Kč. Tipy, co se dnes vyplatí koupit

Nejlepší notebooky do 20 000 Kč. Tipy, co se dnes vyplatí koupit

** S cenou do 20 tisíc lze vybrat solidní notebook na práci i hry ** Přenosné notebooky nabídnou i kovová těla a rychlý hardware ** Na hraní se hodí více peněz, ale na použitelný základ dvacet tisíc stačí

Tomáš Holčík, David Polesný | 39

Biblická potopa Česka: Jak bychom dopadli, kdyby nás zatopil oceán

Biblická potopa Česka: Jak bychom dopadli, kdyby nás zatopil oceán

** Představte si biblickou potopu ** Nejprve zaniknou Děčín a Břeclav, pak i Brno a Praha ** Hlavním městem se stane Jihlava a zbytky Čechů přežijí na Kvildě

Jakub Čížek | 93

Antivir zdarma: 8 bezplatných řešení, která zatočí s havětí v počítači

Antivir zdarma: 8 bezplatných řešení, která zatočí s havětí v počítači

** Součástí Windows 10 je integrovaný antivirový program. Stačí to? ** Představíme vám sedm aplikací na boj proti virům a malwaru ** Všechny jsou k dispozici zdarma a některé ani nemusíte instalovat

Karel Kilián | 31

Pozor, na Česko v těchto dnech útočí falešné Tesco, Penny Market a Lidl

Pozor, na Česko v těchto dnech útočí falešné Tesco, Penny Market a Lidl

** Máme tu další českou phishingovou vlnu ** Podle průzkumů máme stále problém s kybernetickou gramotností ** Nebezpečím jsou děti, které opouštějí rodiče

Jakub Čížek | 34


Aktuální číslo časopisu Computer

Megatest: 20 powerbank s USB-C

Test: mobily do 3 500 Kč

Radíme s výběrem routeru

Tipy na nejlepší vánoční dárky