Goed XSS filter?
ik heb dit filter:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function bb($text, $img = "true"){
$text = stripslashes($text);
$text = strip_tags($text);
$text = htmlentities($text, ENT_QUOTES);
$text = nl2br($text);
$text = preg_replace('(\[b\](.+?)\[/b\])', '<strong>$1</strong>', $text);
$text = preg_replace('(\[img\]http://([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
$text = preg_replace('(\[img\]([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
}
return $text;
}
?>
function bb($text, $img = "true"){
$text = stripslashes($text);
$text = strip_tags($text);
$text = htmlentities($text, ENT_QUOTES);
$text = nl2br($text);
$text = preg_replace('(\[b\](.+?)\[/b\])', '<strong>$1</strong>', $text);
$text = preg_replace('(\[img\]http://([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
$text = preg_replace('(\[img\]([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
}
return $text;
}
?>
gehaald van : http://www.phphulp.nl/php/tutorial/beveiliging/beveiliging-xss-versie-2/434/hoe-moet-het-wel/976/
maar stel dat ik deze nou zo aanpas:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function bb($text, $img = "true"){
$text = stripslashes($text);
$text = strip_tags($text);
$text = htmlentities($text, ENT_QUOTES);
$text = nl2br($text);
$text = preg_replace('(\[b\](.+?)\[/b\])', '<strong>$1</strong>', $text);
$text = preg_replace('(\[img\]http://([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
$text = preg_replace('(\[img\]([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
}
return $text;
}
$_GET = bb($_GET);
$_POST = bb($_POST);
$_COOKIE = bb($_COOKIE);
?>
function bb($text, $img = "true"){
$text = stripslashes($text);
$text = strip_tags($text);
$text = htmlentities($text, ENT_QUOTES);
$text = nl2br($text);
$text = preg_replace('(\[b\](.+?)\[/b\])', '<strong>$1</strong>', $text);
$text = preg_replace('(\[img\]http://([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
$text = preg_replace('(\[img\]([a-z0-9_\-\.\/:]+?)\[/(?:img)?\])', '<img src="http://$1">', $text);
}
return $text;
}
$_GET = bb($_GET);
$_POST = bb($_POST);
$_COOKIE = bb($_COOKIE);
?>
Zijn al mijn get post en cookie variabelen dan beveiligd? Of kan hij geen array controleren? En als dat niet kan, kan ik dan ook eerst de get uitvouwen tot alle waarden en dan de get er alsnog 1 voor 1 doorhalen?
Mvg,
Wijnand
echo htmlspecialchars( $_POST['bla'], ENT_QUOTES );
Voor Query's moet je gebruik maken van mysql_real_escape_string.
Voor het afdwingen van bepaalde attributen, of het controleren daarop kan je kijken op php.net voor alle functies
Bv:
ctype_digit
Aan de linkerkant vind je alle ctype mogelijkheden.
Succes
Gewijzigd op 28/06/2010 10:42:11 door Niels K
weet ik, maar als ik dit doe, is mijn hele script meteen beveiligd;) en anders moet ik eerst nog mijn hele script aanpassen.. Dat ga k op de lange termijn wel doen, maar eerst even snel deze beveiliging. Maar hij werkt dus wel?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
function bb($text, $img = "true"){
#| Kijken of " $text " een array is, Zoja dan lopen we ze allemaal af.
if(is_array($text)){
#| Alle waarden doorlopen.
foreach($text as $key => $value){
#| Waarde controleren.
$text[$key] = bb($value);
}
#| Array met resultaten terug sturen.
return $text;
}
else{
// hier je controles.
#| Resultaat terug geven.
return $text;
}
}
?>
function bb($text, $img = "true"){
#| Kijken of " $text " een array is, Zoja dan lopen we ze allemaal af.
if(is_array($text)){
#| Alle waarden doorlopen.
foreach($text as $key => $value){
#| Waarde controleren.
$text[$key] = bb($value);
}
#| Array met resultaten terug sturen.
return $text;
}
else{
// hier je controles.
#| Resultaat terug geven.
return $text;
}
}
?>
Nee ik denk niet dat dit gaat werken,
Je zult alle $_POST, $_GET, $_SESSION, $_COOKIE variablen op moeten geven.
het accepteerd gewoon arrays en heeft ook charset ondersteuning,
wel word er geen stripslashes gebruikt, welke in mijn ogen niet erg nodig is,
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function xss($str, $charset = "UTF-8"){
if(is_array($str)){
$array = array();
foreach($str as $k => $s)
$array[$k] = xss($s, $charset);
return $array;
}
return htmlentities(strip_tags($str), ENT_QUOTES, $charset);
}
?>
function xss($str, $charset = "UTF-8"){
if(is_array($str)){
$array = array();
foreach($str as $k => $s)
$array[$k] = xss($s, $charset);
return $array;
}
return htmlentities(strip_tags($str), ENT_QUOTES, $charset);
}
?>
Striptags is ook nutteloos, juist door htmlentities =)
had ergens een voorbeeldje liggen maar die kan ik zo niet vinden helaas..
Beveilig data voor de manier hoe je ze gebruikt!
Voor in queries: mysql_real_escape_string()
Om weer te geven: htmlentities(), dus niet bij het opslaan
Voor id's, if(ctype_digit($str))
enz...
Gebruik dus geen htmlentities voor data die je nog gaat opslaan
maar als iets een tekst is wel, al is het maar een naam, xss controleren + eventueel lengte en afhangend van de wensen spaties en andere rare tekens, overal waar tekst in voor komt zou ik zeker voor xss controleren + specifieke eisen, allebei dus,
mysql_real_escape_string te gebruiken voor als de data de database in gaat (of natuurlijk typecasten of prepared statements gebruiken).
Pas als je de data ophaalt kan je die functie d'r over gooien.
Je controleert nu niet, je past de data aan, en dat wil je niet, je wilt zo origineel mogelijke data hebben.
Inderdaad, je hoeft alleen maar Pas als je de data ophaalt kan je die functie d'r over gooien.
Je controleert nu niet, je past de data aan, en dat wil je niet, je wilt zo origineel mogelijke data hebben.