» »

dolžina vnešenega teksta

dolžina vnešenega teksta

nemesis ::

Prek PHP-ja in baze imam narejeno polje za vnos imena.

Kako dolocim koliko crk lahko clovek vpise? Da za ime lahko vpise najvec 20 znakov?

Lunik ::

< input type="text" name="textfield" maxlength="20">

b ::

Enostavno.

Preverjas input, ki ti ga poslje client.

z zgornjim html-jem lahko samo ukazes browserju,
naj ne dovoli vec kot 20 znakov v polju. Ampak vsakdo
lahko poslje request z vec kot 20 znaki mimo browserja.

Nikoli ne zaupaj inputu userja, vedno vse preveri.

Ko inputa ne uporabljas samo ti, temvec ga posredujes
naprej (SQL, poganjanje raznih programov s parametri,
ki ti jih posredujejo uporabniki ipd.) moras zelo zelo pazit, da
ti uporabnik ne submita kaksnih zlobnih znakov...pri SQL-u
recimo nekaj takega:

$input = "username'; DROP TABLE uporabniki;";
$sql = "SELECT * from uporabniki where userid='$input'";

in potem zazenes query. Funny, huh? :-)

Vedno vedno in vedno moras ves input prefiltrirat tako,
da spustis cez samo znake, ki zagotovo niso skodlijivi. Pri
SQL-u obstaja se ena moznost, ampak ce jo povem
bo to samo vzpodbudilo lenobo. Pravi odgovor so filtri.

Zakljucek: ne bodite leni web developerji in vgradite
filtre za input v svoje web aplikacije.

lp,
Borut.

Zgodovina sprememb…

  • spremenilo: b ()

rc-car ::

Konkretnega odgovora pa človek še vedno ni dobil...

Dolžino string preveri z funkcijo strlen.
Potem upam, da znaš napisati en if stavek. :)
Nothings gonna stop me now, I'm breaking the rules, I'm gonna do it if its not allowed

Loki ::

uporabis < input type="text" name="textfield" maxlength="20" >;
na action pagu pa preveris http_referrer, ce ustreza strani, na kateri imas form.

darh ::

Loki: da gremo v extreme... tud REFERERja se zna ponaredit, da ne omenmo browserjev k ga sploh ne pošiljajo... poglej si funkcije modula CURL v PHPju in kaj vse se da delat s tem...

ti naredi takole v PHPju pa je:
$string = strlen( $string, 0, 20 );

in to ej vse kar potrbuješ...


Atribut maxlenght taga input je tam zato, da userju v prvi fazi preprečš vpis "napačnih" podatkov.. naprimer v SLO ima poštna št. 4 znake in pač določiš tako in to je to.

Lp,x
Excuses are useless! Results are priceless!

cahahopie ::

b... Kje pa lahko ujagam takšen filter?? Ker to ni nič kej cool!

dukedl ::

> Pri SQL-u obstaja se ena moznost, ampak ce jo povem
> bo to samo vzpodbudilo lenobo...

to ne bo lenoba, amapak pac se dodatni nasvet...zakaj ga skrivas? Knowledge belongs to everyone...torej?
lp dukedl

rc-car ::

ste zabluzili :)

Zdej, če hočeš preveriti ali je string predolg, potem to narediš z strlen funkcijo, če pa hočeš string skrajšat na določeno število nizov, pa to narediš z funkcijo substr.

Tudi REFERER je ql, ampak kot je že xbite rekel, se ga da ponarediti, še večji problem pa nastopi pri browserjih, ki REFERERja sploh ne pošiljajo.
Nothings gonna stop me now, I'm breaking the rules, I'm gonna do it if its not allowed

darh ::

rc-car: a se zafrkavas... zakaj bi preveru ce lahko koj skrajsas... ce je string manj kot doloceno stevilo znakov mu ne bo naredul nec... waste of code ;)

in b. ter ostali: kakor jest vem *_query(); funkcije požrejo samo en SQL stavek... torej vse do podpičja (;) in nič več... kar je kul in tukaj SQL code injection ne pride v upoštev, razen če na kak čudn način komuniciraš z bazo..
Excuses are useless! Results are priceless!

rc-car ::

xbite: ti mene hecaš?

Treba je pisat user-friendly skripte! >:D
Nekateri userji so pač 'limited' in je treba preverjat kaj pride izpod njihovih parkljov
Kako bi se ti počutil, če bi kar naenkrat dobil username xbi
Nothings gonna stop me now, I'm breaking the rules, I'm gonna do it if its not allowed

darh ::

aja... ti hoces userju prej se povedat ce je string dost dolg... zato sluzi maxlenght... serverside checking je pa anti-abuse protection..tam ne rabs vec obveščevat.. tam samo krajšaš... in browserji, VSI, sem prepričan upotevajo ta atribut pri INPUTu...
Excuses are useless! Results are priceless!

rc-car ::

Ja, samo to ni safe...
U bistvu imaš ti user-friendly in secure skupaj združeno...

Ampak zdej se že mal preveč oddaljujemo od tega kar je bogi človek sploh hotel zvedet od nas :)
Nothings gonna stop me now, I'm breaking the rules, I'm gonna do it if its not allowed

<?php?> ::

Če preverjaš ime bi jaz naredil tako:

if (!eregi("^[a-z]{0,20}$" , $ime)){
die ("Ime ni pravilno");
}


Saj ime nima cifer in drugih znakov not... ali pač? ;)

Zgodovina sprememb…

  • spremenilo: <?php?> ()

Loki ::

Ima pa lahko ščž, vsaj ce govorimo o rojstnih imenih.

<?php?> ::

Pozabil na to...

if (!eregi("^[a-zčžš]{0,20}$" , "čžš")){
die ("Ime ni pravilno");
}

poweroff ::

Zanimivo. Jaz sem cloveka drugace razumel. Namrec da zeli izvedeti kako narediti da ze v brovserju user ne bi vpisal prevec znakov.

No, tu si lahko pomagamo z JavaScriptom.

Recimo takole:
<html>
<head>
<SCRIPT LANGUAGE="JavaScript">
function checkLength (maxlen)
{
CharsLeft = maxlen - document.anketa.vnosnopolje.value.length;
if (CharsLeft < 0) {
document.anketa.vnosnopolje.value = document.anketa.vnosnopolje.value.substring (0, maxlen);
}
if (CharsLeft < 0) {
CharsLeft = 0;
}
}
</SCRIPT>
</head>

<form action="skripta.php" method="POST" name="vnos">
Vpišete lahko največ 100 znakov!<br>
<textarea name="vnosnopolje" rows="10" cols="40"
onFocus="checkLength (100)" onKeyDown="checkLength (100)"
onKeyUp="checkLength (100)" onBlur="checkLength (100)">
</textarea>
</form>

</html>

Če pa recimo želiš še da se prikaže koliko znakov mu je še preostalo pa takole:

<html>

<head>
<SCRIPT LANGUAGE="JavaScript">
function checkLength (maxlen)
{
CharsLeft = maxlen - document.anketa.vnosnopolje.value.length;
if (CharsLeft < 0) {
document.anketa.vnosnopolje.value = document.anketa.vnosnopolje.value.substring (0, maxlen);
}
if (CharsLeft < 0) {
CharsLeft = 0;
}
document.anketa.chleft.value = CharsLeft;
}
</SCRIPT>
</head>

<form action="perlskripta.pl" method="POST" name="anketa">
<textarea name="vnosnopolje" rows="10" cols="40"
onFocus="checkLength (100)" onKeyDown="checkLength (100)"
onKeyUp="checkLength (100)" onBlur="checkLength (100)">
</textarea>

<br>

Vpišete lahko še
<input type="text" name="chleft" size="5" maxlength="2"
value="100" onFocus="checkLength ()" onKeyDown="checkLength ()"
onKeyUp="checkLength ()" onBlur="checkLength ()"> znakov.

</form>
</html>

Je možna še varianta da delaš validacijo:
<html>

<head>
<SCRIPT LANGUAGE="JavaScript">
function checkNum ()
{
if (isNaN(document.anketa.vnosnopolje.value)){
document.anketa.vnosnopolje.value = document.anketa.vnosnopolje.value.substring (0, document.anketa.vnosnopolje.value.length-1);
}
}
</SCRIPT>
</head>

<form action="perlskripta.pl" method="POST" name="anketa">
Vpišeš lahko le cifre:<br>
<input type="text" name="vnosnopolje" size="20"
onFocus="checkNum ()" onKeyDown="checkNum ()"
onKeyUp="checkNum ()" onBlur="checkNum ()">

</form>
</html>

Samo je vseeno dobro narediti še validacijo vsega v PHPju, ker se vedno lahko najde pametnjakovič, ki se bo izognil JavaScriptu (ali pa nima podpore zanj).

Hmm, kaj je tista druga varianta v MySQL - me prav zanima... kaksen addslashes()?

rc-car ::

Matthai: ti si čist en mal zabluzu..

1. Že v HTML obstaja ukaz maxlength="20", ki ga dodaš input tagu in ti dovoli vpisat max 20 znakov
2. JavaScript je še lažje okrog prinest kot maxlength...
3. addslashes() dela nekaj čist tretjega..
Nothings gonna stop me now, I'm breaking the rules, I'm gonna do it if its not allowed

cahahopie ::

Mene bolj zanima kako se lotit zadeve, če osebek napiše predolgo besedo za eno vrstico. Kolkr vem na S-T še tega niso iznašl.

rc-car ::

1. Napišeš prijazno obvestilo, da je text predolg
2. Napišeš malo manj prijazno obvestilo, da je text predolg >:D
3. Text skrajšaš na maximalno dolžino in se ti jebe...
Nothings gonna stop me now, I'm breaking the rules, I'm gonna do it if its not allowed

<?php?> ::

cahahopie, kako misliš predolgo za eno vrstico?
Probaj z reg. expressioni, potem pa notri iščeš \n. In potem daš nekako tako [\n]{0,5}. To bi pomenilo da išče newline v stringu, v katerem pa je lahko od 0 do 5 vrstic. Če jih bo 6 bo vrglo FALSE...
Lahko pa tudi spremeniš string z nl2br() in iščeš znake < B R > in/ali < br />

poweroff ::

rc-car: veš kaj je zanimivo?
Imam tole kodo: < textarea name="vnosnopolje" rows="10" cols="40" maxlength="2" >

In lahko napišem več kot 20 znakov. Nisem testiral kaj pošlje naprej, ampak vpisujem lahko ful. JavaScript ti pa prepreči da bi pisal več kot n znakov.

Seveda se jo pa da zelo enostavno prelisičiti...

rc-car ::

Itaq je vse kar je client side zelo lahko prelisičit in to je bilo že vse gor povedano...

Nebi jaz pogreval že davno odkite tople vode..
Nothings gonna stop me now, I'm breaking the rules, I'm gonna do it if its not allowed

darh ::

Matthai: če bi si izvlili pogledat v HTML Specifikacije, bi videli da tag TEXTAREA nima atributa MAXLENGHT...

tko da ne kvasi neumnosti..
Excuses are useless! Results are priceless!

SDM ::

Sem probaval tiste Vaše DROPE ipd.. enostavno ne delujejo. A je možno da ne delajo če imaš pri selectu za tvojo primerjavo še kakšen AND, da stvar z dropom ne deluje? Npr da imam select takle:

SELECT * FROM programi WHERE ID=$HTTP_GET_VARS(id) AND (stranID=$page[stranID] OR stranID='0') AND avtorizirano=1 AND skrito=0

$HTTP_GET_VARS(id) je pač tista stvar ki je vpisana z getom...

Resnično, zdej se mučim že 2 ure pa mi ni uspelo.

Če pa dela pa končno povejte kako naj se zaščitim... Preverjenje če je vpisana številka sem že vključil, ne vem pa, kako je z tekstom (npr če tja noter vpišem drop table, kako lahko stvar blokiram ipd..).
Don't argue with an IDIOT!

darh ::

ti pretvori vse vrednisti ki bi mogle bit številke v številke, escajpej vse tekste in to je to...
Excuses are useless! Results are priceless!

Loki ::

xbite pretvori vse vrednosti, ki bi morale biti stevilke v stevilke? how do you do that? spremenis vrednost? - beri if not $text stevilka then set default stevilka? (teorija)

sdm probej se s post nacinom. (<form action="jest.php" method="post">); ker browserji avtomatsko pretvorijo presledke v %20 pri get nacinu, tko da drop%20database pac ne dela
(naj me kdo popravi, ce se motim, ker z sql nisem delal ze lep cajt)

darh ::

$integer = (int)$integer;

stara vrednost | nova vrednost spremenjivke integer:
kakršnokoli število > kakršnokoli število
string > 0
string s številom > število
boolean true > 1
boolean false > 0


Tudi za ostale tipe obstajao pretvorbe, pa pretvarjat se da tudi na druge načine.. poglej si poglavje Type Juggling v manualu > http://si.php.net/manual/en/language.ty...


Za escapanje tekstov uporabljaj mysql_escape_string() ali še bolje mysql_real_escape_string() (samo CVS PHP4...)razlago funkcij si preberi v manualu - lenobe ne podpiram... :D
> mysql_escape_string()

Excuses are useless! Results are priceless!

Tr0n ::

Ojej, ojej. Vsi v kot sedet, pa si preberite HTML specifikacijo.

http://www.w3.org/TR/html4/interact/for...

Maxlenght je cist dovolj :).

Aja, pa REQUEST_URI namesto HTTP_REFERER.

Zgodovina sprememb…

  • spremenilo: Tr0n ()

darh ::

TrOn:

1. REQUEST_URI vrne samo pot, brez domene... in se prav tako kot HTTP_REFERER da pofejkat (cURL_*())

2. MaxLenght je dovolj za stupid userje in verjemi, če ti bom hotel vnesti čudne podatke ki ne upoštevajo tvojih client-side predpostavk, JIH BOM! Server Side DATA checking je še vseeno najzaneslivejši - če je seveda pravilno napisan!


Že z uporabo $nekej namesto $_POST['nekaj'] in register_globals on, lahko dosežeš da ti jaz namesto skozi formo podatke pošljem skozi URL... in takoj ko bom na tvoji strani napisal login.php?username=burek in se bo na strani vpisalo nekaj v stilu Uporabniško ime ne obstaja oz. Vpišite še geslo se mi bo nasmejalo...

tolk... kdo bo šu zdj sedet v kot? :D
Excuses are useless! Results are priceless!

Tr0n ::

if ($PHP_SELF == $REQUEST_URI)
ok;
else
ni ok;

Ce uporabnik napise v url magari samo ? se ne ujemata, ker je php_self recimo vedno index.php request_uri pa index.php?. Kako lahko to pofejkas?

Zgodovina sprememb…

  • spremenilo: Tr0n ()

darh ::

na xyz webu naredim enako strukturo z direktoriji in filenejmi... 8-O
Excuses are useless! Results are priceless!

Tr0n ::

Hmm? :) Vecina uporabnikov si ne bo s tem belila glave, ali celo gledala source, da bi ugotovila ime spremenljivke :).

To samo taki hekeri kot si ti xbite delajo ;).

BTW, kako napreduje PHP tutorial? I'm waitin... :O

darh ::

večina.... tist procent ali dva ti bo pa bazo pobrisu.. fajn ane :)

Manual bo.. počasi :)
Excuses are useless! Results are priceless!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Kontakt obrazec

Oddelek: Izdelava spletišč
61937 (1782) betmen
»

[PHP] no refresh

Oddelek: Programiranje
202332 (1837) alexa-lol
»

css in input.button

Oddelek: Izdelava spletišč
111553 (1436) ferjan
»

kako spremeniti texfield type

Oddelek: Izdelava spletišč
12860 (772) Baja
»

Odpiranje dat.exe v VB

Oddelek: Programiranje
122811 (2604) webblod

Več podobnih tem