Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Drupal security

1,285 views

Published on

  • Be the first to comment

  • Be the first to like this

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    

×