Poslao: 10 Maj 2013 10:19
|
offline
- FoxVanis
- Ugledni građanin
- Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
- Pridružio: 13 Jun 2010
- Poruke: 307
- Gde živiš: Subotica
|
Treba mi pomoć oko Regex-a. Naime, malo se mučim oko dozvole/zabrane određenih karaktera i simbola.
Treba mi neka pomoć od iskusnijih kolega u ovom polju.
Hoću da profiltriram neke sadržaje i da dozvolim samo slova a-Z, brojeve 0-9 i simbole poput tačke, upitnika, uzvičnika, zareza, zagrada... samo te osnovne stvari:
( -+,.;?"!%:()/*' )
Drugi simboli mi ne trebaju. Kako to da uradim?
Hvala!
|
|
|
Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
|
|
|
Poslao: 10 Maj 2013 16:59
|
offline
- FoxVanis
- Ugledni građanin
- Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
- Pridružio: 13 Jun 2010
- Poruke: 307
- Gde živiš: Subotica
|
Alien vs Predator ::Probaj ovaj tutorijal ako je to ono na sto si mislio: Tekst za link
Mhm... to je to... Muči me nešto, pokušavam da napravim kvalitetan filter za input form prilikom registracije i pretrage na jednom portalu jer predhodno su neki pokušavali da ubace svakakve HTML, PHP i javaskript pozive u bazu preko $_POST funkcija.
Predhodni programer nije ni razmišljao o takvim stvarima pa je napravio takav kod da si čak mogao umesto slike uploadovati bilo koji fajl, bilo koje ekstenzije. Užas.
Napravio sam filter od HTML, XML i PHP tagova ali nije mi to dovoljno jer može se običnim redoslednim ubacivanjem opet napraviti poziv. Zato sam hteo da ograničim i karakterno. Da dozvolim samo slova i brojeve i još po koji simbol za koji znam da neće škoditi.
Ima li neko rešenje za kvaliteto filtriranje ulaznih stringova?
|
|
|
|
Poslao: 10 Maj 2013 18:52
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3760
- Gde živiš: 127.0.0.1
|
Naravno da ima
$filtered = preg_replace("@([^a-zA-Z0-9\+\-_()*!,.;\?:'%/\"]+)@Ui", "", $not_filtered);
|
|
|
|
Poslao: 10 Maj 2013 19:54
|
offline
- FoxVanis
- Ugledni građanin
- Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
- Pridružio: 13 Jun 2010
- Poruke: 307
- Gde živiš: Subotica
|
Rastafarii ::Naravno da ima
$filtered = preg_replace("@([^a-zA-Z0-9\+\-_()*!,.;\?:'%/\"]+)@Ui", "", $not_filtered);
Hvala ti mnogo! Opet brzo kucaš!
$filtered = preg_replace("@([^a-zA-Z0-9\+\-_()*!,.;\?:'%/\"]+)@Ui", "$1", $not_filtered);
Radi perfektno!
|
|
|
|
Poslao: 10 Maj 2013 21:52
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3760
- Gde živiš: 127.0.0.1
|
Nope, ne kucam brzo. Ovaj put sam testirao Evo i objasnjenja:
$filtered = preg_replace("@([^a-zA-Z0-9\+\-_()*!,.;\?:'%/\"]+)@Ui", "", $not_filtered);
Ima sledece znacenje:
Citat:Zameni sve karaktere unutar promenljive $not_filtered koji NE pripadaju definisanom nizu nicim i rezultat smesti u promenljivu $filtered.
Tvoja izmena:
$filtered = preg_replace("@([^a-zA-Z0-9\+\-_()*!,.;\?:'%/\"]+)@Ui", "$1", $not_filtered);
Ima sledece znacenje:
Citat:Zameni sve karaktere unutar promenljive $not_filtered koji NE pripadaju definisanom nizu samim sobom i rezultat smesti u promenljivu $filtered.
I u sustini se svodi na:
$filtered = $not_filtered;
Evo i malog testa:
$test = "test`~!@#$%^&*()_-+="; // trebalo bi da "prezivi" test!%*()_-+ (karakteri: `~@#$^&= nisu dozvoljeni)
echo preg_replace("@([^a-zA-Z0-9\+\-_()*!,.;\?:'%/\"]+)@Ui", "$1", $test); // rezultat: test`~!@#$%^&*()_-+=
echo preg_replace("@([^a-zA-Z0-9\+\-_()*!,.;\?:'%/\"]+)@Ui", "", $test); // rezultat: test!%*()_-+
Jesi li i dalje siguran da "brzo kucam"?
|
|
|
|
Poslao: 12 Maj 2013 16:45
|
offline
- FoxVanis
- Ugledni građanin
- Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
- Pridružio: 13 Jun 2010
- Poruke: 307
- Gde živiš: Subotica
|
Upravu si, moja greška, izvini. Odličan je kod. Radi perfektno. Hvala ti!
|
|
|
|
Poslao: 14 Maj 2013 19:10
|
offline
- gfactory
- Super građanin
- Pridružio: 26 Okt 2007
- Poruke: 1064
- Gde živiš: u Apache
|
Vidim da ovde dobro riplejsujete.
Imam funkciju s kojom sprečavam da se sajt uruši ako neko unese single quote jedanput, single se unese u bazu ali se sačuva integritet sajta.
function mysql_escape_mimic($inp) {
if(is_array($inp))
return array_map(__METHOD__, $inp);
if(!empty($inp) && is_string($inp)) {
return str_replace(array('\\', "\0", "\n", "\r", "'", '"', "\x1a"), array('\\\\', '\\0', '\\n', '\\r', "\\'", '\\"', '\\Z'), $inp);
}
return $inp;
}
Problem je ako neko unese npr. u blizini 'Kluza' znači single quote dvaput.
Idealno bi bilo da se navodnici zamene sa slovom ć i uopšte sva naša slova jer kad neko kuca npr., već a nije prebacio na našu tastaturu, sajt se sruši i iskoči syntax error zbog navodnika.
Ili, ako bi barem moglo da se single quote zameni sa double quote.
|
|
|
|
Poslao: 14 Maj 2013 19:30
|
offline
- Rastafarii
- Moderator foruma
- Pridružio: 22 Mar 2006
- Poruke: 3760
- Gde živiš: 127.0.0.1
|
Za to ne moras da palis RegExp Dovoljan ti je i addslashes() (posto je mysql_real_escape_string() deprecated od PHP 5.5).
<?php
$str = "Is your name O'reilly?";
// Outputs: Is your name O\'reilly?
echo addslashes($str);
?>
Ili, u tvom slucaju:
<?php
$str = "u blizini 'Kluza'";
// Outputs: u blizini \'Kluza\'
echo addslashes($str);
?>
|
|
|
|
Poslao: 14 Maj 2013 20:06
|
offline
- gfactory
- Super građanin
- Pridružio: 26 Okt 2007
- Poruke: 1064
- Gde živiš: u Apache
|
ok hvala, razumeo sam te i znam za mysql escape itd.
Ali nije problem za taj jedan pojam koji je neko uneo, šta kad sledeći korisnik unese npr.,
u blizini 'Vukovog spomenika' pa bi onda trebalo npr.
$str = " '.' ";
echo addslashes($str);
|
|
|
|