Witajcie.
Tak sobie ostatnio myślałem nad uniwersalnym zabezpieczeniem przed tego typu atakami bez większej modyfikacji całego kodu. Wpadłem na coś takiego co w dużej mierze powinno znacznie zabezpieczyć witrynę. Jest tylko jeden warunek, najlepiej by było jak by strona z tym kodem została dołączona do każdej podstrony.

Na samym początku przydało by się wykluczyć dopisywanie do zapytań takich ciągów typu UNION, SELECT niby funkcja preg_match powinna wykluczyć te słowa, ale co wtedy gdy ktoś użyje zapisu typu U%4EIO%4E <==> UNION a no właśnie to mamy lipę.

Pozwoliłem sobie napisać taką funkcję:

<?

function hexalert($string) {
$string2 = $string;

$string = strtolower($string);

$hex_translate = array(
‘%43′ => ‘C’,
‘%45′ => ‘E’,
‘%49′ => ‘I’,
‘%4c’ => ‘L’,
‘%4e’ => ‘N’,
‘%4f’ => ‘O’,
‘%53′ => ‘S’,
‘%54′ => ‘T’,
‘%55′ => ‘U’,
‘%63′ => ‘c’,
‘%65′ => ‘e’,
‘%69′ => ‘i’,
‘%6c’ => ‘l’,
‘%6e’ => ‘n’,
‘%6f => ‘o’,
‘%73′ => ’s’,
‘%74′ => ‘t’,
‘%75′ => ‘u’,
‘%58′ => ‘X’,
‘%78′ => ‘x’,
‘%2a’ => ‘*’,
‘%2f’ => ‘/’,

);

$hex = array(
‘%43′,
‘%45′,
‘%49′,
‘%4c’,
‘%4e’,
‘%4f’,
‘%53′,
‘%54′,
‘%55′,
‘%63′,
‘%65′,
‘%69′,
‘%6c’,
‘%6e’,
‘%6f’,
‘%73′,
‘%74′,
‘%75′,
‘%58′,
‘%78′,
‘%2a’,
‘%2f’,

);

$ile=count($hex);
$string = stripslashes($string);

for($x=0; $x<$ile; $x++) {
$string = str_replace($hex[$x], $hex_translate[$hex[$x]], $string);

}
$string = str_replace(’/', ”, $string);

$string = str_replace(’*', ”, $string);
if(preg_match(”/union|select|exec/i”, $sring)) {
exit(’System wykrył obecność nieprawidłowej zmiennej. Prawdopodobnie próba włamania się do systemu…’);
}
return $string2;
}

?>

jak widać funkcja tłumaczy sobie z kodu hex słowa i sprawdza czy w danym stringu znajdują się zakazane rzeczy, gdy ją znajdzie kończymy działanie aplikacji. Mamy już fajny kodzik pora coś z nim zrobić. No to pozwoliłem sobie napisać kolejną funkcję tym razem taką:

<?

function filtr($string,$string2) {foreach (
$string as $res1=>$res2) {if (

is_array($string[$res1])){

list(

$string[$res1],$string2[$res1]) = filtr($string[$res1],$string2[$res1]);} else {
$res2= addslashes(htmlspecialchars(hexalert($res2, ENT_QUOTES)));

$string[$res1]=$string2[$res1]=$res2;}

}

return array(

$string,$string2);}
?>

Myślę że kodu w powyższym załączniku nie muszę tłumaczyć ;) mamy już dwie pierwsza służy szukania zakazanych elementów, a druga do wywołania pierwszej funkcji, dodania slashy przy znakach unikodowych oraz zamienienie groźnych znaczników html.

całość wywołamy tak:

<?

list($_GET,$GLOBALS) = filtr($_GET,$GLOBALS);list(
$_POST,$GLOBALS) = filtr($_POST,$GLOBALS);list(
$_COOKIE,$GLOBALS) = filtr($_COOKIE,$GLOBALS);list(
$_REQUEST,$GLOBALS) = filtr($_REQUEST,$GLOBALS);list(
$_SERVER,$GLOBALS) = filtr($_SERVER,$GLOBALS);list(
$_FILES,$GLOBALS) = filtr($_FILES,$GLOBALS);

?>

no i to już koniec roboty :)

5 Komentarze

  1. Pewnie, że nie musisz tłumaczyć :D A po co?

    • axelpl
    • Posted styczeń 2, 2008 at 8:48 pm
    • Permalink

    no ale jak dla mnie tam nie ma nic do tłumaczenia byle pamiętać że tam gdzie dostęp po haśle stosować wszędzie apostrofki przy zczytywaniu np
    select * from users where pass = ‘$_POST[pass]‘…
    i nikt Ci nie wjedzie z ‘ or 1 = 1 and 1 = ‘ itd. a reszta to nawet aprostrof nie potrzebujesz co prawda można wtedy użć 1 OR 1 itd ale to i tak przecież nic nie zdziała.

  2. Tak, oczywiście. Ty też jesteś hakerem?

    • axelpl
    • Posted styczeń 2, 2008 at 9:04 pm
    • Permalink

    nie, nie jestem, nie mam zamiaru być. umiem to co umiem, wiem jak się przeprowadza ataki ale to wszystko.

  3. O to miło z Twojej z strony :)

Napisz komentarz

*
*