PHP 防注入安全實現程式碼

來源:互聯網
上載者:User

最常用見的可能就是

首先將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;
}


 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.