首頁 後端開發 PHP問題 php防止sql注入的方法總結

php防止sql注入的方法總結

Nov 08, 2019 pm 05:09 PM
php sql注入

php防止sql注入的方法總結

php防止sql注入的方法

【一、在伺服器端設定】

安全,PHP程式碼編寫是一方面,PHP的設定更是非常關鍵。

我們php手手動安裝的,php的預設設定檔在 /usr/local/apache2/conf/php.ini,我們最主要就是要設定php.ini中的內容,讓我們執行php能夠更安全。整個PHP中的安全設定主要是為了防止phpshell和SQL Injection的攻擊,一下我們慢慢探討。我們先使用任何編輯工具開啟 /etc/local/apache2/conf/php.ini,如果你是採用其他方式安裝,設定檔可能不在該目錄中。

(1) 開啟php的安全模式

php的安全模式是個非常重要的內嵌的安全機制,能夠控制一些php中的函數,例如system()

同時把很多文件操作函數進行了權限控制,也不允許對某些關鍵文件的文件,例如/etc/passwd,

#但是預設的php.ini是沒有開啟安全模式的,我們把它打開:

safe_mode = on
登入後複製

(2) 使用者群組安全

當safe_mode打開時,safe_mode_gid被關閉,那麼php腳本能夠對檔案進行訪問,而且相同

群組的使用者也能夠對檔案進行存取。

建議設定為:

safe_mode_gid = off
登入後複製

如果不進行設置,可能我們無法對我們伺服器網站目錄下的檔案進行操作了,例如我們需要對檔案進行操作的時候。

(3) 安全模式下執行程式主目錄

如果安全模式開啟了,但是卻是要執行某些程式的時候,可以指定要執行程式的主目錄:

safe_mode_exec_dir = D:/usr/bin
登入後複製

一般情況下是不需要執行什麼程式的,所以推薦不要執行系統程式目錄,可以指向一個目錄,

然後把需要執行的程式拷貝過去,例如:

safe_mode_exec_dir = D:/tmp/cmd
登入後複製

但是,我更推薦不要執行任何程序,那麼就可以指向我們網頁目錄:

safe_mode_exec_dir = D:/usr/www
登入後複製

(4) 安全模式下包含檔案

如果要在安全模式下包含某些公共文件,那麼就修改一下選項:

safe_mode_include_dir = D:/usr/www/include/
登入後複製

其實一般php腳本中包含文件都是在程式自己已經寫好了,這個可依具體需求設定。

(5) 控制php腳本能存取的目錄

使用open_basedir選項能夠控制PHP腳本只能存取指定的目錄,這樣就能夠避免PHP腳本存取

不應該存取的文件,一定程度上限制了phpshell的危害,我們一般可以設定為只能存取網站目錄:

open_basedir = D:/usr/www
登入後複製

#(6) 關閉危險函數

如果開啟了安全模式,那麼函數禁止是可以不需要的,但是我們為了安全還是考慮進去。例如,

我們覺得不希望執行包括system()等在那的能夠執行指令的php函數,或是能夠查看php資訊的

phpinfo()等函數,那麼我們就可以禁止它們:

disable_functions = system,passthru,exec,shell_exec,popen,phpinfo
登入後複製

如果你要禁止任何檔案和目錄的操作,那麼可以關閉很多檔案操作

disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
登入後複製

以上只是列了部分不叫常用的檔案處理函數,你也可以把上面執行指令函數和這個函數結合,

就能夠抵制大部分的phpshell了。

(7) 關閉PHP版本資訊在http頭中的洩漏

我們為了防止駭客取得伺服器中php版本的信息,可以關閉該資訊斜路在http頭中:

expose_php = Off
登入後複製

例如駭客在telnet www.12345.com 80 的時候,那麼將無法看到PHP的資訊。

(8) 關閉註冊全域變數

在PHP中提交的變量,包括使用POST或GET提交的變量,都會自動註冊為全域變量,能夠直接訪問,

這是對伺服器非常不安全的,所以我們不能讓它註冊為全域變量,就把註冊全域變數選項關閉:

register_globals = Off
登入後複製

當然,如果這樣設定了,那麼取得對應變數的時候就要採用合理方式,例如取得GET提交的變數var,

那麼就要用$_GET['var']來進行獲取,這個php程式設計師要注意。

(9) 開啟magic_quotes_gpc來防止SQL注入

SQL注入是非常危險的問題,小則網站後台被入侵,重則整個伺服器淪陷,

所以一定要小心。 php.ini中有一個設定:

magic_quotes_gpc = Off
登入後複製

這個預設是關閉的,如果它打開後將自動把使用者提交對sql的查詢進行轉換,

例如把' 轉為\'等,這對防止sql注射有重大作用。所以我們推薦設定為:

magic_quotes_gpc = On
登入後複製

(10) 錯誤訊息控制

一般php在沒有連接到資料庫或其他情況下會有提示錯誤,一般錯誤訊息中會包含php腳本當

前的路径信息或者查询的SQL语句等信息,这类信息提供给黑客后,是不安全的,所以一般服务器建议禁止错误提示:

display_errors = Off
登入後複製

如果你却是是要显示错误信息,一定要设置显示错误的级别,比如只显示警告以上的信息:

error_reporting = E_WARNING & E_ERROR
登入後複製

当然,我还是建议关闭错误提示。

(11) 错误日志

建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因:

log_errors = On
登入後複製

同时也要设置错误日志存放的目录,建议根apache的日志存在一起:

error_log = D:/usr/local/apache2/logs/php_error.log
登入後複製

注意:给文件必须允许apache用户的和组具有写的权限。

MYSQL的降权运行

新建立一个用户比如mysqlstart

net user mysqlstart fuckmicrosoft /add
net localgroup users mysqlstart /del
登入後複製

不属于任何组

如果MYSQL装在d:\mysql ,那么,给 mysqlstart 完全控制 的权限

然后在系统服务中设置,MYSQL的服务属性,在登录属性当中,选择此用户 mysqlstart 然后输入密码,确定。

重新启动 MYSQL服务,然后MYSQL就运行在低权限下了。

如果是在windos平台下搭建的apache我们还需要注意一点,apache默认运行是system权限,

这很恐怖,这让人感觉很不爽.那我们就给apache降降权限吧。

net user apache fuckmicrosoft /add
net localgroup users apache /del
登入後複製

ok.我们建立了一个不属于任何组的用户apche。

我们打开计算机管理器,选服务,点apache服务的属性,我们选择log on,选择this account,我们填入上面所建立的账户和密码,

重启apache服务,ok,apache运行在低权限下了。

实际上我们还可以通过设置各个文件夹的权限,来让apache用户只能执行我们想让它能干的事情,给每一个目录建立一个单独能读写的用户。

这也是当前很多虚拟主机提供商的流行配置方法哦,不过这种方法用于防止这里就显的有点大材小用了。

【二、在PHP代码编写】

防止SQL Injection (sql注射)

SQL 注射应该是目前程序危害最大的了,包括最早从asp到php,基本上都是国内这两年流行的技术,基本原理就是通过对提交变量的不过滤形成注入点然后使恶意用户能够提交一些sql查询语句,导致重要数据被窃取、数据丢失或者损坏,或者被入侵到后台管理。

那么我们既然了解了基本的注射入侵的方式,那么我们如何去防范呢?这个就应该我们从代码去入手了。

我们知道Web上提交数据有两种方式,一种是get、一种是post,那么很多常见的sql注射就是从get方式入手的,而且注射的语句里面一定是包含一些sql语句的,因为没有sql语句,那么如何进行,sql语句有四大句:select 、update、delete、insert,那么我们如果在我们提交的数据中进行过滤是不是能够避免这些问题呢?

于是我们使用正则就构建如下函数:

PHP代码

<?php         
 function inject_check($sql_str)    
 {    
 return eregi(&#39;select|insert|update|delete|&#39;|    
 function verify_id($id=null)    
 {    
 if (!$id) { exit(&#39;没有提交参数!&#39;); } // 是否为空判断    
 elseif (inject_check($id)) { exit(&#39;提交的参数非法!&#39;); } // 注射判断    
 elseif (!is_numeric($id)) { exit(&#39;提交的参数非法!&#39;); } // 数字判断    
 $id = intval($id); // 整型化        
 return $id;    
 }    
 ?>
登入後複製

那么我们就能够进行校验了,于是我们上面的程序代码就变成了下面的:

<?php    
   if (inject_check($_GET[&#39;id&#39;]))    
   {    
   exit(&#39;你提交的数据非法,请检查后重新提交!&#39;);    
   }    
   else    
   {    
   $id = verify_id($_GET[&#39;id&#39;]); // 这里引用了我们的过滤函数,对$id进行过滤    
   echo &#39;提交的数据合法,请继续!&#39;;    
   }    
   ?>
登入後複製

好,问题到这里似乎都解决了,但是我们有没有考虑过post提交的数据,大批量的数据呢?

比如一些字符可能会对数据库造成危害,比如 ' _ ', ' %',这些字符都有特殊意义,那么我们如果进行控制呢?还有一点,就是当我们的php.ini里面的magic_quotes_gpc = off的时候,那么提交的不符合数据库规则的数据都是不会自动在前面加' '的,那么我们要控制这些问题,于是构建如下函数:

<?php       
  function str_check( $str )    
  {    
  if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否打开    
  {    
  $str = addslashes($str); // 进行过滤    
  }    
  $str = str_replace("_", "\_", $str); // 把 &#39;_&#39;过滤掉    
  $str = str_replace("%", "\%", $str); // 把&#39; % &#39;过滤掉    
        
  return $str;    
  }    
  ?>
登入後複製

最后,再考虑提交一些大批量数据的情况,比如发贴,或者写文章、新闻,我们需要一些函数来帮我们过滤和进行转换,再上面函数的基础上,我们构建如下函数:

<?php     
    function post_check($post)    
    {    
    if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开    
    {    
    $post = addslashes($post); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤    
    }    
    $post = str_replace("_", "\_", $post); // 把 &#39;_&#39;过滤掉    
    $post = str_replace("%", "\%", $post); // 把&#39; % &#39;过滤掉    
    $post = nl2br($post); // 回车转换    
    $post= htmlspecialchars($post); // html标记转换       
    return $post;    
    }    
?>
登入後複製

注:关于SQL注入,不得不说的是现在大多虚拟主机都会把magic_quotes_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理,所以此时对字符串值的SQL注入是不可行的,但要防止对数字值的SQL注入,如用intval()等函数进行处理。但如果你编写的是通用软件,则需要读取服务器的magic_quotes_gpc后进行相应处理。

更多PHP相关知识,请访问PHP中文网

以上是php防止sql注入的方法總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles