| 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: 11 let
|
|||
0