Autor | Zpráva | ||
---|---|---|---|
_fantomas Profil |
#1 · Zasláno: 26. 12. 2014, 18:52:00
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 |
#2 · Zasláno: 26. 12. 2014, 18:59:38
_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 |
#3 · Zasláno: 26. 12. 2014, 19:07:22
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 |
#4 · Zasláno: 26. 12. 2014, 19:11:19
_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 |
#5 · Zasláno: 26. 12. 2014, 19:15:46
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 |
#6 · Zasláno: 26. 12. 2014, 19:19:02
_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 |
#7 · Zasláno: 26. 12. 2014, 19:24:14
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 |
#8 · Zasláno: 26. 12. 2014, 19:30:24
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 |
#9 · Zasláno: 26. 12. 2014, 19:31:41 · Upravil/a: _fantomas
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 |
#11 · Zasláno: 26. 12. 2014, 19:35:26
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 |
#12 · Zasláno: 26. 12. 2014, 19:57:44
_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 |
#13 · Zasláno: 26. 12. 2014, 20:12:25
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 |
#14 · Zasláno: 26. 12. 2014, 20:54:12
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 |
#15 · Zasláno: 26. 12. 2014, 22:24:44
_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 formulaci „nelepte 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]). |
||
Časová prodleva: 9 let
|
0