前提條件是我們需要有服務器的管理權限,就是可以修改php.ini文件了,下面我來介紹修改php配置文件來防范SQL注入方法有需要學習的朋友可參考.
為了安全起見,可以打開“php.ini”文件的安全模式,設置“safe_mode=On”;顯示 PHP 執行錯誤信息的 “display_erros”選項如果打開的話,將會返回很多可利用的信息給入侵者,因此要將其設置為“display_erros=off”;這樣,PHP 函數執行錯誤后的信息將不會在客戶端的瀏覽器中進行顯示.
此外,在文件還有一個很重要的配置選項,如果將其中的“magic_quotes_gpc”項設置為“On”,PHP 程序會自動將用戶提交的變量是含有的“'”、“"”、“”自動轉為含有反斜線的轉義字符,這個選項類似 ASP 程序中的參數過濾,可以對大部分字符型注入攻擊起到防范的作用.
一段程序非常不錯,如果你沒有服務器管理權限,可以使用如下代碼:
- <?php
- class sqlsafe {
- private $getfilter = "'|(and|or)/b.+?(>|<|=|in|like)|///*.+?/*//|</s*script/b|/bEXEC/b|UNION.+?SELECT|UPDATE.+?SET|INSERT/s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)/s+(TABLE|DATABASE)";
- private $postfilter = "/b(and|or)/b.{1,6}?(=|>|<|/bin/b|/blike/b)|///*.+?/*//|</s*script/b|/bEXEC/b|UNION.+?SELECT|UPDATE.+?SET|INSERT/s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)/s+(TABLE|DATABASE)";
- private $cookiefilter = "/b(and|or)/b.{1,6}?(=|>|<|/bin/b|/blike/b)|///*.+?/*//|</s*script/b|/bEXEC/b|UNION.+?SELECT|UPDATE.+?SET|INSERT/s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)/s+(TABLE|DATABASE)";
- /**
- * 構造函數
- */
- public function __construct() {
- foreach($_GET as $key=>$value){$this->stopattack($key,$value,$this->getfilter);}
- foreach($_POST as $key=>$value){$this->stopattack($key,$value,$this->postfilter);}
- foreach($_COOKIE as $key=>$value){$this->stopattack($key,$value,$this->cookiefilter);}
- }
- /**
- * 參數檢查并寫日志
- */
- public function stopattack($StrFiltKey, $StrFiltValue, $ArrFiltReq){
- if(is_array($StrFiltValue))$StrFiltValue = implode($StrFiltValue);
- if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue) == 1){
- $this->writeslog($_SERVER["REMOTE_ADDR"]." ".strftime("%Y-%m-%d %H:%M:%S")." ".$_SERVER["PHP_SELF"]." ".$_SERVER["REQUEST_METHOD"]." ".$StrFiltKey." ".$StrFiltValue);
- showmsg('您提交的參數非法,系統已記錄您的本次操作!','',0,1);
- }
- }
- /**
- * SQL注入日志
- */
- public function writeslog($log){
- $log_path = CACHE_PATH.'logs'.DIRECTORY_SEPARATOR.'sql_log.txt';//開源代碼Vevb.com
- $ts = fopen($log_path,"a+");
- fputs($ts,$log."rn");
- fclose($ts);
- }
- }
- ?>
新聞熱點
疑難解答