3. ”mi nem vagyunk célpontok”
n Az adatok értékesek (pl.
tematizált email címlista
az {user} táblából)
n A látogatók értékesek
n Minden gép számít
(botnetek)
n Vandálkodni jó :)
Tuesday, April 3, 12
5. Biztonságról általában
n
Csak biztonságos és nem
biztonságos oldal van, nincs
félig biztonságos
n
Egy rossz sor kód is elég
ahhoz, hogy bárki bármit
tehessen az oldalunkkal /
szerverünkkel
n
A webfejlesztő is programozó,
ugyanúgy kell nekünk is
törődnünk a biztonsággal,
mint annak, aki az amerikai
védelmi hivatalnak fejleszt.
Tuesday, April 3, 12
6. Hálózati biztonság
n Titkosított protokollok használata (FTP és HTTP (feltöltés)
kerülendő)
n Wi-Fi esetén WPA titkosítás
n Total Commander nem jelszómegőrző
Tuesday, April 3, 12
8. Bárki lehallgathat
n Nem csak a képzett ”crackerek”
sudo ifconfig wlan0 down
sudo iwconfig wlan0 mode monitor
sudo ifconfig wlan0 up
sudo wireshark
Tuesday, April 3, 12
10. Szerverbeállítások
n
FastCGI (DDoS ellen jobb)
n
PHP
n
suhosin használata
n
php.ini
n
open_basedir
n
disabled_functions
n
disabled_classes
n
safe_mode kikapcsolása (hamis biztonságérzet, gyakorlatban
nem sokat véd)
Tuesday, April 3, 12
11. Formok biztonsága
n a hidden (és bármilyen más) mezők tartalmai ugyanúgy
módosíthatóak a felhasználók által! (meglepően sok oldal
törhető így)
n szerencsére ezt a form api kivédi
Tuesday, April 3, 12
12. Formok biztonsága
n Bizonyos érzékeny adatok (pl.: bankkártya szám) beviteli
mezőjénél az autocomplete=”off” attribútum használata
Tuesday, April 3, 12
13. HTTP kérések
n Írás soha ne legyen GET
n Létrehozás, szerkesztés az POST (form miatt), de a törlés is
legyen az!
n Nem árt, ha rákérdezünk a felhasználóra törlés előtt
(Drupalban: confirm_form() függvény)
n Ha bejut valamilyen bot, akkor a linkeken végigmegy →
ha ez egy admin felület, akkor törölheti az összes
tartalmat
Tuesday, April 3, 12
14. HTTP kérések
n Érzékeny adatot URL-ben soha
n http://example.com/register.php?
username=foo&password=bar&mail=foobar@example.com
Tuesday, April 3, 12
15. JavaScript
n A JavaScript által végzett ellenőrzés csak kényelmi
szolgáltatás, minden ellenőrzést el kell végezni a szerver
oldalon is!
Tuesday, April 3, 12
16. JavaScript
n Valós életből vett ellenpélda:
<script language="javascript">
<!--//
/*This Script allows people to enter by using a form that asks for a
UserID and Password*/
function pasuser(form) {
if (form.id.value=="buyers") {
if (form.pass.value=="gov1996") {
location="http://officers.federalsuppliers.com/agents.html"
} else {
alert("Invalid Password")
}
} else {
alert("Invalid UserID")
}
}
//-->
</script>
Tuesday, April 3, 12
17. File inclusion
n File-t SOHA nem include-olunk URL alapján
n Triviális példa:
http://example.com/index.php?p=../../../../etc/
passwd
http://example.com/index.php?p=index.php
Tuesday, April 3, 12
19. Alapok
n Soha, de soha ne nyúljunk a core kódhoz!
Tuesday, April 3, 12
20. Alapok
n Használjuk a Drupal függvényeit és API-jait
n Nálunk tapasztaltabb emberek írták
n Könnyű megtanulni őket
n Hosszú távon úgyis gyorsabban végezzük el a
feladatainkat
Tuesday, April 3, 12
21. Alapok
n Minimális jogosultságok mindenkinek
n A következő jogosultságok megadásával odaadjuk a
siteunkat:
n Administer content types
n Administer users
n Administer permissions
n Administer filters
n Administer site configuration
Tuesday, April 3, 12
22. Input formats
n Amit csak nagyon megbízható felhasználóknak engedünk:
n Full HTML
n PHP
Tuesday, April 3, 12
23. Access control
n Használd:
n node_access
n user_access
n hook_menu
Tuesday, April 3, 12
24. hook_menu()
n 'access callback'
n ezzel a függvénnyel ellenőrzi a Drupal, hogy az
adott felhasználó jogosult-e az oldal megnézésére
n alapértelmezett érték: user_access
n 'access arguments'
n egy tömb, ami paraméterként adódik át
n user_access esetén elég egy elem, a jogosultság
neve
Tuesday, April 3, 12
25. hook_menu()
n
Rossz példa:
function hook_menu() {
return array(
'foobar' => array(
'access callback' => TRUE,
),
);
}
Tuesday, April 3, 12
26. hook_menu()
n Még egy rossz példa
function hook_menu() {
return array('foobar' => array(
'access callback' => user_access('some
permission'),
));
}
Tuesday, April 3, 12
27. hook_menu()
n
Jó példa
function hook_perm() { return array('do sg with my module'); }
function hook_menu() {
return array( 'foobar' => array(
'access arguments' => array('do sg with my module'),
));
}
Tuesday, April 3, 12
28. Valamit csinálni akarunk egy másik user
nevében
n
Rossz példa
global $user;
…
$user = user_load(1);
n
Rossz példa
global $user;
...
$user->uid = 1;
Tuesday, April 3, 12
29. Valamit csinálni akarunk egy másik user
nevében
n Jó példa
global $user;
…
drupal_save_session(FALSE);
$user = user_load(1);
n Ha nem muszáj a jelenlegi userre hivatkozni, akkor ne
használjuk az user változót
Tuesday, April 3, 12
30. SQL injection
n Nem megfelelően kezelt
sztring beillesztése SQL
lekérésbe
n Mindig kritikus hiba
Tuesday, April 3, 12
31. SQL injection
n mysqli_query(”SELECT * FROM node WHERE nid =
” . $_GET['nid']);
n Ez ilyesztő
Tuesday, April 3, 12
32. SQL injection
n mysqli_query(”SELECT * FROM node WHERE nid =
” . $_REQUEST['nid']);
n Ez még ilyesztőbb
Tuesday, April 3, 12
33. SQL injection
n mysqli_query($_REQUEST['searchQuery']);
n Ez talán a legrémesebb.
n Van ilyen: Google ”inurl:SELECT inurl:FROM inurl:WHERE”
Tuesday, April 3, 12
34. SQL injection
n Nem SQL injection, de sok kezdő fejlesztő beleszalad
n SELECT * FROM ”user” WHERE ”name” LIKE '%
$username%'
Tuesday, April 3, 12
35. Feltöltött fájlok
n Mindig ellenőrizni:
n méret
n kiterjesztés
n felbontás (képek esetén)
n file_check_location()
n Lehetőleg soha ne include-oljunk felhasználó által feltöltött
fájlt
Tuesday, April 3, 12
36. CSRF
<img src=”http://drupal.org/logout”/>
Tuesday, April 3, 12
37. CSRF
n Cross-site request forgery
Tuesday, April 3, 12
38. Megelőzés
n
Ahol lehet, ott form api-t használni
n
token használata
n
hozzáadás:
$token = drupal_get_token('foo');
l($text, ”some/path/$token”);
n
ellenőrzés:
function my_page_callback($args, $token) {
if(!drupal_valid_token($token, 'foo'))
drupal_access_denied();
else {
...
}
}
Tuesday, April 3, 12
39. XSS
n Cross site scripting
Tuesday, April 3, 12
40. XSS példa
n Node címek listázása saját theme függvénnyel:
$output = '<li>' . $node->title . '</li>';
return $output;
n Mi van, ha a node címe a következő?
'<script>alert(”U R H4XXD LULZ”);
</script>'
Tuesday, April 3, 12
41. XSS
n Nem csak vicces dialógusok feldobálásra való
n Bármit megtehetünk, amit az adott bejelentkezett
felhasználó megtehet.
Tuesday, April 3, 12
43. Védekezés
n ”Csak” escape-elni kell
n htmlspecialchars($text, ENT_QUOTES, 'UTF-8');
n de nem szabad elfelejteni
n nem kellene többször megcsinálni
n abban a szövegben sem lesz markup, ahol kellene
lennie
Tuesday, April 3, 12
44. Problémák
n A környezet más értelmet ad a jeleknek
I CAN HAZ <b>CHEEZBURGER</b> LULZ!
<b> is not deprecated
<span attribute=”$foo”>$bar</span>
Tuesday, April 3, 12
46. check_plain()
n plain text környezet:
<b> is not deprecated
n html környezet:
<b> is not deprecated
Tuesday, April 3, 12
47. check_markup()
n Rich text környezet
[#8] foobar n baz
n HTML környezet
<p> <a href=”http://drupal.org/node/8”> node/8
</a> foobar <br /> baz </p>
Tuesday, April 3, 12
48. check_url()
n URL környezet
http://asdf.com/?foo=42&bar=baz
n HTML környezet
http://asdf.com/?foo=42&bar=baz
Tuesday, April 3, 12
49. filter_xss()
n Felhasználó által adott HTML
<p>foo</p><script>alert('bar');</script>
n Biztonságos HTML
<p>foo</p>alert('bar');
Tuesday, April 3, 12
50. filter_xss()
n Felhasználó által adott HTML
<img src=”abc.jpg” onmouseover=”...” />
n Biztonságos HTML
<img src=”abc.jpg” />
Tuesday, April 3, 12
51. filter_xss()
n Felhasználó által adott HTML
<img src=”javascript:doSomethingBad()” />
n Biztonságos HTML
<img src=”doSomethingBad()” />
Tuesday, April 3, 12
52. Mi mit vár
n HTML n
Sima szöveg
n checkboxes #options n
select #options
n radios #options
n
l()
n l()
n drupal_set_title
n drupal_set_message
n watchdog
Tuesday, April 3, 12
53. Mi mit vár
n HTML
n site mission
n slogan
n footer
Tuesday, April 3, 12
54. Mi mit vár
n Sima szöveg
n termek
n felhasználónevek
n tartalomtípusok
n node név
Tuesday, April 3, 12
55. Mi mit vár
n Rich text
n comment body
n node body
Tuesday, April 3, 12
56. t()
n Plain text → HTML
n t('@var', array('@var' => $plain_text));
n @: plain text
n t('%var', array('%var' => $plain_text));
n %: kiemelt szöveg
n HTML → HTML
n t('!var', array('!var' => $html));
Tuesday, April 3, 12
57. .htaccess
n Nagyon fontos fájl!
n Ha nincs ott, akkor könnyen okozhat sebezhetőséget
n pl.: directory listing + backup a settings.php-ről
Tuesday, April 3, 12
58. Példák sebezhetőségekre
n Webshopnál az áru mennyisége nem ”1”, hanem ”.1”
n Webshop: ár eltárolása hidden mezőben, átírva 0-ra ingyen
lehet rendelni
Tuesday, April 3, 12
59. Példák sebezhetőségekre
n Sütiben felhasználónév vagy userid eltárolása
n Sok oldalnál nyitvahagyják a memcache portját (11211),
így a cache-elt adatok könnyedén manipulálhatók.
Tuesday, April 3, 12
60. További olvasnivaló
n http://acko.net/blog/safe-string-theory-for-the-web
n http://drupal.org/writing-secure-code
n http://drupal.org/security-team
n http://owasp.org
n http://crackingdrupal.com
n http://api.drupal.org
Tuesday, April 3, 12
61. recruitment@pronovix.com
Belga-magyar cég
Közép-Európa egyik legjobb csapata
<15 fő
Utazás, csoki, sör
Tuesday, April 3, 12