一、SQL注入
所謂SQL注入,就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。具體來說,它是利用現有應用程序,將(惡意)的SQL命令注入到后台數據庫引擎執行的能力,它可以通過在Web表單中輸入(惡意)SQL語句得到一個存在安全漏洞的網站上的數據庫,而不是按照設計者意圖去執行SQL語句。比如先前的很多影視網站泄露VIP會員密碼大多就是通過WEB表單遞交查詢字符暴出的,這類表單特別容易受到SQL注入式攻擊.
例如:
<form action="sqlzhuru.php" method="post"> <input type="text" name="uid" /> <input type="submit" value="提交" /> </form>
sqlzhuru.php:
<?php include("../DB.class.php"); $db = new DB(); $uid = $_POST["uid"]; $sql = "select * from users where uid = '{$uid}'"; echo $sql; var_dump($db->Query($sql));


這樣就可以查到所有信息,解決方法:
1. 手動檢查每一條數據是否為正確的數據類型,自己寫一個方法來過濾提交數據
2.系統自帶的一個方法:mysql_real_escape_string()過濾數據,但該方法在未來版本會淘汰
<?php include("../DB.class.php"); $db = new DB(); $uid = $_POST["uid"]; $uid = mysql_real_escape_string($uid); //系統自帶過濾方法,但已經過時了 $sql = "select * from users where uid = '{$uid}'"; echo $sql; var_dump($db->Query($sql));

3.使用PDO預處理
二、XSS攻擊
跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的Script代碼會被執行,從而達到惡意攻擊用戶的特殊目的。
例如:
<form action="xssgongji.php" method="post"> <input type="text" name="test" /> <input type="submit" value="提交" /> </form>
處理頁面:
<?php include("../DB.class.php"); $db = new DB(); echo $_POST["test"];
若用IE瀏覽器打開test頁面:

因為IE沒有過濾方法,會彈出彈窗,而像谷歌、火狐、360等瀏覽器會屏蔽掉,不會彈出彈窗。
解決方法:
1.自己寫一個方法屏蔽xss攻擊,過濾字符串
2.系統自帶方法解決
<?php /**屏蔽xss攻擊方法 * @blog http://www.phpddt.com * @param $string * @param $low 安全別級低 */ function clean_xss(&$string, $low = False) { if (! is_array ( $string )) { $string = trim ( $string ); $string = strip_tags ( $string ); $string = htmlspecialchars ( $string ); if ($low) { return True; } $string = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $string ); $no = '/%0[0-8bcef]/'; $string = preg_replace ( $no, '', $string ); $no = '/%1[0-9a-f]/'; $string = preg_replace ( $no, '', $string ); $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; $string = preg_replace ( $no, '', $string ); return True; } $keys = array_keys ( $string ); foreach ( $keys as $key ) { clean_xss ( $string [$key] ); } } //just a test $str = 'phpddt.com<meta http-equiv="refresh" content="0;">'; clean_xss($str); //如果你把這個注釋掉,你就知道xss攻擊的厲害了 echo $str; ?>
三、CSRF攻擊
CSRF(Cross-site request forgery跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。盡管聽起來像跨站腳本(XSS),但它與XSS非常不同,並且攻擊方式幾乎相左。XSS利用站點內的信任用戶,而CSRF則通過偽裝來自受信任用戶的請求來利用受信任的網站。與XSS攻擊相比,CSRF攻擊往往不大流行(因此對其進行防范的資源也相當稀少)和難以防范,所以被認為比XSS更具危險性。
例如:
<?php session_start(); $_SESSION["uid"] = "lisi"; ?> <form action="csrfcl.php" method="get"> <input type="text" name="qian" /> <input type="submit" value="提交" /> </form>
處理頁面:
<?php session_start(); include("../DB.class.php"); $db = new DB(); if(empty($_SESSION["uid"])) { echo "未登錄"; } else { $qian = $_GET["qian"]; $sql = "update login set account = account-{$qian} where username = '{$_SESSION['uid']}'"; echo $sql; $db->Query($sql,1); }
打開csrf.php頁面:

數據庫中數據:

這種get傳值方式會在地址欄顯示提交數據,在不關閉頁面的情況下,再做一個頁面,把地址復制進去
<body> <img src="http://localhost/phpanquan/csrfcl.php?qian=100" /> </body>
這樣請求這個頁面,也會將數據庫中數據改掉:

而如果改成POST方式,可以減少這種情況,也可以在表單中用隱藏域多提交一條數據,例如:
<?php session_start(); $_SESSION["uid"] = "lisi"; $str = md5($_SESSION["uid"]); ?> <form action="csrfcl.php" method="post"> <input type="hidden" value="<?php echo $str ?>" name="xinxi" /> <input type="text" name="qian" /> <input type="submit" value="提交" /> </form>
處理頁面:
<?php session_start(); include("../DB.class.php"); $db = new DB(); if(empty($_SESSION["uid"])) { echo "未登錄"; } else { $uid =md5($_SESSION["uid"]); $str = $_POST["xinxi"]; if($uid == $str) { $qian = $_POST["qian"]; $sql = "update login set account = account-{$qian} where username = '{$_SESSION['uid']}'"; echo $sql; $db->Query($sql,1); } }
但是這種方式也不能完全避免CSRF攻擊,即使用MD5加密,也還是有人可以解出來,最好的方法還是使用驗證碼。你不知道驗證碼是怎么生成的,就無法進行CSRF攻擊。
SQL注入只需過濾提交的字符串即可,XSS攻擊用PDO預處理,CSRF攻擊用驗證碼就可解決。
有些黑客會偽造FILE數組上傳,如何辨別:move_upload_file()可以判斷是不是真實文件。
以后做項目,有關安全性的地方一定要謹慎,千萬不要輕易相信用戶上傳或提交的任何數據,一定要進行正確處理。
