Jump to content
  • Announcements

    • Xmat

      Pravidlo pro postování v TTT

      Do sekce Tipy, triky, tutoriály nepatří žádné dotazy.   Postujte sem vaše návody, tipy a různé další věci jež uznáte za vhodné sdělit zdejšímu osazenstvu, ale veškeré dotazy směřujte do sekce Všeobecná diskuse.
    • Replik

      Seznam návodů a důležitých témat v této sekci

      Pro lepší přehlednost jsem vytvořil tento seznam, který vás, méně zkušené, lépe provede touto sekcí. Věřím, že zde najdete, co hledáte. Vypsané jsou návody, které jsou oficiálně uznané jako návody. Běžné diskuze, které neposkytují postupy a rady zvěřejněny nejsou.   Instalace vlastního MaNGOS Serveru Díky těmto návodům budete (měli by jste být) schopni vytvořit a následně spustit váš vlastní server. Nastavení je pro verze s i bez datadisku.   Instalace MaNGOS Serveru (bez datadisku TBC) - Autor Benny Instalace MaNGOS Serveru (s datadiskem TBC) - Autor Malfik Instalace MaNGOS Serveru v prostředí Linux - Autor charlie Instalace MaNGOS Serveru v prostředí Linux - Autor kupkoid   Chyby a jejich řešení při přihlašování k serveru - Autor Cybe   Zálohování uživatelských dat   Dávkový soubor (BAT soubor) pro vytvoření SQL záloh - Autor Replik   Kompilování - tvoření vlastních release (revizí)   Tvorba kompilací pro Win32 (MangoScript) - Autor bLuma   Ostatní - těžko zařaditelné, ale neznamená to, že nejsou dobré   VIP Systém - Autor charlie Tvorba Webových stránek pro MaNGOS - Autor zahuba Tvorba teleportačních NPC (MangoScript) - Autor Replik Registrační web (původně předělaná SPORA) Funkční pro Antrix i MaNGOS - Autor Replik Nastavení a spuštění Minimanager pro MaNGOS - Autor BlackMartin Nastavení MaNGOS Website - Autor Artorius   Samozřejmě jsou zde i jiné návody, ale tyto jsou nejvíce používané, proto věřím, že vám budou nápomocné. Tuto sekci budeme upravovat podle potřeby. Pokud by jste něco nenašli nebo si nevěděli rady, hledejte na fóru a teprve potom založte vlastní topik. Pokud nějaký autor vytvoří kvalitní návod a chtěl by ho zveřejnit i v tomto seznamu, doporučuji, aby mi napsal zprávu skrze PM.   Díky a přeji hezký den na WoWResource   Replik
    • Aristo

      Příspěvky tam, kde nemají co dělat

      Dodržujte zákaz přispívání do topiků s repaky pokud si to zakladatelé nepřejí!! Opakované psaní příspěvků bude trestáno warnem.
    • Aristo

      Používání spoilerů

      Poslední dobou má většina uživatelů fora zvláštní nutkání postovat extrémně dlouhé texty nebo kódy, které zabírají v nejedenom případu i 80% obsahu celé stránky a hodně tak zvedají nepřehlednost v topiku. Chtěl bych všechny uživatele požádat, aby při postování citací, jakýchkoliv kódů, errorů, atp... delších než 30 řádků používali funkci spoileru.   Funkci vyvoláte příkazem [spoiler] text [/spoiler]   Ukázka:  
Sign in to follow this  
Hkarta

[PHP] Jednoduchý systém registrace pro web

Recommended Posts

Je to super, alespoň je vidět dobře ten základní princip. Na začátek a pochopení to bohatě stačí. Když se v tom trochu začnete hrabat a fakt vám na tom bude záležet, tak si to vyčilézujete. :D

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

Kedysi som som potreboval pochopiť registrácie, nastavenie SESSIONu pri lognutí.Už som sa to doučil ale toto istotne pomôže takým ako som ja.Je to krátke, prehladné a funkčné! +REP!!

Share this post


Link to post
Share on other sites

nevím co dělám špatně ale mě osobně to nefunguje :), nejnovější xampp, mysql atd ... ale register.php mi nefunguje a nehlásí ani chybu

Share this post


Link to post
Share on other sites

nevím co dělám špatně ale mě osobně to nefunguje :), nejnovější xampp, mysql atd ... ale register.php mi nefunguje a nehlásí ani chybu

jak ti tohle nemuze fungovat? na to musis mit talent ne? a jeste ktomu bez nejakyho erroru

Edited by STONERSVK

Share this post


Link to post
Share on other sites

Jenom bych dodal k bezpečnosti:

  1. addslashes() neznamená ochránění proti SQL Injection
  2. není ochrana proti session hijacking

Vím že je to jen jednoduchý příklad, jak registraci řešit. Nicméně zabezpečení by mělo být vždy a všude.

Dále poznámka, ale to je jen můj coding-style, rekurzivně prochazet POST i GET je prasárna, proč neošetřovat jen to co použiju? Aneb mikrooptimalizace.

 

@Funner

Koukni do nastavení PHP a zkontroluj nastaveni direktivu error_reporting, zda nemá hodnotu False - zakazuje zobrazení hlášek.

Dále můžes kouknout do logů, co ti apache / php píše.

Edited by ntdrt

Share this post


Link to post
Share on other sites

To vůbec není pravda, jsou metody které zmenší šanci na minimum.

 

Přenastavení php direktiv pomocí ini_set - ukládání session JEN do cookies, znepřístupení ID pomocí javascriptu.

Nebo ověřovat identitu uživatele - IP, USER_AGENT.

 

Možností je mnoho ale většinu útoku odrazí vygenerování nového ID ihned po přihlášení. Také není moudré do sessionu ukládat konkretní údaje, viz ID uživatele v databázi.

 

Pokud je šance méně jak 5%, je to dle mě dosti účinné řešení.

Edited by ntdrt

Share this post


Link to post
Share on other sites

Jenom bych dodal k bezpečnosti:

  1. addslashes() neznamená ochránění proti SQL Injection
  2. není ochrana proti session hijacking

Vím že je to jen jednoduchý příklad, jak registraci řešit. Nicméně zabezpečení by mělo být vždy a všude.

Dále poznámka, ale to je jen můj coding-style, rekurzivně prochazet POST i GET je prasárna, proč neošetřovat jen to co použiju? Aneb mikrooptimalizace.

...

1/ Ano, máš pravdu, jedná se o opravdu jednoduchý příklad. Nejdříve ohledně rekurzivního procházení: spolehlivě to poskytuje aspoň základní ochranu pro všechny proměnné, které uživatel přidá. Jakože se určitě nespokojí s těma pár proměnnými co používám. Zroveň to podle mě není neefektivní, jelikož ošetřené by imho měly být všechny proměnné které do scriptu vstupují. Navíc servery už neběží na starých 486, takže těch pár operací se ztratí, pokud nemáš návštěvnost blížící se milionu. A v takovém případě si asi registraci nebudeš bastlit doma na koleni.

 

2/ Šance, že nějaký rádobyhacker se bude snažit sundat web dotyčného je minimální; navíc, základní ochranu to poskytuje. Minimálně proti rádobyhackerům. zároveň, sundat se dá všechno, ať použiješ jakoukoliv ochranu. Imho není nutné brát na komára kulomet, pro potřeby mého příkladu addslashes bohatě stačí a šance, že to někdo prolomí se blíží nule.

 

Každopádně děkuji za kritiku, případným zájemcům to poskytuje další směr kterým rozvíjet své znalosti.

  • Upvote 4

Share this post


Link to post
Share on other sites

Bezpečnost beru jako dosti důležitou součást programování. Možna to bude tím, že jsem si zvykl na jiný přístup k věci - když už, tak pořádně. Když někoho něco učím, snažím se aby to uměl nejméně dobře jako já.

 

Jinak já bych daný web smazal naprosto bez problémů a to nejsem žádný extra odborník, natož 'hacker'.

 

Jak mluvíš o kulometu na komára, tak to bych neoznačil jednu funkci co ti zajisti ochranu proti ukradnutí session ale spíše to systematické procházení requestů.

Pomocí tvého scriptu dokážu lehce shodit jakékoliv VPS, či starší dedikovaný server. Je to fajn, když se o ošetření nemusíš starat, do té doby než přijde někdo s UNIXem a jedním PHP scriptem na 5 řádku, těch requstů nedostaněš 10 ale 10 tisíc a to už nějaký CPU time zabere. Systém se s tím popere, pokud to ale nebudu opakovat každých 5 sekund.

 

Útoky typu DoS jsou více než reálné, zrovna v pondělí jsem zachytil jednoho útočníka co mě spamoval mail server (výsledkem bylo 8GB ve swapu), měsíc zpatký to byl robot co skenoval apache. A i já sám jsem dříve pár botů napsal.

 

[následující odstavec neber až tolik vážně]

Nejhorší je domino efekt, jeden BFU si tohle okopíruje na své stránky, jeho kamaradovi se to bude líbit, tak si to nechá taky poslat a tak dále a dále, hle na internetu je najednou plno děravých webů.

Edited by ntdrt

Share this post


Link to post
Share on other sites

K výše zmíněným připomínkám bych jen dodal, že je vhodné ošetřovat i klíče polí.. když už se počítá s tím, že jich bude chtít uživatel používat víc. Pro escapovani dat do db použít funkce na to urcene (mysql_real_escape_string), místo include použít require, protože script na něj očividně spoléhá a pak maličkosti jako unsetovat vars pro připojení k db a případně hlídání navratovych hodnot aspoň u mysql_query. :)

 

Ale jako jednoduchá kostra, podle které by šlo postupovat je to hezké)

 

Jinak já bych daný web smazal naprosto bez problémů a to nejsem žádný extra odborník, natož 'hacker'.

 

Pomocí tvého scriptu dokážu lehce shodit jakékoliv VPS, či starší dedikovaný server. Je to fajn, když se o ošetření nemusíš starat, do té doby než přijde někdo s UNIXem a jedním PHP scriptem na 5 řádku, těch requstů nedostaněš 10 ale 10000 a to už nějaký CPU time zabere. Systém se s tím popere, pokud to ale nebudu opakovat každých 5 sekund.

 

Ad jedna: to mne zajímá, jak, jen dle zmíněného kousku src, můžeš tvrdit, že bys daný web v klidu smazal.. celkem odvážné tvrzení. Předpokládám, že máš vestecke sklony.. pokud ne, rád bych od tebe viděl nástin řešení pokud se budeme držet toho, co zde bylo publikováno.

 

Ad dvě: DOS obrana je preci primárne záležitostí konfigurace serveru. Samozřejmě by bylo vhodné řešit to i na straně prezentace (např captcha u formu - což abychom se nepochopili špatně není obrana proti DOSu, ale proti robotum celkově a proto to tu zmiňuji), ale to je značně nad rámec topicu

Edited by Filgron

Share this post


Link to post
Share on other sites

At delam co delam porad mi to nefunguje.

 

test.php

<?php include "db.php";
if (isset($_POST['jmeno']) && isset($_POST['heslo']) && isset($_POST['mail']))
{
 $sql = mysql_query("SELECT id FROM uzivatele WHERE jmeno = '$_POST[jmeno]');") or die (mysql_error());
 if(mysql_num_rows($sql) == 0)
   $error = "chyba: uživatel existuje";  
 else 
 {
   mysql_query("
     INSERT INTO uzivatele 
     (`jmeno`, `heslo`, `mail`, `click`)
     VALUES
     ('$_POST[jmeno]', '".sha1($_POST['heslo'])."', '$_POST[mail]', '0');") or die (mysql_error());
   echo "registrace úspěšná";  
 }
}
else
{
 ?>
 <form id="frm" name="frm" method="POST" action="test.php">
     <span>Login</span><input type="text" name="jmeno">
     <span>Heslo</span><input type="password" name="heslo">
     <span>Email</span><input type="text" name="email">
     <input type="submit" value="odeslat">
 </form>                                                            
 <?php
}   
?> 

 

db.php



<?php
$host = 'localhost';
$user = 'root';
$pass = 'root';
$db = 'soutez'; 
$connect = mysql_connect($host, $user, $pass);
mysql_select_db($db); 

foreach($_POST as $Index => $Item) $_POST[$Index] = addslashes($Item);
foreach($_GET as $Index => $Item) $_GET[$Index] = addslashes($Item);
?>

 

sql

CREATE TABLE `uzivatele` (
  `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `jmeno` text ,
  `heslo` text ,
  `mail` text ,
  `click` int(11) NOT NULL 
   ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Edited by Funner

Share this post


Link to post
Share on other sites

v test.php nemáš session_start();

presto stale nefunkcni)

 

a jeste bych se chtel zeptat jak udelat aby kdyz klikne nekdo na odkaz www.lama.cz/link.php?id=5 , mohl kliknout pouze jednou za den ( neboli aby se 1 klik na ten odkaz zapocital od kazdeho uzivatele maximalne 1 denne. Díky

Edited by Funner

Share this post


Link to post
Share on other sites

Ad jedna: to mne zajímá, jak, jen dle zmíněného kousku src, můžeš tvrdit, že bys daný web v klidu smazal.. celkem odvážné tvrzení. Předpokládám, že máš vestecke sklony.. pokud ne, rád bych od tebe viděl nástin řešení pokud se budeme držet toho, co zde bylo publikováno.

 

Ad dvě: DOS obrana je preci primárne záležitostí konfigurace serveru. Samozřejmě by bylo vhodné řešit to i na straně prezentace (např captcha u formu - což abychom se nepochopili špatně není obrana proti DOSu, ale proti robotum celkově a proto to tu zmiňuji), ale to je značně nad rámec topicu

Tady ani nejde o obranu proti DoS, prostě mít cyklus, který ovládá uživatel je BLBOST. To byl příklad jak se toho do hodně lehce zneužít.

 

K tomu SQL Injection, mám strukturu databáze, mám zdrojové kódy, programator použil JEN addslashes, tak co vidíš za problém?

 

a jeste bych se chtel zeptat jak udelat aby kdyz klikne nekdo na odkaz www.lama.cz/link.php?id=5 , mohl kliknout pouze jednou za den ( neboli aby se 1 klik na ten odkaz zapocital od kazdeho uzivatele maximalne 1 denne. Díky

Aby si omezil to klikání, v cílovém scriptu - kam vede odkaz, musíš udělat ověřování, buťto ukládání IP adres + čas do databáze nebo uživateli dát cookies (nebezpečné, uživatel může cookies smazat :)). Místo IP můžeš dát i číslo přihlášeného uživatele, tedy jeho ID.

 

...
/*
CREATE TABLE `adresy` (
 `ip` varchar(50) COLLATE utf8_czech_ci NOT NULL,
 `cas` bigint(40) NOT NULL,
 PRIMARY KEY (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci
*/

$cas = time();
$vysledek = mysql_result(mysql_query("SELECT COUNT(ip) FROM adresy WHERE ip = '{$_SERVER["REMOTE_ADDR"]}' AND cas + 86400 > {$cas}"), 0);
if($vysledek == 0){
 mysql_query("REPLACE INTO adresy VALUES ('{$_SERVER["REMOTE_ADDR"]}', {$cas})");
 echo "ty jsi tu jeste nebyl";
}else{
 echo "jdi pryc a vrat se za 24 hodin";
}
...

Edited by ntdrt
  • Upvote 1

Share this post


Link to post
Share on other sites

Když ti neco nejde, bylo by dobrý říct co přesně nejde, kde to skončí, co ti program řiká (reportuje chyby?).

Nebo dát script na veřejné místo a poslat odkaz. Jinak se radí dost špatně.

Share this post


Link to post
Share on other sites

Tady ani nejde o obranu proti DoS, prostě mít cyklus, který ovládá uživatel je BLBOST. To byl příklad jak se toho do hodně lehce zneužít.

 

K tomu SQL Injection, mám strukturu databáze, mám zdrojové kódy, programator použil JEN addslashes, tak co vidíš za problém?

 

Ad DOS: zkus nastínit řešení, kdy se tedy uživatel zkusí registrovat/přihlásit, ovšem dle tvé logiky tak, aby aby nebyl ovládán uživatelem.

 

Ad inject: pokud si myslíš, že máš vše potřebné, prosim demonstruj s uvedenými src tvé smazání webu.

 

//edit: až teď mně napadla možnost, že každý myslíme něco jiného (ty očividně kontrolu polí), což ano je reálné.. ale ad2 platí :)

Edited by Filgron

Share this post


Link to post
Share on other sites

Když už, tak bych to řešil po PM a né tady. Není moc chytré uživatelům dát příklad a hned podním script, s kterým mu to "kámoš" smaže. Jinak posílal jsem odkaz, kde se tohle přesně řeší.

 

Ty nechápeš jednu věc, cyklus prochází VŠECHNY položky v requestech, stačí tí do URL naskládat spoustu položek ?bla=1&bla=1&bla=1&bla=1&bla=1&bla=1&bla=1 a hned máš kupu požadavků, URL má omezéní ale POST ne, tam mužeš odesílat stovky prvků.

 

Já mám na mysli jen kontrolu polí.

Edited by ntdrt

Share this post


Link to post
Share on other sites

To, že myslíš to kopírování a ne celý script, mně napadlo víceméně hned po postnuti prispevku, taky jsem to hned editoval.

 

Jinak pokud to nechceš konkrétně řešit tu, chápu a PM uvítám :)

Share this post


Link to post
Share on other sites

Teď jsem to splácal jako odpověď na jeden topic, tak to ukládám do vlastního topicu pro potřeby dalších generací. smile.gif

 

Sql

CREATE TABLE `users` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `login` text,
 `password` text,
 PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

 

Sorry, že otravuju s takovou blbostí, ale není mi jasný kam s tim "sql" .. mám web, upravuju ho přes winscp... mám tam index.php, config.php (ten tvůj) .. register.php a login.php jsem nedělal zatim zvlášť do souboru, jen jsem ten kod hodil na stránku .. to tam je vpohodě si myslim.. ale jedinej ten sql kod netušim kam dát.. jestli taky zvlášť do složky, nebo do toho html kódu před ty php scripty.. zkoušel jsem to dávat různě do toho html kódu ale to je asi hloupost, pokaždý mi to vyhodilo asi 8 errorů o tom že nenašlo databazi sql... na webhostingu (ic.cz) mi píšou že mám mysql datbázi aktivní.. jde mi jen o tom kam těch 6 řádků kódu vložit ?

Share this post


Link to post
Share on other sites

V Navicatu se připoj k MySQL serveru a nahraj to do DB. Najdi si na netu návod, jak aplikovat příkazy na MySQL databázi.

Edited by Wolf Officious

Share this post


Link to post
Share on other sites

Měl by sis nejdřív přečíst, co to SQL je a hlavně co je to databáze...

 

Tvůj webhosting má nějakýho správce databáze (určitě se jmenuje phpMyAdmin). Tak si ho najdi a tam máš možnost importovat SQL soubory/spustit SQL příkazy. Popřípadě tu tabulku vytvořit ručně.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×