ugrás a tartalomhoz

POST-bol erkezo adatok megtisztitasa

Anonymous · 2006. Okt. 20. (P), 16.00
Szeretnek egy fugvenyt irni amely megtisztitja a POST-bol erkezet adatokat. Szeretnek minden olyan adatot megtisztitani amely veszelybe hozhatja a szkriptet.

El kene tavolitani a \ kartakereket, a HTML tagokat, es mas egyeb lehetseges dolgokat. Szeretnem ha mukodne a PHP trim fuggveny is, hogy a felesleges hezagokat ne vegye figyelembe.

Az en kodom elege gyenge, igy nez ki (csak a HTML tagokat tudja eltavolitani):
<?php
function filterInput($var)
{
    $input = strip_tags($var);
    
    return $input;
}

$ezmarfilterezet = filterInput($_POST['username']);
?>
Probaltam kiegesziteni de mindig errornak utkozok.
Tudnatok segiteni, egy jobb fuggvenyt megirni ? Nem akarok lama lenni de tenyleg nagy szuksegem lenne egy kis kodra amely tudom, hogy mukodik. Ettol fug az oldal biztonsaga.

Koszonom !
 
1

mindig errornak utkozok

Anonymous · 2006. Okt. 20. (P), 16.12
A mysql_escape_string() függvényt arra találták ki, hogy a mysql-be kerülő adatokat átalakítsa megfelelő formába. Ez az általad alkalmazott strip_tags() függvénnyel együtt nagyjából elég is.
Egyébként milyen error-ba ütközöl az idézett kód futattása közben?

Gyulus
3

a fugveny

Anonymous · 2006. Okt. 20. (P), 17.10
Jelenleg igy nez ki a fugvenyem :

<?php
 function filterInput($input)
    {
        $input = strip_tags($input);
        $input = stripslashes($input);
        $input = mysql_real_escape_string($input);
        
        return $input;
    }  
?>
Jelenleg nem ad semmi error uzenetet de nem filterez rendesen. Peldaul ha egy input mezobe beirom a kovetkezo szot : te'st akkor ezt kapom vissza: te\'st

Valami otlet?
5

a fugveny

Anonymous · 2006. Okt. 20. (P), 21.24
Először is a függvényt két g-vel írjuk.
Másodszor a mysql_real_escape_string pont arra való, hogy te'st-ből te\'st-et csináljon, hogy a mysql-ben el lehessen tárolni. Vagyis pont jól működik. Úgy tűnik, még magad sem tudod pontosan, hogy mit akarsz. :)

Gyulus
7

Ok

Anonymous · 2006. Okt. 21. (Szo), 08.01
Koszonom a valaszt, mindent tudo ur !
2

óvatosan

Hodicska Gergely · 2006. Okt. 20. (P), 16.48
Szia!


http://weblabor.hu/levlistak/wl-phplista/2006/03/049005

Azért mielőtt ilyesmit használsz gondold át jól. Egyrészt a /-ek eltávolítása csak úgy valszeg nem jó, csak akkor lehet indokolt, ha magic_quotes be van kapcsolva a gépeden. Plusz szintén szerintem rossz megközelítés az, hogy automatikusan megváltoztatom a bejövő adatokat. Ha a user rossz dolgot ír be, akkor vissza kell dobni neki, és leírni, hogy mi a gond, ellenkező esetben jönnek az olyan problémák, hogy a walter usernévből w lesz. Persze kényelmi funkciók (HTML tagek kitakarítása) beleférhet, a lényeg, hogy ne döntsünk a user helyett.


Felhő
4

OK

Anonymous · 2006. Okt. 20. (P), 17.53
Gergely gondolom ez mar jo lesz:

    function filterInput($input)
    {
    	$input = strip_tags($input);
    	if (get_magic_quotes_gpc()) 
    	{
        	$input = stripslashes($input); 
    	}

    	$input = mysql_real_escape_string($input);
    	
    	return $input;
    }
Nem ertem miert errorozik ha "$input = mysql_real_escape_string($input);" is ott van es a megtisztitott POST-ot berakom egy mysql Querybe
6

mysql_real_escape_string

Poetro · 2006. Okt. 20. (P), 21.59
Mint a leírása is említi, előtte kell neki egy elő mysql kapcsolat, hogy tudja milyen escapelésre is van pontosan szükség, különben egy warning-ot fog adni.
8

Koszonom !

Anonymous · 2006. Okt. 21. (Szo), 09.48
Koszonom a sok segitseget es tanacsot, irtam egy fuggvenyt amely elvegzi a problemat :

<?php
function filterInput($input, $sql = FALSE)
	{
        $input = strip_tags($input);
        if(get_magic_quotes_gpc())
        {
            $input = stripslashes($input); 
        }
        if ($sql) 
        {
        	if(function_exists("mysql_real_escape_string"))
        	{
        		$input = mysql_real_escape_string($input);
        	}
        	else
        	{
        		$input = addslashes($input);
        	}
        } 
          
        return $input;
}
?>
Most ha hasznalni akarom a filterezet adatot a lapon csak beirom:

$name = filterInput($_POST['name']);
Es ha mySQL-be akarom berakni az adatot akkor ezt hasznalom :

INSERT INTO table (id,name) VALUES (0, '".filterInput($name,1)."');
Azert lenne meg egy kerdesem !

Mikor kell filterezni SQL injection ellen, csak akkor amikor a felhasznalo input fielden adatot bevisz ? Vagy erdemes minden SQL lekereshez beadnom a filterezett erteket ?
9

mysql_real_escape_string != addslashes

Dualon · 2006. Okt. 21. (Szo), 10.41
A mysql_real_escape_string() és az addslashes() függvények nem egyenlőek egymással! Gondold végig... de utána is olvashatsz, itt, a WL-on már leírtam egyszer.

SQL Injection ellen meg akkor védekezz, ha adatbázisba írod az adatot, és nem bízol benne. Alapesetben semmiben nem bízunk. :)
Ez kb. olyan kérdés, mint a "mikor zárjam be az ajtómat?".
10

hello

Anonymous · 2006. Okt. 21. (Szo), 11.16
Nem igazan ertem miert fogod ra a hibat az addslahes-ra. Az akkor van hasznalva ha regi a PHP.

Olvasd el amit itt ir:
http://www.askbee.net/articles/php/SQL_Injection/sql_injection.html
11

ráfogtam volna?

Dualon · 2006. Okt. 21. (Szo), 14.06
Nem igazan ertem miert fogod ra a hibat az addslahes-ra.


Nem igazán értem, miért mondod, hogy bármiféle hibát bármikor is ráfogtam az addslashes-re. :)
(Helyesen egyébként addslashes-re - nem kötekedni szeretnék, építő a kritika, épp ezért is csak ezt emeltem ki a nyelvtani hibák közül.)

Egyébként: mysql_escape_string()

És még egyszer mondom: az addslashes nem escape-el minden karaktert, amelyet adatbázisba íráskor escape-elni kell.
Korábban is leírtam már, amint erre előző bejegyzésemben utaltam.
12

én sem értelek

Anonymous · 2006. Okt. 21. (Szo), 15.52
És még egyszer mondom: az addslashes nem escape-el minden karaktert, amelyet adatbázisba íráskor escape-elni kell.


de php 4.3.0 előtt még mindig jobb az addslashes, mint a semmi vagy egy hibaüzenet...

<?ph
if( function_exists("mysql_real_escape_string") ) {
  $input = mysql_real_escape_string($input);
}
else {
  // csak akkor és csakis akkor(!)
  // ha nincs mysql_real_escape_string,
  // azaz php 4.3.0 előtt...
  $input = addslashes($input);
}
?>
gex
13

az addslashes önmagában _nem_ megoldás!

Dualon · 2006. Okt. 21. (Szo), 17.52
A mysql_escape_string még mindig jobb PHP 4.3.0 előtt (nem véletlenül linkeltem be), mint az addslashes. 4.0.3-as (nem elírás) PHP előtti verziót meg talán hadd ne használjunk már 2006 októberében...

Nem akartam ekkora feneket keríteni a dolognak, de világosan látnotok kell: az addslashes nem biztosítja az elvárt védelmet adatbázisokba írás esetén. Belinkeltem a bejegyzésem, ott vannak benne felsorolva az escape-elt karakterek (látványos a különbség).
Ha feltétlenül az addslashes-zel akarjátok megoldani, vagy PHP 3.0-tól felfelé mindennel mennie kell :), akkor tessék a metszeten kívül eső karakterekre is figyelni.

Tehát:
  • ha van mysql_real_escape_string, akkor azt kell használni
  • ha nincs, akkor mysql_escape-string-et, ez PHP 4.0.3-tól működik!
  • az addslashes nem megoldás, mivel nem biztosítja a szükséges védelmet
  • ha itt a fórumban többször elhangzik, hogy "akkor használj helyette addslashes-t", a szerencsétlen kezdők azt fogják hinni, ez elég biztonságos
  • nem akarom ütni a vasat, nem az a lényeg, hogy kinek van igaza. A fontos az, hogy ne vezessetek félre (nyilván jó szándékkal, netán véletlenül) kevésbé járatos emberkéket.
14

php verziók

Anonymous · 2006. Okt. 21. (Szo), 18.39
4.0.3-as (nem elírás) PHP előtti verziót meg talán hadd ne használjunk már 2006 októberében...

neked nem is kell, valakinek viszont nincs más megoldása. ismerek olyan - igen nagy látogatottságú - hazai oldalt, ahol php 4 (ez sem...) és mysql 3.23 (... és ez sem elírás) van a szerveren és nem is akartak frissíteni, mert szerintük az jó.

gex
15

ez most érv?

Dualon · 2006. Okt. 21. (Szo), 18.56
De most komolyan ezzel érvelsz a bejegyzésem után? :( Ha nem érv, akkor meg nem értem, minek... Kezdek attól tartani, hogy meddő és parttalan e vita.

Baromira nem a verziókon van a hangsúly! A lényeg az, hogy lehet PHP 3-tól felfelé kompatibilis, korrekt kódot írni, de amit írtatok, az nem az. Igaz?
16

számomra ez nem vita

Anonymous · 2006. Okt. 21. (Szo), 19.30
ez a "vita" már akkor parttalan lett, amikor elkezdted bizonygatni, hogy a mysql_real_escape_string nem ugyanaz, mint az addslashez. ki mondta, hogy ugyanaz?

De most komolyan ezzel érvelsz a bejegyzésem után?

segítek: igen. te azzal érveltél, hogy hadd ne használjál 4.0.3 alatti php verziót. ez szerinted érv? szerintem egy nevetséges hozzászólás. mondhatnám azt is, hogy hadd ne dolgozzak már php 4.x-szel. ennek ellenére válaszoltam neked, hogy igenis vannak olyan helyzetek, mikor nem lehet mysql_real_escape_stringet használni. (és mielőtt ideírnád, mysql_escape_stringet sem.)

A lényeg az, hogy lehet PHP 3-tól felfelé kompatibilis, korrekt kódot írni,

... és ennek részét képezi az addslashez függvény használata. igaz, nem önmagában, de kiindulási alapnak jó volt nyolcas hozzászólás. lehetne még javítani rajta, de aki idáig eljutott (gondolt a régebbi verziókra is), az lehet nem fog itt megállni. nem tudom miért van bizonyítási kényszered.

gex
17

A szakmai részt elismerted, a többi nem ide való

Dualon · 2006. Okt. 21. (Szo), 21.17
elkezdted bizonygatni, hogy a mysql_real_escape_string nem ugyanaz, mint az addslashez. ki mondta, hogy ugyanaz?


Egyrészt nem bizonygattam, hanem rámutattam.
Másrészt egy feltételes szerkezetben egyenértékűen használtátok a mysql_real_escape_stringgel, és nem hívtátok fel rá a figyelmet, hogy nem biztosít ugyanolyan védelmet.

te azzal érveltél, hogy hadd ne használjál 4.0.3 alatti php verziót. ez szerinted érv?


Az általad idézett mondatom több okból sem érv volt: egyrészt bejegyzésem további részében leírtam, hogy lehet korrekten megoldani a problémát, másrészt arra hívtam fel ezzel a figyelmet, hogy nem szokásos, hogy a szervereken PHP 4.0.0 fusson. Ezzel tehát senkit nem akartam, nem is lehet meggyőzni - nem érv.

Említetted, hogy "valakinek viszont nincs más megoldása". Nyilván lehet találni ilyen szervereket, de korántsem ez az elterjedt! Mi több: akad nem egy más megoldása az ilyen helyzetbe kényszerülőknek - egyet például én írtam le fentebb.

Ráadásul olyan mondaton lovagolsz, ami a téma szempontjából messze nem lényegbevágó. Egyetlen dologra válaszoltál 14-es postodban a teljes bejegyzésemből, és az ez volt.

... és ennek részét képezi az addslashez függvény használata. igaz, nem önmagában


Nah, nagy nehezen idáig is eljutottunk. Pontosan ennyit mondtam jópár hozzászólással ezelőtt, mivel előtte nem hívtátok fel rá a figyelmet; ezt tekintetted "bizonygatásnak". :)

de kiindulási alapnak jó volt nyolcas hozzászólás.


Aligha várható el kevésbé gyakorlott, jártas, stb. (nevezzük bárminek) webfejlesztőktől, hogy ezt átlássák, nekem meg épp volt annyi időm, hogy rávilágítsak.

nem tudom miért van bizonyítási kényszered.


Talán mert nincs?
Nekem nincs szükségem rá, hogy növesszem az e-péniszem. ,)

A fentiek fényében nem is erőltetem a témát, már csak azért sem, mert a szakmai jellegű pontokat nem cáfoltad meg, egyéb tekintetben meg kezdenek személyes hangnemet megütni a hozzászólásaid.

Kimondtad, amit ki kellett, részemről a téma lezárva.
Ha esetleg valamiben megbántottalak volna, vagy zavart volna némely hozzászólásom, ezúton kérem elnézésed.

"Maradok tisztelettel"

D.
18

valasz

Anonymous · 2006. Okt. 21. (Szo), 21.54
Az addslashest csak utolso megoldas kent raktam be a fuggvenybe. Jelenleg PHP 4.4-et hasznalok. Gondold ha addslashes is ott van befolyasolja a kodot ?