6個常見的php安全攻擊


1、SQL注入 

SQL注入是一種惡意攻擊,用戶利用在表單字段輸入SQL語句的方式來影響正常的SQL執行。還有一種是通過system()或exec()命令注入的,它具有相同的SQL注入機制,但只針對shell命令。

[php]  view plain copy
  1. $username = $_POST['username'];  
  2. $query = "select * from auth where username = '".$username."'";  
  3. echo $query;  
  4. $db = new mysqli('localhost''demo', ‘demo', ‘demodemo');  
  5. $result = $db->query($query);  
  6. if ($result && $result->num_rows) {  
  7.     echo "<br />Logged in successfully";  
  8. else {  
  9.     echo "<br />Login failed";  
  10. }  


上面的代碼,在第一行沒有過濾或轉義用戶輸入的值($_POST['username'])。因此查詢可能會失敗,甚至會損壞數據庫,這要看$username是否包含變換你的SQL語句到別的東西上。

防止SQL注入 

選項: 

  • 使用mysql_real_escape_string()過濾數據  或 htmlspecialchars
  • 手動檢查每一數據是否為正確的數據類型
  • 使用預處理語句並綁定變量


使用准備好的預處理語句 

  • 分離數據和SQL邏輯
  • 預處理語句將自動過濾(如:轉義)
  • 把它作為一個編碼規范,可以幫助團隊里的新人避免遇到以上問題


[php]  view plain copy
  1. $query = 'select name, district from city where countrycode=?';  
  2. if ($stmt = $db->prepare($query) )  
  3. {  
  4.     $countrycode = 'hk';  
  5.     $stmt->bind_param("s"$countrycode);    
  6.     $stmt->execute();  
  7.     $stmt->bind_result($name$district);  
  8.     while ( $stmt ($stmt->fetch() ){  
  9.         echo $name.', '.$district;  
  10.         echo '<br />';  
  11.     }  
  12.     $stmt->close();  
  13. }  


2、XSS攻擊 

XSS(跨站點腳本攻擊)是一種攻擊,由用戶輸入一些數據到你的網站,其中包括客戶端腳本(通常JavaScript)。如果你沒有過濾就輸出數據到另一個web頁面,這個腳本將被執行。

接收用戶提交的文本內容 

[php]  view plain copy
  1. <?php  
  2. if (file_exists('comments')) {  
  3.     $comments = get_saved_contents_from_file('comments');  
  4. else {  
  5.     $comments = '';  
  6. }  
  7.   
  8. if (isset($_POST['comment'])) {  
  9.     $comments .= '<br />' . $_POST['comment'];  
  10.     save_contents_to_file('comments'$comments);  
  11. }  
  12. >  


輸出內容給(另一個)用戶 

[php]  view plain copy
  1. <form action='xss.php' method='POST'>  
  2. Enter your comments here: <br />  
  3. <textarea name='comment'></textarea> <br />  
  4. <input type='submit' value='Post comment' />  
  5. </form><hr /><br />  
  6.   
  7. <?php echo $comments; ?>  


將會發生什么事? 

  • 煩人的彈窗
  • 刷新或重定向
  • 損壞網頁或表單
  • 竊取cookie
  • AJAX(XMLHttpRequest)


防止XSS攻擊 

為了防止XSS攻擊,使用PHP的htmlentities()函數過濾再輸出到瀏覽器。htmlentities()的基本用法很簡單,但也有許多高級的控制,請參閱 XSS速查表 

3、會話固定 

會話安全,假設一個PHPSESSID很難猜測。然而,PHP可以接受一個會話ID通過一個Cookie或者URL。因此,欺騙一個受害者可以使用一個特定的(或其他的)會話ID 或者釣魚攻擊。



4、會議捕獲和劫持 

這是與會話固定有着同樣的想法,然而,它涉及竊取會話ID。如果會話ID存儲在Cookie中,攻擊者可以通過XSS和JavaScript竊取。如果會話ID包含在URL上,也可以通過嗅探或者從代理服務器那獲得。

防止會話捕獲和劫持 

  • 更新ID
  • 如果使用會話,請確保用戶使用SSL


5、跨站點請求偽造(CSRF) 

CSRF攻擊,是指一個頁面發出的請求,看起來就像是網站的信任用戶,但不是故意的。它有許多的變體,比如下面的例子: 

[xml]  view plain copy
  1. <img src='http://example.com/single_click_to_buy.php?user_id=123&item=12345'>  


防止跨站點請求偽造 

一般來說,確保用戶來自你的表單,並且匹配每一個你發送出去的表單。有兩點一定要記住: 

  1. 對用戶會話采用適當的安全措施,例如:給每一個會話更新id和用戶使用SSL。
  2. 生成另一個一次性的令牌並將其嵌入表單,保存在會話中(一個會話變量),在提交時檢查它。


6、代碼注入 

代碼注入是利用計算機漏洞通過處理無效數據造成的。問題出在,當你不小心執行任意代碼,通常通過文件包含。寫得很糟糕的代碼可以允許一個遠程文件包含並執行。如許多PHP函數,如require可以包含URL或文件名,例如:

[php]  view plain copy
  1. <form>Choose theme:  
  2.     <select name = theme>  
  3.         <option value = blue>Blue</option>  
  4.         <option value = green>Green</option>  
  5.         <option value = red>Red</option>  
  6.     </select>  
  7.     <input type = submit>  
  8. </form>  
  9. <?php  
  10.     if($theme) {  
  11.         require($theme.'.txt');  
  12.     }  
  13. ?>  


在上面的例子中,通過傳遞用戶輸入的一個文件名或文件名的一部分,來包含以"http://"開頭的文件。 

防止代碼注入 

  • 過濾用戶輸入
  • 在php.ini中設置禁用allow_url_fopen和allow_url_include。這將禁用require/include/fopen的遠程文件。

  
其他的一般原則 

1. 不要依賴服務器配置來保護你的應用,特別是當你的web服務器/ PHP是由你的ISP管理,或者當你的網站可能遷移/部署到別處,未來再從別處遷移/部署在到其他地方。請在網站代碼中嵌入帶有安全意識的檢查/邏輯(HTML、JavaScript、PHP,等等)。  
2. 設計服務器端的安全腳本: 
—例如,使用單行執行 - 單點身份驗證和數據清理   
—例如,在所有的安全敏感頁面嵌入一個PHP函數/文件,用來處理所有登錄/安全性邏輯檢查 
3. 確保你的代碼更新,並打上最新補丁。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM