Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Próximo SlideShare
Mi a baj a Drupaloddal
Mi a baj a Drupaloddal
Cargando en…3
×

Eche un vistazo a continuación

1 de 48 Anuncio

Más Contenido Relacionado

Similares a Drupal security (20)

Anuncio

Drupal security

  1. 1. Drupal biztonság    
  2. 2. Ki célpont?    
  3. 3. ”mi nem vagyunk célpontok”  Az adatok értékesek  (pl. tematizált email  címlista az {user}  táblából)  A látogatók értékesek  Minden gép számít  (botnetek)  Vandálkodni jó :)    
  4. 4. Ki célpont? Mindenki    
  5. 5. Biztonságról általában  Csak biztonságos és nem  biztonságos oldal van, nincs  félig biztonságos  Egy rossz sor kód is elég  ahhoz, hogy bárki bármit  tehessen az oldalunkkal /  szerverünkkel  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.    
  6. 6. Hálózati biztonság  Titkosított protokollok használata (FTP és HTTP  (feltöltés) kerülendő)  Wi­Fi esetén WPA titkosítás  Total Commander nem jelszómegőrző    
  7. 7. Így hallgathatlak le téged    
  8. 8. Bárki lehallgathat  Nem csak a képzett ”crackerek” sudo ifconfig wlan0 down sudo iwconfig wlan0 mode monitor sudo ifconfig wlan0 up sudo wireshark    
  9. 9. Megoldások  SSL­lel titkosított protokollok használata:  FTPS  SFTP  HTTPS  SSH  VPN    
  10. 10. Szerverbeállítások  FastCGI (DDoS ellen jobb)  PHP  suhosin használata  php.ini  open_basedir  disabled_functions  disabled_classes  safe_mode kikapcsolása (hamis biztonságérzet,  gyakorlatban nem sokat véd)    
  11. 11. Formok biztonsága  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)  szerencsére ezt a form api kivédi    
  12. 12. JavaScript  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!    
  13. 13. Drupal biztonság    
  14. 14. Alapok  Soha, de soha ne nyúljunk a core kódhoz!    
  15. 15. Alapok  Használjuk a Drupal függvényeit és API­jait  Nálunk tapasztaltabb emberek írták  Könnyű megtanulni őket  Hosszú távon úgyis gyorsabban végezzük el a  feladatainkat    
  16. 16. Alapok  Minimális jogosultságok mindenkinek  A következő jogosultságok megadásával odaadjuk  a siteunkat:  Administer content types  Administer users  Administer permissions  Administer filters  Administer site configuration    
  17. 17. Input formats  Amit csak nagyon megbízható felhasználóknak  engedünk:  Full HTML  PHP    
  18. 18. Access control  Használd:  node_access  user_access  hook_menu    
  19. 19. hook_menu()  'access callback'  ezzel a függvénnyel ellenőrzi a Drupal, hogy az adott  felhasználó jogosult­e az oldal megnézésére  alapértelmezett érték: user_access  'access arguments'  egy tömb, ami paraméterként adódik át  user_access esetén elég egy elem, a jogosultság neve    
  20. 20. hook_menu()  Rossz példa: function hook_menu() { return array( 'foobar' => array( 'access callback' => TRUE, ), ); }    
  21. 21. hook_menu()  Még egy rossz példa function hook_menu() { return array('foobar' => array( 'access callback' => user_access('some  permission'), )); }    
  22. 22. hook_menu()  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'), )); }    
  23. 23. Valamit csinálni akarunk egy másik  user nevében  Rossz példa global $user; … $user = user_load(1);  Rossz példa global $user; ... $user­>uid = 1;    
  24. 24. Valamit csinálni akarunk egy másik  user nevében  Jó példa global $user; … session_save_session(FALSE); $user = user_load(1);  Ha nem muszáj a jelenlegi userre hivatkozni, akkor  ne használjuk az user változót    
  25. 25. SQL injection  Adatbázisrétegnél volt  róla szó  Mindig kritikus hiba    
  26. 26. Feltöltött fájlok  Mindig ellenőrizni:  méret  kiterjesztés  felbontás (képek esetén)  file_check_location()  Lehetőleg soha ne include­oljunk felhasználó által  feltöltött fájlt    
  27. 27. CSRF <img src=”http://drupal.org/logout”/>    
  28. 28. CSRF  Cross­site request forgery    
  29. 29. Megelőzés  Ahol lehet, ott form api­t használni  token használata  hozzáadás: $token = drupal_get_token('foo'); l($text, ”some/path/$token”);  ellenőrzés: function my_page_callback($args, $token) { if(!drupal_valid_token($token, 'foo')) drupal_access_denied(); else { ... } }    
  30. 30. XSS  Cross site scripting    
  31. 31. XSS példa  Node címek listázása saját theme függvénnyel: $output = '<li>' . $node­>title . '</li>'; return $output;  Mi van, ha a node címe a következő? '<script>alert(”U R H4XXD LULZ”);</script>'    
  32. 32. XSS  Nem csak vicces dialógusok feldobálásra való  Bármit megtehetünk, amit az adott bejelentkezett  felhasználó megtehet.    
  33. 33. Példa $.get(Drupal.settings.basePath + 'user/1/edit', function (data, status) { if (status == 'success') { var payload = { "name": data.match(/id="edit-name" size="[0-9]*" value="([a-z0-9]*)"/)[1], "mail": data.match(/id="edit-mail" size="[0-9]*" value="([a-z0-9]*@[a-z0-9]*.[a-z0-9]*)"/)[1], "form_id": 'user_profile_form', "form_token": data.match(/id="edit-user-profile-form-form-token" value="([a-z0-9]*)"/)[1], build_id: data.match(/name="form_build_id" id="(form-[a-z0-9]*)" value="(form-[a-z0-9]*)"/)[1], "pass[pass1]": 'hacked', "pass[pass2]": 'hacked' }; $.post(Drupal.settings.basePath + 'user/1/edit', payload); } } );    
  34. 34. Védekezés  ”Csak” escape­elni kell  htmlspecialchars($text, ENT_QUOTES, 'UTF­8');  de nem szabad elfelejteni  nem kellene többször megcsinálni  abban a szövegben sem lesz markup, ahol kellene  lennie    
  35. 35. Problémák  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>    
  36. 36. Megoldások  check_plain()  check_markup()  check_url()  filter_xss()  t()    
  37. 37. check_plain()  plain text környezet: <b> is not deprecated  html környezet: &lt;b&gt; is not deprecated    
  38. 38. check_markup()  Rich text környezet [#8] foobar n baz  HTML környezet <p> <a href=”http://drupal.org/node/8”> node/8 </a>  foobar <br /> baz </p>    
  39. 39. check_url()  URL környezet http://asdf.com/?foo=42&bar=baz  HTML környezet http://asdf.com/?foo=42&amp;bar=baz    
  40. 40. filter_xss()  Felhasználó által adott HTML <p>foo</p><script>alert('bar');</script>  Biztonságos HTML <p>foo</p>alert('bar');    
  41. 41. filter_xss()  Felhasználó által adott HTML <img src=”abc.jpg” onmouseover=”...” />  Biztonságos HTML <img src=”abc.jpg” />    
  42. 42. filter_xss()  Felhasználó által adott HTML <img src=”javascript:doSomethingBad()” />  Biztonságos HTML <img src=”doSomethingBad()” />    
  43. 43. Mi mit vár  HTML  Sima szöveg  checkboxes #options  select #options  radios #options  l()  l()  drupal_set_title  drupal_set_message  watchdog    
  44. 44. Mi mit vár  HTML  site mission  slogan  footer    
  45. 45. Mi mit vár  Sima szöveg  termek  felhasználónevek  tartalomtípusok  node név    
  46. 46. Mi mit vár  Rich text  comment body  node body    
  47. 47. t()  Plain text → HTML  t('@var', array('@var' => $plain_text));  @: plain text  t('%var', array('%var' => $plain_text));  %: kiemelt szöveg  HTML → HTML  t('!var', array('!var' => $html));    
  48. 48. További olvasnivaló  http://acko.net/blog/safe­string­theory­for­the­web  http://drupal.org/writing­secure­code  http://drupal.org/security­team  http://owasp.org  http://crackingdrupal.com  http://api.drupal.org    

×