程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 防注入安全實現程序代碼

PHP 防注入安全實現程序代碼

編輯:關於PHP編程

以前講述的很多關於sql防注入的代碼,但是還是得從我們的服務器腳本開始了,下面就來講述一個下php中防注入的一些常見方法大家可參考。

最常用見的可能就是

首先將magic_quotes_gpc設置為On,display_errors設置為Off,如果id型,我們利用intval()將其轉換成整數類型,如代碼:
$id=intval($id);

好了下面我來介紹php提交數據過濾的基本原則 

1)提交變量進數據庫時,我們必須使用addslashes()進行過濾,像我們的注入問題,一個addslashes()也就搞定了。其實在涉及到變量取值時,intval()函數對字符串的過濾也是個不錯的選擇。

2)在php.ini中開啟magic_quotes_gpc和magic_quotes_runtime。magic_quotes_gpc可以把get,post,cookie裡的引號變為斜槓。magic_quotes_runtime對於進出數據庫的數據可以起到格式話的作用。其實,早在以前注入很瘋狂時,這個參數就很流行了。

3)在使用系統函數時,必須使用escapeshellarg(),escapeshellcmd()參數去過濾,這樣你也就可以放心的使用系統函數。

4)對於跨站,strip_tags(),htmlspecialchars()兩個參數都不錯,對於用戶提交的的帶有html和php的標記都將進行轉換。比如尖括號"<"就將轉化為 "<"這樣無害的字符。

 代碼如下 復制代碼 $new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
strip_tags($text,);

5)對於相關函數的過濾,就像先前的include(),unlink,fopen()等等,只要你把你所要執行操作的變量指定好或者對相關字符過濾嚴密,我想這樣也就無懈可擊了。

2、PHP簡單的數據過濾

1)入庫:  trim($str),addslashes($str)
2)出庫:  stripslashes($str)
3)顯示:  htmlspecialchars(nl2br($str))

分享一個實例

具體的代碼:

 代碼如下 復制代碼

<?php
   //security.php
/**
 * @author zhengwei
 * @copyright 2007
 */

/*
函數名稱:inject_check()
函數作用:檢測提交的值是不是含有SQL注射的字符,防止注射,保護服務器安全
參  數:$sql_str: 提交的變量
返 回 值:返回檢測結果,ture or false
函數作者:heiyeluren
*/
function inject_check($sql_str) { 
  return eregi('select|insert|update|delete|'|/*|*|../|./|union|into|load_file|outfile', $sql_str);    // 進行過濾 

 
/*
函數名稱:verify_id()
函數作用:校驗提交的ID類值是否合法
參  數:$id: 提交的ID值
返 回 值:返回處理後的ID
函數作者:heiyeluren
*/
function verify_id($id=null) { 
  if (!$id) { exit('沒有提交參數!'); }    // 是否為空判斷 
  elseif (inject_check($id)) { exit('提交的參數非法!'); }    // 注射判斷 
  elseif (!is_numeric($id)) { exit('提交的參數非法!'); }    // 數字判斷 
  $id = intval($id);    // 整型化 
 
  return  $id; 

 
/*
函數名稱:str_check()
函數作用:對提交的字符串進行過濾
參  數:$var: 要處理的字符串
返 回 值:返回過濾後的字符串
函數作者:heiyeluren
*/
function str_check( $str ) { 
  if (!get_magic_quotes_gpc()) {    // 判斷magic_quotes_gpc是否打開 
    $str = addslashes($str);    // 進行過濾 
  } 
  $str = str_replace("_", "_", $str);    // 把 '_'過濾掉 
  $str = str_replace("%", "%", $str);    // 把 '%'過濾掉 
 
  return $str;  

 
/*
函數名稱:post_check()
函數作用:對提交的編輯內容進行處理
參  數:$post: 要提交的內容
返 回 值:$post: 返回過濾後的內容
函數作者:heiyeluren
*/
function post_check($post) { 
  if (!get_magic_quotes_gpc()) {    // 判斷magic_quotes_gpc是否為打開 
    $post = addslashes($post);    // 進行magic_quotes_gpc沒有打開的情況對提交數據的過濾 
  } 
  $post = str_replace("_", "_", $post);    // 把 '_'過濾掉 
  $post = str_replace("%", "%", $post);    // 把 '%'過濾掉 
  $post = nl2br($post);    // 回車轉換 
  $post = htmlspecialchars($post);    // html標記轉換 
 
  return $post; 


foreach ($_POST as $post_key=>$post_var)
{
 if (is_numeric($post_var)) {
  $post[strtolower($post_key)] = get_int($post_var);
 } else {
  $post[strtolower($post_key)] = get_str($post_var);
 }
}

/* 過濾函數 */
//整型過濾函數
function get_int($number)
{
    return intval($number);
}
//字符串型過濾函數
function get_str($string)
{
    if (!get_magic_quotes_gpc()) {
 return addslashes($string);
    }
    return $string;
}

?>

在有些cms中我會看到

foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}


 

這個的代碼然後在所有頁面都加載這個函數,這樣過濾個人發現好像上傳文件時會有問題哦。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved