Autor Zpráva
_fantomas
Profil
Ahoj, učím sa v PHP OOP a moc mi to ešte nejde, vytvoril som si triedu User ktorá registruje uživateľa, formulár zapisuje pekne do DB ale problém je v tom že neviem ako mam pripísat funkciu mysqli_real_escape_string skúšal som to už hocijak ale vždy mi stránka vypíše chybu že to tam proste tu funkciu zlé mam napísanu... mohli by ste mi pomôct?

Kod triedy User:
BTW: Je to uplne dole premenná $sql1
<?php
include 'db_config.php';

class User {
    public $db;
    
    public function __construct() {
        $this->db = new mysqli(DB_SERVER, DB_USER, DB_PASS, DB_DATABASE);
        if(mysqli_connect_errno()) {
            echo 'Error: Could not connect to database.';
            exit;
        }
    }

    public function userReg() {
        $uname = $_POST['uname'];
        $upass = hash('SHA512', $_POST['upass']);
        $upass2 = hash('SHA512', $_POST['upass2']);
        $uemail = $_POST['uemail'];
        $error = '';
        
        if(empty($uname) OR empty($upass) OR empty($uemail)) {
            $error = 'Vyplnte vsetky polia';
        }
        elseif(strlen($uname) <= 5) {
            $error = 'Meno je kratke';
        }
        elseif(strlen($upass) <= 10) {
            $error = 'Heslo musi obsahovat viac než 10 znakov';
        }
        elseif($upass != $upass2) {
            $error = 'Hesla sa nezhoduju';
        }
        if(empty($error)) {
            $sql = "SELECT * FROM users WHERE username='$uname' OR email='$uemail'";
            
            $check =  $this->db->query($sql);
            $count_row = $check->num_rows;
            
            
            if($count_row >= 1) {
                echo 'Uživateľ už existuje!';
                return false;
            }
            else {
                $sql1 = "INSERT INTO users SET username='" . mysqli_real_escape_string($this->db->$uname) . "', password='$upass', email='$uemail'";
                $result = mysqli_query($this->db, $sql1) or die(mysqli_connect_error()."Chyba zápisu dát do DB!");
                echo 'úspešne zaregistrovaný';
                return $result;
            }    
        }
        else {echo $error;}
    }
}
lionel messi
Profil
_fantomas:
$uname = $this->db->real_escape_string($_POST['uname']);

A v sql dotazoch stačí používať premennú $uname, čiže:
$sql1 = "INSERT INTO users SET username='$uname'"; //a tak ďalej

Analogicky zabezpečíš aj ďalšie premenné.
_fantomas
Profil
Pokiaľ viem tak funkcia real_escape_string by mala zmazať všetko čo je v "", prepísal som to tak ako si mi napísal
ale pri pokus zaregistrovat osobu s menom napr "SELECT * FROM" ju zaregistruje a v DB je aj tento záznam.

    public function userReg() {
        $uname = $this->db->real_escape_string($_POST['uname']);
        $upass = hash('SHA512', $_POST['upass']);
        $upass2 = hash('SHA512', $_POST['upass2']);
        $uemail = $_POST['uemail'];
        $error = '';

: Viem že to mám len na uname ale to je len pre test, nefunguje to :/
lionel messi
Profil
_fantomas:
Pokiaľ viem tak funkcia real_escape_string by mala zmazať všetko čo je v ""
Funkcia (alebo aby sme boli presní, v tomto prípade metóda) real_escape_string nikdy nič nemaže. Princíp escapovania pri vkladaní do db spočíva v ošetrení nebezpečných znakov, v prvom rade apostrofov. Radšej skús zadať napr. 'or. V db by pri správnom fungovaní mal byť záznam s menom 'or a SQL dotaz by nemal skončiť syntaktickou chybou.
_fantomas
Profil
Pri pokuse zaregistrovať meno 'or sa podaril v db sa nechádza záznam 'or je to v poriadku? Ako mam teda otestovat či mi ta funkcia funguje ..?
lionel messi
Profil
_fantomas:
Pri pokuse zaregistrovať meno 'or sa podaril v db sa nechádza záznam 'or je to v poriadku?
Áno.

Ako mam teda otestovat či mi ta funkcia funguje ..?
Práve si to otestoval a odpoveď je: funguje.

Odporúčam prečítať si definitívnu príručku escapovania, možno ti pomôže pochopiť jeho princíp.
_fantomas
Profil
Dík, ešte by ma zaujímalo ako zakázať určité znaky ... aby uživateľ mohol písat do mena znaky len od a po z, A po Z, 0 - 9 a znak _ (samozrejme aj znaky s diakritikou)
Fisir
Profil
Reaguji na _fantomase:
zakázať určité znaky
Jaký k tomu máš důvod? Je to jenom cool, nebo je to skutečně potřeba?
_fantomas
Profil
Skutočná potreba, nechcem aby sa mi uživatelia registrovali so znakmi napr $%& ...


A ani medzery
lionel messi
Profil
_fantomas:
Na to môžeš použiť tzv. regulárne výrazy, konkrétne funkciu preg_match, celé to bude vyzerať zhruba takto:

public function validInput($text)
{
  return preg_match("~^[a-z0-9_]+$~i", $text);
}
_fantomas
Profil
A ak by som chcel túto funkciu mat zapísanú zároven s real escape? Dá sa to?

$uname = $this->db->real_escape_string($_POST['uname']);
Alphard
Profil
_fantomas [#1]:
Takhle radši ne. Ale je fajn, že o tom přemýšlíte a chcete se zlepšovat.
Bylo by vhodné přestat skládat dotazy jako stringy, ale začít je parametrizovat. Jde o tzv. prepared statements, pokud vás ty příklady trochu vyděsily, souhlasím, že nejsou zrovna přehledné. Mně se více líbí prepared statements v PDO, nebo se podívejte přímo na dibi.

A ak by som chcel túto funkciu mat zapísanú zároven s real escape? Dá sa to?
O to se vůbec nesnažte, jsou to 2 odlišné věci. V prvním kroku se má validovat vstup, pokud nevyhoví, je navrácen uživateli. Escapování pro konkrétní typ databáze zajistí pouze bezpečné uložení, už nesouvisí s aplikační logikou.

A obecně k té třídě, beru to jako první pokus, ale ani na začátku byste se neměl připojovat k db v každé třídě. Připojte se jen jednou a pak si patřičnou proměnnou předávejte.
_fantomas
Profil
Nechcem používat dibi ani žiadne iné frameworky, skôr potrebujem dobrú stranku v českej/slovenskej verzií kde sa poriadne naučím OOP
Jan Tvrdík
Profil
Alphard:
Jde o tzv. prepared statements
Já spíš lidi od prepared statements odrazuji, viz komentář Jakuba Vrány.

Mně se více líbí prepared statements v PDO
Až na to, že v uvedených případech PDO skutečné prepared statements vůbec nepoužívá, ale provádí obyčejné escapování na klientovi. Skutečné prepared statements je potřeba explicitně zapnout.
Alphard
Profil
_fantomas [#13]:
Bylo to jen doporučení, třeba i jiným čtenářům diskuse. O programování je třeba přemýšlet, projití zde odkázaných stránek je určitě přínosné.

Jan Tvrdík [#14]:
Budiž, použiji formulacinelepte proměnné do dotazu a posílejte je v jiných parametrech“.
Já s tebou souhlasím, sám jsem čisté PDO nikdy nepoužíval (právě kvůli jeho nedostatkům), ale nevím, co jiného snadno zprovoznitelného odkázat začátečníkům. Když mi něco poradíš, budu rád a budu to příležitostně dál šířit (odkázaný komentář Jakuba Vrány nepovažuji za vhodný studijní zdroj pro někoho, kdo programuje stylem [#1]).

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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