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

首頁 > 開發 > PHP > 正文

php防止sql注入原理介紹

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

雖然國內很多PHP程序員仍在依靠addslashes防止SQL注入,還是建議大家加強中文防止SQL注入的檢查,addslashes的問題在 于黑客 可以用0xbf27來代替單引號,而addslashes只是將0xbf27修改為0xbf5c27,成為一個有效的多字節字符,其中的0xbf5c仍會被看作是單引號,所以addslashes無法成功攔截.

當然addslashes也不是毫無用處,它是用于單字節字符串的處理,多字節字符還是用mysql_real_escape_string吧.

打開magic_quotes_gpc來防止SQL注入,php.ini中有一個設置:magic_quotes_gpc = Off,這個默認是關閉的,如果它打開后將自動把用戶提交對sql的查詢進行轉換,比如把 ' 轉為 '等,對于防止sql注射有重大作用.

如果magic_quotes_gpc=Off,則使用addslashes()函數,另外對于php手冊中get_magic_quotes_gpc的舉例,代碼如下:

  1. if (!get_magic_quotes_gpc()) { 
  2.  
  3.   $lastname = addslashes($_POST[‘lastname’]); 
  4.  
  5.   } else { 
  6.  
  7.   $lastname = $_POST[‘lastname’]; 
  8.  

最好對magic_quotes_gpc已經開放的情況下,還是對$_POST[’lastname’]進行檢查一下,再說下mysql_real_escape_string和mysql_escape_string這2個函數的區別.

mysql_real_escape_string 必須在(PHP 4 >= 4.3.0, PHP 5)的情況下才能使用,否則只能用 mysql_escape_string,兩者的區別是:mysql_real_escape_string 考慮到連接的當前字符集,而mysql_escape_string 不考慮.

(1)mysql_real_escape_string -- 轉義 SQL 語句中使用的字符串中的特殊字符,并考慮到連接的當前字符集.

使用方法,代碼如下:

$sql = "select count(*) as ctr from users where username02.='".mysql_real_escape_string($username)."' and 03.password='". mysql_real_escape_string($pw)."' limit 1";

PHP自定函數,代碼如下:

  1. function inject_check($sql_str) {  
  2.     return eregi('select|insert|and|or|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str); 
  3. }  
  4.  
  5. function verify_id($id=null) {  
  6.     if(!$id) { 
  7.         exit('沒有提交參數!');  
  8.     } elseif(inject_check($id)) {  
  9.         exit('提交的參數非法!'); 
  10.     } elseif(!is_numeric($id)) {  
  11.         exit('提交的參數非法!');  
  12.     }  
  13.     $id = intval($id);  
  14.       
  15.     return $id;  
  16. }  
  17.  
  18.  
  19. function str_check( $str ) {  
  20.     if(!get_magic_quotes_gpc()) {  
  21.         $str = addslashes($str); // 進行過濾  
  22.     }  
  23.     $str = str_replace("_""_"$str);  
  24.     $str = str_replace("%""%"$str);  
  25.       
  26.    return $str;  
  27. }  
  28.  
  29. function post_check($post) {  
  30.     if(!get_magic_quotes_gpc()) {  
  31.         $post = addslashes($post); 
  32.     } //開源代碼Vevb.com 
  33.     $post = str_replace("_""_"$post);  
  34.     $post = str_replace("%""%"$post);  
  35.     $post = nl2br($post);  
  36.     $post = htmlspecialchars($post);  
  37.       
  38.     return $post;  

總結一下:

* addslashes() 是強行加;

* mysql_real_escape_string() 會判斷字符集,但是對PHP版本有要求;

* mysql_escape_string不考慮連接的當前字符集.

dz中的防止sql注入就是用addslashes這個函數,同時在dthmlspecialchars這個函數中有進行一些替換$string = preg_replace(/&((#(d{3,5}|x[a-fA-F0-9]{4}));)/, &1,這個替換解決了注入的問題,同時也解決了中文亂碼的一些問題.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 县级市| 高邮市| 明溪县| 兰溪市| 河池市| 丁青县| 新乡市| 宜君县| 南郑县| 汾阳市| 普格县| 贺兰县| 安陆市| 桓台县| 德庆县| 黄山市| 栾川县| 尚志市| 荣昌县| 伊川县| 尖扎县| 衡水市| 辰溪县| 疏勒县| 交口县| 方城县| 洱源县| 辛集市| 翁牛特旗| 缙云县| 黄冈市| 樟树市| 大田县| 华亭县| 循化| 兴安盟| 洛南县| 襄樊市| 麦盖提县| 惠安县| 睢宁县|