国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php預防XSS攻擊的一些方法整理

2024-05-04 21:48:15
字體:
來源:轉載
供稿:網友

現在有很多php開發框架都提供關于防XSS攻擊的過濾方法,下面和大家分享一個預防XSS攻擊和ajax跨域攻擊的函數,摘自某開發框架,相比于僅僅使用內置函數應該還是夠強了的吧.

對網站發動XSS攻擊的方式有很多種,僅僅使用php的一些內置過濾函數是對付不了的,即使你將filter_var,mysql_real_escape_string,htmlentities,htmlspecialchars,strip_tags這些函數都使用上了也不一定能保證絕對的安全.

那么如何預防 XSS 注入?主要還是需要在用戶數據過濾方面得考慮周全,在這里不完全總結下幾個 Tips.

1. 假定所有的用戶輸入數據都是“邪惡”的 

2. 弱類型的腳本語言必須保證類型和期望的一致 

3. 考慮周全的正則表達式 

4. strip_tags、htmlspecialchars 這類函數很好用 

5. 外部的 Javascript 不一定就是可靠的 

6. 引號過濾必須要重點注意 

7. 除去不必要的 HTML 注釋 

8. Exploer 求你放過我吧……

方法一,利用php htmlentities函數

例子:php防止XSS跨站腳本攻擊的方法:是針對非法的HTML代碼包括單雙引號等,使用htmlspecialchars()函數.

在使用htmlspecialchars()函數的時候注意第二個參數,直接用htmlspecialchars($string) 的話,第二個參數默認是ENT_COMPAT,函數默認只是轉化雙引號(“),不對單引號(‘)做轉義.

所以,htmlspecialchars函數更多的時候要加上第二個參數,應該這樣用: htmlspecialchars($string,ENT_QUOTES).當然,如果需要不轉化如何的引號,用htmlspecialchars($string,ENT_NOQUOTES).

另外,盡量少用htmlentities,在全部英文的時候htmlentities和htmlspecialchars沒有區別,都可以達到目的.但是,中文情況下,htmlentities卻會轉化所有的html代碼,連同里面的它無法識別的中文字符也給轉化了.

htmlentities和htmlspecialchars這兩個函數對 '之類的字符串支持不好,都不能轉化, 所以用htmlentities和htmlspecialchars轉化的字符串只能防止XSS攻擊,不能防止SQL注入攻擊.

所有有打印的語句如echo,print等 在打印前都要使用htmlentities() 進行過濾,這樣可以防止Xss,注意中文要寫出htmlentities($name,ENT_NOQUOTES,GB2312).

方法二,什么也不多說我們給一個函數,代碼如下:

  1. function xss_clean($data){ 
  2.  // Fix &entity\n; 
  3.  $data=str_replace(array('&','<','>'),array('&','<','>'),$data); 
  4.  $data=preg_replace('/(&#*\w+)[\x00-\x20]+;/u','$1;',$data); 
  5.  $data=preg_replace('/(&#x*[0-9A-F]+);*/iu','$1;',$data); 
  6.  $data=html_entity_decode($data,ENT_COMPAT,'UTF-8'); 
  7.  // Remove any attribute starting with "on" or xmlns 
  8.  $data=preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu','$1>',$data); 
  9.  // Remove javascript: and vbscript: protocols 
  10.  $data=preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu','$1=$2nojavascript...',$data); 
  11.  $data=preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu','$1=$2novbscript...',$data); 
  12.  $data=preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u','$1=$2nomozbinding...',$data); 
  13.  // Only works in IE: <span style="width: expression(alert('Ping!'));"></span> 
  14.  $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i','$1>',$data); 
  15.  $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i','$1>',$data); 
  16.  $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu','$1>',$data); 
  17.  // Remove namespaced elements (we do not need them) 
  18.  $data=preg_replace('#</*\w+:\w[^>]*+>#i','',$data); 
  19.  // http://m.survivalescaperooms.com/ 
  20.  do{// Remove really unwanted tags 
  21.   $old_data=$data
  22.   $data=preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i','',$data); 
  23.  }while($old_data!==$data); 
  24.  // we are done... 
  25.  return $data

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 六盘水市| 安顺市| 巨鹿县| 泰来县| 禄丰县| 元谋县| 易门县| 安吉县| 水富县| 彰化市| 原平市| 阳山县| 横山县| 哈巴河县| 福泉市| 沙田区| 潞城市| 平顺县| 洛浦县| 同心县| 丰都县| 团风县| 突泉县| 华亭县| 郧西县| 碌曲县| 轮台县| 古田县| 类乌齐县| 长武县| 大港区| 鄯善县| 宜章县| 三台县| 怀柔区| 大邑县| 玉溪市| 吉隆县| 达孜县| 乌兰浩特市| 临颍县|