php網站如何防止sql注入?

WBOY
發布: 2016-07-25 09:13:40
原創
1177 人瀏覽過
     網站的運作安全肯定是每個站長必須考慮的問題,大家知道,大多數駭客攻擊網站都是採用sql注入,這就是我們常說的為什麼   ?

     最原始的靜態的網站反而是最安全的。今天我們講講PHP注入的安全規範,並防止自己的網站被sql注入。

如今主流的網站開發語言還是php,那我們就從php網站如何防止sql注入開始說起:

Php注入的安全防範透過上面的過程,我們可以了解到php注入的原理和手法,當然我們也同樣可以發展出相應該的防範方法:
首先是伺服器的安全設置,這裡主要是php+mysql的安全設定和linux主機的安全設定。對php+mysql注射的防範,首先將magic_quotes_gpc設定為On,display_errs設定為Off,如果id型,我們利用intval()將其轉換成整數類型,如程式碼:



$idintval($id);
mysql_query”*fromexamplewherearticieid’$id’”;或這樣寫:mysql_query(”SELECT*FROMarticleWHEREarticleid”.intval($id).”")
如果是字元型就用addslashes()過濾一下,然後再過濾”%”和”_”如:
$searchaddslashes($search);
$searchstr_replace(“_”,”_”,$search);
$searchstr_replace(“%”,”%”,$search);
當然也可以加php通用防注入程式碼:
/*************************
PHP通用防注入安全程式碼
說明:
判斷傳遞的變數是否含有非法字元
如$_POST、$_GET
功能:
防注入
  1. **************************/
  2. //要過濾的非法字元
  3. $ArrFiltratearray(”'”,”;”,”union”);
  4. / /出錯後要跳轉的url,不填則預設前一頁
  5. $StrGoUrl”";
  6. //是否存在數組中的值
  7. functionFunStringExist($ StrFiltrate,$ArrFiltrate){
  8. feach($ArrFiltrateas$key>$value){
  9. if(eregi($value,$StrFiltrate)){
  10. return
    return

  11. }

  12. }

  13. returnfalse;

  14. }

  15. //合併$_POST和$_GET


  16. $ArrPostAndGetarray_merge($HTTP_POST_VARS,$HTTP_GET_VARS);

  17. }else{
  18. $ArrPostAndGet[]$value;
  19. }
  20. feach($HTTP_GET_VARSas$key>$value){
  21. $ArrostAndPostAnd]$value >
    }

  22. }

  23. //驗證開始

  24. feach($ArrPostAndGetas$key>$value){

  25. if(FunStringExist($ value,$ArrFiltrate)){

  26. echo“alert(/”Neeao提示,非法字元/”);”;

  27. if(empty($StrGoUrl)){

  28. echo“histy.go(-1);”;

  29. }else{

  30. echo“window.location/”".$StrGoUrl.”/”;”;

  31. }

  32. exit;

  33. }

  34. }

  35. ?>

  36. /********** ***************

  37. 複製程式碼
儲存為checkpostget.php
然後在每個php檔案前加include(“checkpostget.php“);即可
**************************/
另外將管理者使用者名稱和密碼都採取md5加密,這樣就能有效地防止了php的注入。
還有伺服器和mysql也要加強一些安全防範。
對於linux伺服器的安全設定:
加密口令,使用「/usr/sbin/authconfig」工具開啟密碼的shadow功能,對passwd進行加密。
禁止存取重要文件,進入linux指令介面,在提示下輸入:
#chmod600/etc/inetd.conf//改變檔案屬性為600
#chattr+I  /etc/inetd.conf   //保證文件屬主為root
#chattr–I  /etc/inetd.conf   //對該文件的變更做限制
禁止任何使用者透過su指令改變為root使用者
在su設定檔即/etc/pam.d/目錄下的開頭加入下面兩行:
Auth  sufficient  /lib/security/pam_rootok.sodebug
Auth  required  /lib/security/pam_whell.sogroupwheel
刪除所有的特殊帳號
#userdel  lp等等刪除使用者
#groupdellp等等刪除群組
禁止不使用的suid/sgid程式
#find/-typef(-perm-04000  -o–perm-02000)-execls–lg{};



http://hi.baidu.com/bigideaer/bl ... 7e76e11a4cffd0.html

判斷傳遞的變數中是否含有非法字元我們把以下程式碼放到一個公共的文件裡,例如security.inc.php裡面,每個檔案裡都include一下這個文件,那麼就能夠給任何一個程式進行提交的所有變數被過濾了,就達到了我們一勞永逸的效果。



簡述:/*************************
說明:
判斷傳遞的變數是否含有非法字元
如$_POST、$_GET
功能:防注入
**************************/

程式碼如下:

  1. //要過濾的非法字元
  2. $ArrFiltrate("""" ;","union");
  3. //出錯後要跳轉的url,不填則預設前一頁
  4. $StrGoUrl"";
  5. //是否存在陣列中的值
  6. functionFunStringExist($StrFiltrate,$ArrFiltrate){
  7. feach($ArrFiltrateas$key>$value){
  8. if ,$StrFiltrate)){
  9. returntrue;
  10. }
  11. }
  12. returnfalse;
  13. }
    returnfalse>

  14. }
  15. 🎜>
    //合併$_POST和$_GET

  16. if(function_exists(array_merge)){

  17. $ArrPostAndGetarray_merge($HTTP_POST_VARS,HTTP_POST_$HT); else{

  18. feach($HTTP_POST_VARSas$key>$value){

  19. $ArrPostAndGet[]$value;

  20. } $value){

  21. $ArrPostAndGet[]$value;

  22. }

  23. }


  24. }


  25. /驗證開始🎜>
  26. feach($ArrPostAndGetas$key>$value){
  27. if(FunStringExist($value,$ArrFiltrate)){
  28. echo"alert( "非法字元");";
  29. if(emptyempty($StrGoUrl)){
  30. echo"histy.go(-1);";
  31. }else{
  32. echo"window.location"".$StrGoUrl."";";
  33. }
  34. exit;
  35. }
  36. }
  37. ?>

  38. ?>
>
複製程式碼

儲存為checkpostget.php
然後在每個php檔案前加include(“checkpostget.php“);即可
方法2

程式碼如下:

  1. /*過濾所有GET過來變數*/
  2. feach($_GETas$get_key>$get_var)
  3. {
    {

  4. if(is_numeric($get_var)){

  5. $get[strtolower($get_key)]get_int($get_var);

  6. }else{
  7. $
    get [strtolower($get_key)]get_str($get_var);

  8. }

  9. }


  10. /*過濾所有POST過來的變數*/

  11. feach($_POSTas$post_key>$post_var)

  12. {

  13. if(is_numeric($post_var)){
  14. $post[strkeytoer( )]get_int($post_var);
  15. }else{
  16. $post[strtolower($post_key)]get_str($post_var);
  17. }

  18. }


  19. /*濾波函數*/

  20. //整型濾波函數

  21. functionget_int($number)

  22. {
  23. {
  24. returnintval($number);
  25. }
  26. //字串型過濾函數
  27. functionget_str($string)

  28. {

  29. if(!get_magic_quotes_gpc()){

  30. returnaddslashes($string);
}
return$string;
複製程式碼第一個是對資料進行轉義的方法

第二個方法寫在單獨的文件裡,引入每一個PHP檔案內

就可以實現對每一個資料進行轉義處理了

functionsaddslashes($string){

if(is_array($string)){

feach($stringas$key>$val){

  $string[$key]saddslashes($val);

}

}else{

$stringaddslashes($string);

}

return$string;

}





########################################################### ###############

$magic_quoteget_magic_quotes_gpc();

if(empty($magic_quote)){

$_GETsaddslashes($_GET);

$_POSTsaddslashes($_POST);

}

本主題由 小貝 於 2015-9-20 13:05 解除置頂


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板