php網站如何防止sql注入?

來源:互聯網
上載者:User
網站的運行安全肯定是每個站長必須考慮的問題,大家知道,大多數駭客攻擊網站都是採用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. returntrue;
  11. }
  12. }
  13. returnfalse;
  14. }
  15. //合并$_POST和$_GET
  16. if(function_exists(array_merge)){
  17. $ArrPostAndGetarray_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
  18. }else{
  19. feach($HTTP_POST_VARSas$key>$value){
  20. $ArrPostAndGet[]$value;
  21. }
  22. feach($HTTP_GET_VARSas$key>$value){
  23. $ArrPostAndGet[]$value;
  24. }
  25. }
  26. //驗證開始
  27. feach($ArrPostAndGetas$key>$value){
  28. if(FunStringExist($value,$ArrFiltrate)){
  29. echo“alert(/”Neeao提示,非法字元/”);”;
  30. if(empty($StrGoUrl)){
  31. echo“histy.go(-1);”;
  32. }else{
  33. echo“window.location/”".$StrGoUrl.”/”;”;
  34. }
  35. exit;
  36. }
  37. }
  38. ?>
  39. /*************************
複製代碼儲存為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. $ArrFiltratearray("",";","union");
  3. //出錯後要跳轉的url,不填則預設前一頁
  4. $StrGoUrl"";
  5. //是否存在數組中的值
  6. functionFunStringExist($StrFiltrate,$ArrFiltrate){
  7. feach($ArrFiltrateas$key>$value){
  8. if(eregi($value,$StrFiltrate)){
  9. returntrue;
  10. }
  11. }
  12. returnfalse;
  13. }

  14. //合并$_POST和$_GET
  15. if(function_exists(array_merge)){
  16. $ArrPostAndGetarray_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
  17. }else{
  18. feach($HTTP_POST_VARSas$key>$value){
  19. $ArrPostAndGet[]$value;
  20. }
  21. feach($HTTP_GET_VARSas$key>$value){
  22. $ArrPostAndGet[]$value;
  23. }
  24. }

  25. //驗證開始
  26. feach($ArrPostAndGetas$key>$value){
  27. if(FunStringExist($value,$ArrFiltrate)){
  28. echo"";
  29. if(emptyempty($StrGoUrl)){
  30. echo"";
  31. }else{
  32. echo"";
  33. }
  34. exit;
  35. }
  36. }
  37. ?>

複製代碼儲存為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[strtolower($post_key)]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. returnintval($number);
  24. }
  25. //字串型過濾函數
  26. functionget_str($string)
  27. {
  28. if(!get_magic_quotes_gpc()){
  29. returnaddslashes($string);
  30. }
  31. return$string;
  32. }
複製代碼第一個是對資料進行轉義的方法

第二個方法寫在單獨的檔案裡,引入每一個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 解除置頂
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.