Autor Zpráva
fodsqa
Profil
DObrý deň mám takýto problem , neviem kam som to mal zaradiť tak to hadžem sem. Mám vytvorenú registráciu , po kliknutí na registrovať mi všetko ide až na to že mi hodnoty z Registru nezapisuje do MySql tabulky. Prosím o radu , ja som z toho už zúfalý :/

Tu je kód registrácie
<form action="register.php" method="POST">
          <strong>
            Username: <input type="text" name="username"/><br />
            Password: <input type="password" name="password"/><br />
            E-mail: <input type="text" name="email"/><br /><br />
            <input type="submit" name="register" value="Register"/><br></strong>
          </form>

a tu je kód samotného "register.php"
<?php
$servername = "localhost";
$username = "fodsqa";
$password = "heslo";
$dbname = "fodsqa";
$meno = "username";
$heslo = "password";
$mail = "email";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 

$sql = "INSERT INTO users (username, password, email)
VALUES ('$meno', '$heslo', '$mail')";

if ($conn->query($sql) === TRUE) {
    echo "Uspešne zaregistrovaný";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

$conn->close();
?>
jefitto44
Profil
$username a $password sa ti nebijú?
Navyše, ak nemáš zapnutý register globals, tak potrebuješ do DB ukladať pomocou superglobálnej premennej $_POST

register.php by som upravil asi takto
<?php
$servername = "localhost";
$usernamedb = "fodsqa";
$passworddb = "heslo";
$dbname = "fodsqa";
/*$meno = "username";
$heslo = "password";
$mail = "email";*/
 
$conn = new mysqli($servername, $usernamedb, $passworddb, $dbname);
 
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
} 
 
$sql = "INSERT INTO users (username, password, email)
VALUES ('".$_POST["username"]."', '".$_POST["password"]."', '".$_POST["email"]."')"; // musia tu byť bodky, inak bude syntax error
 
if ($conn->query($sql) === TRUE) {
    echo "Uspešne zaregistrovaný";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}
 
$conn->close();
?>



Ešte to treba pozrieť, tu sa dosť blbo píše kód, takže aj môj zápis bude zaiste obsahovať nejaké syntax errory
anonymníí
Profil *
jefitto44:
$username a $password sa ti nebijú?
Proč by se měly být? Pokud by se přepisovaly, uložení do DB proběhne, jen s hodnotami definovanými ve scriptu, ne těmi z formuláře.

tu sa dosť blbo píše kód, takže aj môj zápis bude zaiste obsahovať nejaké syntax errory
Tak piš kód jinde a nakopíruj ho sem. Nebo nepiš. Kód plný chyb je zbytečný.

fodsqa:
Co znamená, že nezapisuje hodnoty? Píše to nějakou chybu? Máš zapnutý výpis chyb?

Kromě toho, že neošetřuješ vstupy do DB, tedy funkcemi na to určenými, a že heslo nehashuješ, v kódu chybu nevidím.
fodsqa
Profil
jefitto44:
Ježiši ďakujem vám veľmi pekne , už mi to funguje žiadné syntax mi neukazovalo :) , možno by ste mi vedeli poradiť čo dodať do kódu aby ma to po registrovaní hodilo s5 na registračnu stránku (na stránke je login a register)


anonym vobec netuším čo mysliš tým hashovanim , a ani ošetrovaním DB , Nezapisuje hodnoty že ked sa zaregistrujem tak mi ich nenapíše do databázi , chybu nepíše a výpis chýb ani netušim kd eje ,kde sa zapina atď
lionel messi
Profil
fodsqa:
, možno by ste mi vedeli poradiť čo dodať do kódu aby ma to po registrovaní hodilo s5 na registračnu stránku (na stránke je login a register)

if ($conn->query($sql) === TRUE) {
    header("Location: index.php");
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}
jefitto44
Profil
Ak chybu nevidíš, tak sa treba pozrieť poriadne. Nie len tak ledabolo :P

Hashovanie a ošetrovanie vstupov súvisí s bezpečnosťou webovej aplikácie. Týpci ako anonymní totiž nechápu, že na túto diskusiu chodia väčšinou začiatočníci, alebo lamy (ako ja), ktorý sa chcú niečo naučiť a v tejto fáze ich skúsenosti ich absolútne nijaké ošetrovanie vstupov nezaujíma a je pre nich zbytočné strácať čas ošetrovaním vstupov na localhoste...

Ale budiž.

Ide o to, že ak dáš svoj výtvor na net, okrem bežných ľudí ti tam budú chodiť roboty a aj spamboty. Alebo rôzni iní parchanti, ktorí sa budú snažiť zhodiť tvoju aplikáciu (či už je to stránka, alebo facebook, experti sa nájdu všade). A oni využívajú napr. SQL injection , to je taká haluz, že do kolónky na užívateľské meno by som ti nezadal užívateľské meno, ale nový SQL dotaz štýlom
-- DELETE * WHERE 1 // alebo niečo podobné.
Tým by ti v premennej $username neprišlo moje užívateľské meno, ale sql dotaz, ktorý by vymazal databázu. Predstav si, že by tvoja aplikácia bola napr. travian a niekoľkým tisícom hráčov by som takto zrušil hráčske účty. Alebo že by to bol nejaký internet banking a ja by som ti vymazal všetkých klientov a ich účty. To by bol bordel. Preto je treba vstupy ošetrovať. Na to je iks spôsobov a nechce s ami o tom bľabotať, keďže v aktuálnom stave tvojich vedomosti to pravdepodobne nepotrebuješ.

Hashovanie je šifrovanie hesla. Ide o to, že pri zadávaní hesla databáza nevidí heslo ako také. Vidí iba jeho hash- čiže jeho šifru/ jeho otlačok. Teda napr. moje heslo by bolo "lajno", ale do databázy by sa uložilo niečo ako "as54ad4f85a46df4a68d4sfa84f6". A tiež pri každom prihlásení by sa neporovnávalo, či užívateľ zadal do inputu "lajno", ale či zadal "as54ad4f85a46df4a68d4sfa84f6" (čo je vlastne šifrované lajno). Je to bezpečnejšie.

Je kopec spôsobov ako hacknuť webovú aplikáciu, napr. v robote sme donedávna používali taký "shit" systém, že stačilo do prihlasovacieho formulára zadať
$_SESSION["user_id"]=1;
a človek sa prihlásil ako administrátor bez toho, aby vôbec niečo musel zadávať...

Potom existujú nejaké srandy s GET, keď si do adresy stránky za otáznik dopíšeš vlastnú premennú a môžeš tým niečo dodrbať... hovorím, toto je problematika na dlhšie písanie
anonymníí
Profil *
jefitto44:
Týpci ako anonymní totiž nechápu, že na túto diskusiu chodia väčšinou začiatočníci
Právě začátečníky je třeba směrovat správným směrem.

ich absolútne nijaké ošetrovanie vstupov nezaujíma
Učit se špatným návykům a pak se přeučovat je horší, než se učit psát spávně od začátku, i když to trochu bolí.

Hashovanie je šifrovanie hesla.
Ne. Hash != šifra.

Hash je jednosměrný (nejde zjistit hashovanný string), šifra obousměrná (jde rozšifrovat).
lionel messi
Profil
jefitto44:
Je fajn, že sa snažíš poradiť, ale niektoré pasáže by som uviedol na pravú mieru:

Týpci ako anonymní totiž nechápu, že na túto diskusiu chodia väčšinou začiatočníci, alebo lamy (ako ja), ktorý sa chcú niečo naučiť a v tejto fáze ich skúsenosti ich absolútne nijaké ošetrovanie vstupov nezaujíma a je pre nich zbytočné strácať čas ošetrovaním vstupov na localhoste...
Neošetrovať vstupy je mimoriadne zlý a nebezpečný programátoryký návyk. Ošetrovanie a strata času? Myslíš vážne?

A oni využívajú napr. SQL injection , to je taká haluz, že do kolónky na užívateľské meno by som ti nezadal užívateľské meno, ale nový SQL dotaz štýlom
-- DELETE * WHERE 1 // alebo niečo podobné.
Blábol, ak zadám iba toto do inputu, nič sa nestane (chýba apostrof). Zlyhal by si ešte aj ako hacker. :-) Presnejšie to je trebárs tu: cs.wikipedia.org/wiki/SQL_injection

Na to je iks spôsobov a nechce s ami o tom bľabotať, keďže v aktuálnom stave tvojich vedomosti to pravdepodobne nepotrebuješ.
Stačí spomenúť Definitivní příručka escapování alebo funkciu mysql_real_escape_string, prípadne jej alternatívu pre MySQLi.

Hashovanie — budiž, tam sa nijak extra nemýliš, len doplním, že hash nie je šifra a najlepšia hashovacia funkcia je password_hash.

Potom existujú nejaké srandy s GET, keď si do adresy stránky za otáznik dopíšeš vlastnú premennú a môžeš tým niečo dodrbať...
Ireleventné, bez príkladu, objasnenia z toho fodsqa veľa nepochopí. Nech si radšej pozrie článok: cs.wikipedia.org/wiki/Cross-site_scripting
jefitto44
Profil
Schválne, zadaj hash, či ho nerozšifrujem ;)
Tomáš123
Profil
jefitto44, lionel messi:
Myslite na to, že sa nachádzate na diskuse.jakpsatweb.cz, nie diskuse.jakhecknoutweb.cz!
lionel messi
Profil
jefitto44:
Schválne, zadaj hash, či ho nerozšifrujem ;)
Nech sa páči: 5d4d25c19deb96cc08562e652d9894facdc27ff6
Mám uviesť hash funkciu?
fodsqa
Profil
Ahá dobre chápem , či že ak to nezabezpečim tak mi niekto pomocov zadaného príkazu može vymazať databázu,prihlásiť ako administrátor. Ako to mám teda ešte aj proti hentomu poistit? Kedže áno som začiatočnik ale učím sa formov že si dám ciel a chcem ho spraviť (tentokrát je to dáka PHP strategy hra ,krátka ale zato by mala byť 100% funkčná)
lionel messi
Profil
fodsqa:
Ako to mám teda ešte aj proti hentomu poistit?
Definitivní příručka escapování
mysql_real_escape_string (prípadne mysqli_real_escape_string, podľa toho, čo používaš)

$sql = "INSERT INTO users (username, password, email)
VALUES ('".mysql_real_escape_string($_POST["username"])."', '".mysql_real_escape_string($_POST["password"])."', '".mysql_real_escape_string($_POST["email"])."')";
anonymníí
Profil *
lionel messi:
Ne.

- heslo se hashuje (chybí ti hashovací funkce)
- hash je bezpečný string, netřeba dále escapovat
- fodsqa používá mysqli, nevím, proč uvádíš příklad s mysql funcemi, které jsou deprecated

fodsqa
$sql = "INSERT INTO (...) 
        VALUES ('" . $conn->real_escape_string($_POST['username']) . "', 
                '" . sha1($_POST['password']) . "', 
                '" . $conn->real_escape_string($_POST['email']) . "')";

/* sha1 je hashovaci funkce, pro začátek asi celkem snadno pochopitelná, mrkni do manuálu */
lionel messi
Profil
anonymníí:
- fodsqa používá mysqli, nevím, proč uvádíš příklad s mysql funcemi, které jsou deprecated
Neovládam totiž objektový prístup k MySQLi a nemám čas ho v tejto chvílli študovať, ako presne funguje.
anonymníí
Profil *
lionel messi:
Pokud neovládáš, tak je lépe nepsat. Začátečníka, který používá správné funkce, akorát mateš.

Začátečník neví, nebo spíše nemusí vědět, je to je de facto ekvivalent a dá se z toho odvodit správný název funkce. Zbytečně se bude zabývat chybami, které mu v důsledku tvého kódu vzniknou, úplně zbytečně.
fodsqa
Profil
anonymníí:
Keď prepíšem moj kód z tým tvojím malo by to byť okej? poprípade treba potom niečo aj pri prihláseni spraviť? či nie?
fodsqa
Profil
jefitto44:
Pán jefitto44 neberem to ako urážku, ide o to že ja som o tom ani nevedel že je taka možnost , ako videl som to v dákych tutorialoch ale celý čas som bol v tom že ta funkcia je kôli niečomu inemu a nie kvoli bez pečnosti :) :/
Alphard
Profil
fodsqa [#20]:
Je tam hlavně kvůli funkčnosti, problémové znaky na vstupu by ten script rozbily. Někdo by je tam mohl zadat i náhodou, nemusel by to myslet špatně. Vkládat záměrně takové vstupy, které naruší bezpečnost, je věc druhá.

V každém případě, takovéto skládání dotazů je pravěké, samozřejmě beru, že teď nemáte čas učit se nové věci, ale doporučuji vyhradit si co nejdříve čas na studium – mysqli::prepare.

jefitto44 [#19]:
Komunikovat lze i bez vulgarit, zkuste to prosím.
Fisir
Profil
Reaguji na fodsqu:
Keď prepíšem moj kód z tým tvojím malo by to byť okej?
S tím, že si do první závorky doplníš požadované sloupce. Pokud heslo budeš hashovat (k tomu slouží například funkce sha1, netřeba ji escapovat, výsledek jsou s jistotou pouze písmena a čísla), je třeba upravit přihlášení. Místo klasického:
if($_POST['heslo'] === $hash_hesla_z_databaze)
je třeba porovnávat hashe hesel (protože ty sis tím pádem do databáze neuložil heslo, ale jen jeho hash), takže musíš stejnou hashovací funkcí zahashovat i heslo, které ti poslal uživatel ve formuláři:
if(sha1($_POST['heslo']) === $hash_hesla_z_databaze)

Reaguji na anonymníího:
Technicky vzato, s dnešním výkonem počítačů už ani SHA-1 algoritmus není relativně tolik bezpečný. Nejlepší by asi bylo použít nativní funkce PHP password_hash a password_verify, záleží ale, jestli fodsqa má odpovídající verzi PHP na serveru (≥ 5.5.0).
fodsqa
Profil
Fisir:
Server:WAMP a verzia PHP 5.5.12 nechápem "≥" tak preto píšem verziu , čo sa týka hesla malo by to byť takto
if(sha1($_POST['heslo']) === $hash_hesla_z_databaze)
=
if(sha1($_POST['heslo']) === $password)
?
ak som správne pochopil? čiže ked užívatel zada heslo ake daval pri registráci ono ho automaticky za HASHuje a zhodnotí z tým zaHASHovanim v databaze, ak sa nemílim :) či?
Fisir
Profil
Reaguji na fodsqu:
nechápem "≥"
Větší nebo rovno. Ty ale zmíněné funkce password_hash a password_verify nepoužíváš, takže je to jedno.

či?
Ano, správně, pokud ta proměnná $password bude obsahovat hash uživatelova hesla (tedy, pokud ho tak registrační skript uloží do databáze).

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: