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

首頁 > 開發(fā) > PHP > 正文

php安全之防注入詳細介紹

2024-05-04 21:48:18
字體:
供稿:網(wǎng)友

我們知道Web上提交數(shù)據(jù)有兩種方式,一種是get、一種是post,那么很多常見的sql注射就是從get方式入手的,而且注射的語句里面一定是包含一些sql語句的,因為沒有sql語句,那么如何進行,sql語句有四大句:select、update、delete、insert.

那么我們?nèi)绻谖覀兲峤坏臄?shù)據(jù)中進行過濾是不是能夠避免這些問題呢?于是我們使用正則就構(gòu)建如下函數(shù),代碼如下:

  1. /* 
  2. 函數(shù)名稱:inject_check() 
  3. 函數(shù)作用:檢測提交的值是不是含有SQL注射的字符,防止注射,保護服務(wù)器安全 
  4. 參 數(shù):$sql_str: 提交的變量 
  5. 返 回 值:返回檢測結(jié)果,ture or false 
  6. 函數(shù)作者:heiyeluren 
  7. */ 
  8. //開源代碼Vevb.com 
  9. function inject_check($sql_str)  
  10. {  
  11.      return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str);    // 進行過濾  
  12.  }  

我們函數(shù)里把 select,insert,update,delete,union,into,load_file,outfile /*, ./ , ../ , ' 等等危險的參數(shù)字符串全部過濾掉,那么就能夠控制提交的參數(shù)了,程序可以這么構(gòu)建,代碼如下:

  1. <?php 
  2. if (inject_check($_GET['id']))
  3. {
  4.   exit('你提交的數(shù)據(jù)非法,請檢查后重新提交!');
  5. }
  6. else
  7. {
  8.   $id = $_GET['id'];
  9.   echo '提交的數(shù)據(jù)合法,請繼續(xù)!';
  10. }
  11. ?> 

假設(shè)我們提交URL為:a.php?id=1,那么就會提示:

"提交的數(shù)據(jù)合法,請繼續(xù)!",如果我們提交 a.php?id=1%27 select * from tb_name,就會出現(xiàn)提示:"你提交的數(shù)據(jù)非法,請檢查后重新提交!",那么就達到了我們的要求.

但是,問題還沒有解決,假如我們提交的是 a.php?id=1asdfasdfasdf 呢,我們這個是符合上面的規(guī)則的,但是呢,它是不符合要求的,于是我們?yōu)榱丝赡芷渌那闆r,我們再構(gòu)建一個函數(shù)來進行檢查,代碼如下:

  1. /* 
  2. 函數(shù)名稱:verify_id() 
  3. 函數(shù)作用:校驗提交的ID類值是否合法 
  4. 參 數(shù):$id: 提交的ID值 
  5. 返 回 值:返回處理后的ID 
  6. 函數(shù)作者:heiyeluren 
  7. */ 
  8. function verify_id($id=null)  
  9. {  
  10.  
  11.    if (!$id) { exit('沒有提交參數(shù)!'); }    // 是否為空判斷  
  12.  
  13.    elseif (inject_check($id)) { exit('提交的參數(shù)非法!'); }    // 注射判斷  
  14.  
  15.    elseif (!is_numeric($id)) { exit('提交的參數(shù)非法!'); }    // 數(shù)字判斷  
  16.  
  17.    $id = intval($id);    // 整型化  
  18.  
  19.    return  $id;  
  20.  

呵呵,那么我們就能夠進行校驗了,于是我們上面的程序代碼就變成了下面的:

  1. <?php
  2. if (inject_check($_GET['id']))
  3. {
  4.    exit('你提交的數(shù)據(jù)非法,請檢查后重新提交!');
  5. }
  6. else
  7. {
  8.   $id = verify_id($_GET['id']);    // 這里引用了我們的過濾函數(shù),對$id進行過濾  
  9.  echo '提交的數(shù)據(jù)合法,請繼續(xù)!'; 
  10. }
  11. ?> 

好,問題到這里似乎都解決了,但是我們有沒有考慮過post提交的數(shù)據(jù),大批量的數(shù)據(jù)呢?

比如一些字符可能會對數(shù)據(jù)庫造成危害,比如 ' _ ', ' % ',這些字符都有特殊意義,那么我們?nèi)绻M行控制呢?還有一點,就是當我們的php.ini里面的magic_quotes_gpc = off 的時候,那么提交的不符合數(shù)據(jù)庫規(guī)則的數(shù)據(jù)都是不會自動在前面加' '的,那么我們要控制這些問題,于是構(gòu)建如下函數(shù),代碼如下:

  1. /* 
  2. 函數(shù)名稱:str_check() 
  3. 函數(shù)作用:對提交的字符串進行過濾 
  4. 參 數(shù):$var: 要處理的字符串 
  5. 返 回 值:返回過濾后的字符串 
  6. 函數(shù)作者:heiyeluren 
  7. */ 
  8.  
  9. function str_check( $str )  
  10.  
  11. {  
  12.  
  13.    if (!get_magic_quotes_gpc())    // 判斷magic_quotes_gpc是否打開  
  14.  
  15.    {  
  16.  
  17.       $str = addslashes($str);    // 進行過濾  
  18.  
  19.  }  
  20.  
  21.      $str = str_replace("_""_"$str);    // 把 '_'過濾掉  
  22.  
  23.      $str = str_replace("%""%"$str);    // 把' % '過濾掉 
  24.   
  25.    return $str;   
  26.  
  27. }  

OK,我們又一次的避免了服務(wù)器被淪陷的危險.

最后,再考慮提交一些大批量數(shù)據(jù)的情況,比如發(fā)貼,或者寫文章、新聞,我們需要一些函數(shù)來幫我們過濾和進行轉(zhuǎn)換,再上面函數(shù)的基礎(chǔ)上,我們構(gòu)建如下函數(shù),代碼如下:

  1. /* 
  2. 函數(shù)名稱:post_check() 
  3. 函數(shù)作用:對提交的編輯內(nèi)容進行處理 
  4. 參 數(shù):$post: 要提交的內(nèi)容 
  5. 返 回 值:$post: 返回過濾后的內(nèi)容 
  6. 函數(shù)作者:heiyeluren 
  7. */ 
  8. //開源代碼Vevb.com 
  9. function post_check($post)  
  10.  
  11. {  
  12.  
  13.    if (!get_magic_quotes_gpc())    // 判斷magic_quotes_gpc是否為打開  
  14.  
  15.    {  
  16.  
  17.       $post = addslashes($post);    // 進行magic_quotes_gpc沒有打開的情況對提交數(shù)據(jù)的過濾  
  18.  
  19.    }  
  20.  
  21.    $post = str_replace("_""_"$post);    // 把 '_'過濾掉  
  22.  
  23.    $post = str_replace("%""%"$post);    // 把' % '過濾掉  
  24.  
  25.    $post = nl2br($post);    // 回車轉(zhuǎn)換  
  26.  
  27.    $post= htmlspecialchars($post);    // html標記轉(zhuǎn)換  
  28.  
  29.    return $post;  
  30.  
  31. }  

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 恭城| 寻甸| 连城县| 礼泉县| 将乐县| 会宁县| 夏河县| 洮南市| 南昌市| 新津县| 双辽市| 海淀区| 巴彦淖尔市| 佛教| 名山县| 洪泽县| 阳东县| 瑞丽市| 托克托县| 云浮市| 镇雄县| 南投市| 昔阳县| 漠河县| 平山县| 靖宇县| 类乌齐县| 民乐县| 苍溪县| 天等县| 丹江口市| 株洲市| 灵台县| 博爱县| 交城县| 郎溪县| 郎溪县| 佛教| 荥阳市| 滨州市| 大安市|