亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > PHP > 正文

php防止sql注入實現方法

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

SQL注入因為要操作數據庫,所以一般會查找SQL語句關鍵字:insert、delete、update、select,查看傳遞的變量參數是否用戶可控制,有無做過安全處理.

SQL注入工作原理:構造一個數據庫查詢是一個非常直接的過程,典型的,它會遵循如下思路來實現,僅為說明問題,我們將假定你有一個葡萄酒數據庫表格”wines”,其中有一個字段為”variety”(即葡萄酒類型):

1. 提供一個表單-允許用戶提交某些要搜索的內容,讓我們假定用戶選擇搜索類型為”lagrein”的葡萄酒.

2. 檢索該用戶的搜索術語,并且保存它-通過把它賦給一個如下所示的變量來實現:

$variety = $_POST['variety'];

因此,變量$variety的值現在為:lagrein

3. 然后,使用該變量在WHERE子句中構造一個數據庫查詢,代碼如下:

$query = “SELECT * FROM wines WHERE variety=’$variety’”;

所以,變量$query的值現在如下所示:

SELECT * FROM wines WHERE variety=’lagrein’

4. 把該查詢提交給MySQL服務器.

5. MySQL返回wines表格中的所有記錄-其中,字段variety的值為”lagrein”.

到目前為止,這應該是一個你所熟悉的而且是非常輕松的過程,遺憾的是,有時我們所熟悉并感到舒適的過程卻容易導致我們產生自滿情緒,現在,讓我們再重新分析一下剛才構建的查詢.

1. 你創建的這個查詢的固定部分以一個單引號結束,你將使用它來描述變量值的開始,代碼如下:

$query = ” SELECT * FROM wines WHERE variety = ‘”;

2. 使用原有的固定不變的部分與包含用戶提交的變量的值,代碼如下:

$query .= $variety;

3. 然后,你使用另一個單引號來連接此結果-描述該變量值的結束,代碼如下:

$query .= “‘”;

于是,$query的值如下所示,代碼如下:

SELECT * FROM wines WHERE variety = ‘lagrein’

這個構造的成功依賴用戶的輸入,在本文示例中,你正在使用單個單詞(也可能是一組單詞)來指明一種葡萄酒類型.

因此,該查詢的構建是無任何問題的,并且結果也會是你所期望的-一個葡萄酒類型為”lagrein”的葡萄酒列表,現在,讓我們想象,既然你的用戶不是輸入一個簡單的類型為”lagrein”的葡萄酒類型,而是輸入了下列內容(注意包括其中的兩個標點符號),代碼如下:

lagrein’or 1=1;

現在,你繼續使用前面固定的部分來構造你的查詢(在此,我們僅顯示$query變量的結果值),代碼如下:

SELECT * FROM wines WHERE variety = ‘

然后,你使用包含用戶輸入內容的變量的值與之進行連接(在此,以粗體顯示),代碼如下:

SELECT * FROM wines WHERE variety = ‘lagrein’ or 1=1;

最后,添加上下面的下引號,代碼如下:

SELECT * FROM wines WHERE variety = ‘lagrein’ or 1=1;’

結合上述問題我們寫一個函數,即可防止,代碼如下:

  1. /** 
  2. +---------------------------------------------------------- 
  3. * 防掛馬、防跨站攻擊、防sql注入函數 
  4. +---------------------------------------------------------- 
  5. *$date 傳入的參數,要是個變量或者數組;$ignore_magic_quotes變量的魔術引用 
  6. +---------------------------------------------------------- 
  7. */ 
  8. function in($data,$ignore_magic_quotes=false) 
  9.  if(is_string($data)) 
  10.  { 
  11.   $data=trim(htmlspecialchars($data));//防止被掛馬,跨站攻擊 
  12.   if(($ignore_magic_quotes==true)||(!get_magic_quotes_gpc()))  
  13.   { 
  14.      $data = addslashes($data);//防止sql注入 
  15.   } 
  16.   return  $data
  17.  } 
  18.  else if(is_array($data))//如果是數組采用遞歸過濾 
  19.  { 
  20.   foreach($data as $key=>$value
  21.   { 
  22.     $data[$key]=in($value); 
  23.   }//開源代碼Vevb.com 
  24.   return $data
  25.  } 
  26.  else  
  27.  { 
  28.   return $data
  29.  }  

上面接受數據時我們就可以防止被掛馬,跨站攻擊,防止sql注入等待.

下面來介紹在服務器端做安全配置

(1) 打開php的安全模式

php的安全模式是個非常重要的內嵌的安全機制,能夠控制一些php中的函數,比如system(),同時把很多文件操作函數進行了權限控制,也不允許對某些關鍵文件的文件,比如/etc/passwd,但是默認的php.ini是沒有打開安全模式的,我們把它打開:

safe_mode = on

(2) 用戶組安全

當safe_mode打開時,safe_mode_gid被關閉,那么php腳本能夠對文件進行訪問,而且相同組的用戶也能夠對文件進行訪問.建議設置為:safe_mode_gid = off,如果不進行設置,可能我們無法對我們服務器網站目錄下的文件進行操作了,比如我們需要對文件進行操作的時候.

(3) 安全模式下執行程序主目錄

如果安全模式打開了,但是卻是要執行某些程序的時候,可以指定要執行程序的主目錄,代碼如下:

safe_mode_exec_dir = D:/usr/bin

一般情況下是不需要執行什么程序的,所以推薦不要執行系統程序目錄,可以指向一個目錄,然后把需要執行的程序拷貝過去,比如如下代碼:

safe_mode_exec_dir = D:/tmp/cmd

但是,我更推薦不要執行任何程序,那么就可以指向我們網頁目錄,代碼如下:

safe_mode_exec_dir = D:/usr/www

(4) 安全模式下包含文件

如果要在安全模式下包含某些公共文件,那么就修改一下選項,代碼如下:

safe_mode_include_dir = D:/usr/www/include/

其實一般php腳本中包含文件都是在程序自己已經寫好了,這個可以根據具體需要設置.

(5) 控制php腳本能訪問的目錄

使用open_basedir選項能夠控制PHP腳本只能訪問指定的目錄,這樣能夠避免PHP腳本訪問不應該訪問的文件,一定程度上限制了phpshell的危害,我們一般可以設置為只能訪問網站目錄:

open_basedir = D:/usr/www

(6) 關閉危險函數

如果打開了安全模式,那么函數禁止是可以不需要的,但是我們為了安全還是考慮進去,比如,我們覺得不希望執行包括system()等在那的能夠執行命令的php函數,或者能夠查看php信息的phpinfo()等函數,那么我們就可以禁止它們:

disable_functions = system,passthru,exec,shell_exec,popen,phpinfo

如果你要禁止任何文件和目錄的操作,那么可以關閉很多文件操作,代碼如下:

  1. disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown  

以上只是列了部分不叫常用的文件處理函數,你也可以把上面執行命令函數和這個函數結合,就能夠抵制大部分的phpshell了.

(7) 關閉PHP版本信息在http頭中的泄漏

我們為了防止黑客獲取服務器中php版本的信息,可以關閉該信息斜路在http頭中,代碼如下:expose_php = Off,比如黑客在 telnet www.49028c.com 80 的時候,那么將無法看到PHP的信息.

(8) 關閉注冊全局變量

在PHP中提交的變量,包括使用POST或者GET提交的變量,都將自動注冊為全局變量,能夠直接訪問,這是對服務器非常不安全的,所以我們不能讓它注冊為全局變量,就把注冊全局變量選項關閉,代碼如下:register_globals = Off

當然,如果這樣設置了,那么獲取對應變量的時候就要采用合理方式,比如獲取GET提交的變量var,那么就要用$_GET['var']來進行獲取,這個php程序員要注意.

(9) 打開magic_quotes_gpc來防止SQL注入

SQL注入是非常危險的問題,小則網站后臺被入侵,重則整個服務器淪陷,所以一定要小心,php.ini中有一個設置,代碼如下:magic_quotes_gpc = Off,這個默認是關閉的,如果它打開后將自動把用戶提交對sql的查詢進行轉換,比如把 ' 轉為 '等,這對防止sql注射有重大作用,所以我們推薦設置為:magic_quotes_gpc = On

(10) 錯誤信息控制

一般php在沒有連接到數據庫或者其他情況下會有提示錯誤,一般錯誤信息中會包含php腳本當前的路徑信息或者查詢的SQL語句等信息,這類信息提供給黑客后,是不安全的,所以一般服務器建議禁止錯誤提示:display_errors = Off

如果你卻是是要顯示錯誤信息,一定要設置顯示錯誤的級別,比如只顯示警告以上的信息,代碼如下:error_reporting = E_WARNING & E_ERROR,當然,我還是建議關閉錯誤提示.

(11) 錯誤日志

建議在關閉display_errors后能夠把錯誤信息記錄下來,便于查找服務器運行的原因,代碼如下:log_errors = On,同時也要設置錯誤日志存放的目錄,建議根apache的日志存在一起,代碼如下:

error_log = D:/usr/local/apache2/logs/php_error.log

注意:給文件必須允許apache用戶的和組具有寫的權限.

MYSQL的降權運行,新建立一個用戶比如mysqlstart,代碼如下:

net user mysqlstart fuckmicrosoft /add

net localgroup users mysqlstart /del

不屬于任何組,如果MYSQL裝在d:mysql,那么,給 mysqlstart 完全控制的權限,然后在系統服務中設置,MYSQL的服務屬性,在登錄屬性當中,選擇此用戶 mysqlstart 然后輸入密碼,確定,重新啟動 MYSQL服務,然后MYSQL就運行在低權限下了.

如果是在windos平臺下搭建的apache我們還需要注意一點,apache默認運行是system權限,這很恐怖,這讓人感覺很不爽.那我們就給apache降降權限吧,代碼如下:

net user apache fuckmicrosoft /add

net localgroup users apache /del

ok,我們建立了一個不屬于任何組的用戶apche,我們打開計算機管理器,選服務,點apache服務的屬性,我們選擇log on,選擇this account,我們填入上面所建立的賬戶和密碼,重啟apache服務,ok,apache運行在低權限下了.

實際上我們還可以通過設置各個文件夾的權限,來讓apache用戶只能執行我們想讓它能干的事情,給每一個目錄建立一個單獨能讀寫的用戶.

本文章從程序到數據庫及最后的WEB服務器的配置都有講述,大家參考本文章之后應該要安全了很多了,一般的注入是沒辦法實現了.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产男女猛烈无遮挡91| 亚洲加勒比久久88色综合| 91大神在线播放精品| 欧美在线视频一区二区| 亚洲毛片在线免费观看| 蜜臀久久99精品久久久久久宅男| 久久久久久97| 亚洲欧洲在线视频| 亚洲成色777777女色窝| 国产精品美女久久久久久免费| 欧美激情国产高清| 久久噜噜噜精品国产亚洲综合| xxxxxxxxx欧美| 久久精品国产v日韩v亚洲| 欧美激情精品久久久| 国产精品视频不卡| 伊人亚洲福利一区二区三区| 久久久久久中文| 夜夜嗨av色综合久久久综合网| 欧美日韩国产成人在线观看| 国产精品日韩久久久久| 亚洲成人中文字幕| 亚洲图中文字幕| 久久精品视频在线播放| 亚洲精品中文字幕av| 国产精品久久久av久久久| 一本一本久久a久久精品牛牛影视| 26uuu亚洲伊人春色| 亚洲国产日韩欧美在线99| 日韩av黄色在线观看| 国产经典一区二区| 亚洲乱码一区av黑人高潮| 91亚洲永久免费精品| 成人精品视频久久久久| 欧美性色19p| 成人免费自拍视频| 国产精品劲爆视频| 欧美另类第一页| 国产午夜精品视频| 在线亚洲午夜片av大片| 欧美精品999| 搡老女人一区二区三区视频tv| 国产精品久久久久一区二区| 91干在线观看| 国产一区二区三区四区福利| 成人精品视频99在线观看免费| 欧美老女人www| 国产精品中文字幕久久久| 日韩中文娱乐网| 欧美黄色免费网站| 91人人爽人人爽人人精88v| 日韩欧美精品中文字幕| 久久躁日日躁aaaaxxxx| 国产在线播放不卡| 性色av一区二区三区| 美日韩精品免费视频| 中文字幕精品在线| 91欧美精品成人综合在线观看| 亚州精品天堂中文字幕| 色琪琪综合男人的天堂aⅴ视频| 国产啪精品视频| 日韩精品亚洲精品| 亚洲欧美日韩精品| 欧美视频在线观看免费网址| 国产精品久久久久久亚洲调教| 国产黑人绿帽在线第一区| 亚洲高清久久网| 51精品在线观看| 日本精品久久电影| 在线国产精品播放| 亚洲激情电影中文字幕| 日韩欧美国产成人| 亚洲品质视频自拍网| 秋霞成人午夜鲁丝一区二区三区| 久99久在线视频| 国产精品三级久久久久久电影| 久久精品久久精品亚洲人| 美女视频黄免费的亚洲男人天堂| 成人免费在线视频网站| 欧美极品美女视频网站在线观看免费| 成人xvideos免费视频| 性金发美女69hd大尺寸| 亚洲精品98久久久久久中文字幕| 性亚洲最疯狂xxxx高清| 中文字幕精品一区二区精品| 欧美夜福利tv在线| 中文字幕日韩在线播放| 久久成人在线视频| 久久精品国产精品| 伊人亚洲福利一区二区三区| 奇门遁甲1982国语版免费观看高清| 久久久国产精品x99av| 成人看片人aa| 91久久国产综合久久91精品网站| 国产精品v日韩精品| 欧美精品手机在线| 精品毛片网大全| 日韩一级裸体免费视频| 成人性生交大片免费看小说| 欧美一区亚洲一区| 91丝袜美腿美女视频网站| 热99精品里视频精品| 国产日韩欧美在线看| 久久777国产线看观看精品| 精品国内亚洲在观看18黄| 亚洲综合在线小说| 国产精品视频一区国模私拍| 91美女福利视频高清| 68精品国产免费久久久久久婷婷| 欧美日韩国产精品一区二区三区四区| 久久99国产综合精品女同| 欧美高清在线观看| 欧美日本国产在线| 欧美激情精品久久久久久变态| 国产精品久久久久aaaa九色| 福利视频第一区| 国产成人一区二区三区小说| 国产在线观看91精品一区| 亚洲精品美女网站| 欧美性猛交xxxx| 久久人人爽人人爽爽久久| 久久夜精品香蕉| 在线视频免费一区二区| 亚洲国产精品专区久久| 日韩欧美精品网站| 亚洲欧美日韩一区在线| 亚洲人成在线一二| 日本久久精品视频| 欧洲午夜精品久久久| www欧美xxxx| 九九久久久久久久久激情| 国产丝袜视频一区| 久久久久久尹人网香蕉| 日韩在线观看免费全集电视剧网站| 日韩欧美国产骚| 高跟丝袜一区二区三区| 在线播放精品一区二区三区| 亚洲国产成人精品一区二区| 91久久久亚洲精品| 国产999精品久久久影片官网| 亚洲女人天堂色在线7777| 欧美激情精品久久久久久久变态| 亚洲精品狠狠操| 国产精品老牛影院在线观看| 精品国产一区二区三区久久久狼| 久久久www成人免费精品张筱雨| 国产精品免费视频xxxx| 日韩视频在线观看免费| 亚洲一区二区日本| 亲子乱一区二区三区电影| 久久亚洲精品中文字幕冲田杏梨| 国产欧美日韩中文| 欧美在线观看日本一区| 国产精品美女久久久久久免费| 国产精品久久久久久亚洲影视| 亚洲大胆人体av| 日韩欧美中文免费| 欧美黑人巨大精品一区二区| 国产日韩在线看片| 欧美性xxxxxxx| 欧美色另类天堂2015| 一区二区三区高清国产| 日韩欧美aⅴ综合网站发布| 成人精品在线观看|