① php網站怎麼sql注入有沒有破解防禦的方法
網站的運行安全肯定是每個站長必須考慮的問題,大家知道,大多數黑客攻擊網站都是採用sql注入,這就是我們常說的為什麼最原始的靜態的網站反而是最安全的。 今天我們講講PHP注入的安全規范,防止自己的網站被sql注入。
如今主流的網站開發語言還是php,那我們就從php網站如何防止sql注入開始說起:
Php注入的安全防範通過上面的過程,我們可以了解到php注入的原理和手法,當然我們也同樣可以制定出相應該的防範方法:
首先是對伺服器的安全設置,這里主要是php+mysql的安全設置和linux主機的安全設置。對php+mysql注射的防範,首先將magic_quotes_gpc設置為On,display_errors設置為Off,如果id型,我們利用intval()將其轉換成整數類型,如代碼:
$id=intval($id);
mysql_query=」select *from example where articieid=』$id』」;或者這樣寫:mysql_query(」SELECT * FROM article WHERE articleid=」.intval($id).」")
如果是字元型就用addslashes()過濾一下,然後再過濾」%」和」_」如:
$search=addslashes($search);
$search=str_replace(「_」,」\_」,$search);
$search=str_replace(「%」,」\%」,$search);
當然也可以加php通用防注入代碼:
/*************************
PHP通用防注入安全代碼
說明:
判斷傳遞的變數中是否含有非法字元
如$_POST、$_GET
功能:
防注入
**************************/
//要過濾的非法字元
$ArrFiltrate=array(」『」,」;」,」union」);
//出錯後要跳轉的url,不填則默認前一頁
$StrGoUrl=」";
//是否存在數組中的值
function FunStringExist($StrFiltrate,$ArrFiltrate){
foreach ($ArrFiltrate as $key=>$value){
if (eregi($value,$StrFiltrate)){
return true;
}
}
return false;
}
//合並$_POST 和 $_GET
if(function_exists(array_merge)){
$ArrPostAndGet=array_merge($HTTP_POST_VARS,$HTTP_GET_VARS);
}else{
foreach($HTTP_POST_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
foreach($HTTP_GET_VARS as $key=>$value){
$ArrPostAndGet[]=$value;
}
}
//驗證開始
foreach($ArrPostAndGet as $key=>$value){
if (FunStringExist($value,$ArrFiltrate)){
echo 「alert(/」Neeao提示,非法字元/」);」;
if (empty($StrGoUrl)){
echo 「history.go(-1);」;
}else{
echo 「window.location=/」".$StrGoUrl.」/」;」;
}
exit;
}
}
?>
/*************************
保存為checkpostandget.php
然後在每個php文件前加include(「checkpostandget.php「);即可
**************************/
另外將管理員用戶名和密碼都採取md5加密,這樣就能有效地防止了php的注入。
還有伺服器和mysql也要加強一些安全防範。
對於linux伺服器的安全設置:
加密口令,使用「/usr/sbin/authconfig」工具打開密碼的shadow功能,對password進行加密。
禁止訪問重要文件,進入linux命令界面,在提示符下輸入:
#chmod 600 /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.so debug
Auth required /lib/security/pam_whell.so group=wheel
刪除所有的特殊帳戶
#userdel lp等等 刪除用戶
#groupdel lp等等 刪除組
禁止不使用的suid/sgid程序
#find / -type f \(-perm -04000 - o –perm -02000 \) \-execls –lg {} \;
② php中防止SQL注入,該如何解決
防sql注入的一個簡單方法就是使用框架,一般成熟框架中會集成各種安全措施。
當然也可以自己處理,如果用戶的輸入能直接插入到SQL語句中,那麼這個應用就易收到SQL注入的攻擊。我認為最重要的一點,就是要對數據類型進行檢查和轉義。
php.ini
------------
display_errors 選項,應該設為display_errors = off。這樣 php 腳本出錯之後,不會在 web 頁面輸出錯誤,以免讓攻擊者分析出有作的信息。
打開magic_quotes_gpc來防止SQL注入,magic_quotes_gpc= Off,這個默認是關閉的,如果它打開後將自動把用戶提交對sql的查詢進行轉換,比如把 ' 轉為 '等,對於防止sql注射有重大作用。如果magic_quotes_gpc=Off,則使用addslashes()函數。
mysql 函數
---------------
調用mysql_query 等mysql 函數時,前面應該加上 @,即 @mysql_query(...),這樣 mysql 錯誤不會被輸出。同理以免讓攻擊者分析出有用的信息。另外,有些程序員在做開發時,當mysql_query出錯時,習慣輸出錯誤以及sql 語句。
mysql_real_escape_string -- 轉義 SQL 語句中使用的字元串中的特殊字元,並考慮到連接的當前字元集。
Sql語句
------------
對提交的 sql 語句,進行轉義和類型檢查。如果請求是數值型,那麼調用is_numeric() 判斷是否為數值。如果不是,則返回程序指定的默認值。簡單起見,對於文本串,我將用戶輸入的所有危險字元(包括HTML代碼),全部轉義。由於php 函數addslashes()存在漏洞,我用str_replace()直接替換。get_magic_quotes_gpc()函數是php 的函數,用來判斷magic_quotes_gpc 選項是否打開。
其它
---------
使用預處理語句和參數化查詢(PDO或mysqli)。預處理語句和參數分別發送到資料庫伺服器進行解析,參數將會被當作普通字元處理。這種方式使得攻擊者無法注入惡意的SQL。
③ 網站如何防止sql注入攻擊的解決辦法
首先我們來了解下什麼是SQL注入,SQL注入簡單來講就是將一些非法參數插入到網站資料庫中去,執行一些sql命令,比如查詢資料庫的賬號密碼,資料庫的版本,資料庫伺服器的IP等等的一些操作,sql注入是目前網站漏洞中危害最大的一個漏洞,受攻擊的網站佔大多數都是sql注入攻擊。
sql注入攻擊用英語來講Structured Query Language,在網站的編程語言當中是一種比較另類的網站開發語言,我們網站安全行業通常來講sql是用來資料庫查詢的一種網站開發語言,同時也是一種腳本文件的一個文件名,通俗來講sql就是用來對網站的資料庫進行查詢,以及增加,寫入,更新資料庫的一個sql資料庫操作。
關於資料庫我們分為2種資料庫,一種是關系資料庫,非關系資料庫,那麼目前網站使用的都是關系資料庫,關系資料庫分為sql資料庫,microsoft sql server資料庫,ACC資料庫,mysql資料庫,oracle資料庫,DB2資料庫,postgresql資料庫等等的關系資料庫,非關系資料庫分為nosql資料庫,可以存儲很大數據,針對於一些並發較高,存儲較多,雲計算的場景,頻繁讀取寫入的資料庫,像memcachedb,redis,mongodb等等非關系資料庫。
那麼什麼是sql注入呢? 簡單來講就是對網站強行進行插入數據,執行sql惡意語句對網站進行攻擊,對網站進行sql注入嘗試,可以獲取一些私密的信息,像資料庫的版本,管理員的賬號密碼等等。
關於如何防止sql注入攻擊,我們從以下幾點開始入手
首先我們可以了解到sql注入攻擊都是通過拼接的方式,把一些惡意的參數拼接到一起,然後在網站的前端中插入,並執行到伺服器後端到資料庫中去,通常我們在寫PHP網站代碼的時候會將get ID這個參數值獲取到後直接拼接到後端伺服器中去,查詢資料庫,但是如果拼接了一些惡意的非法參數,那麼久可以當做sql語句來執行,如果防止sql注入呢?
為了防止網站被sql注入攻擊,我們應該從一開始寫代碼的時候就應該過濾一些sql注入的非法參數,將查詢的一些sql語句,以及用戶輸入的參數值都以字元串的方式來處理,不論用戶輸入的什麼東西,在sql查詢的時候只是一段字元串,這樣構造的任何惡意參數都會以字元串的方式去查詢資料庫,一直惡意的sql注入攻擊就不會被執行,sql注入語句也就沒有效果了,再一個就是網站里的任何一個可以寫入的地方盡可能的嚴格過濾與限制,漏下一個可以輸入的地方網站就會被攻擊,網站就會被黑,所有做的網站安全就會沒有效果,包括一些get,post,cookie方式的提交都是不可信的,像數據表裡referer user-agent等欄位都是可以偽造,寫入sql注入語句的,像前端時間爆發的ecshop漏洞利用的就是user.php,偽造referer參數進行了sql注入,執行了遠程代碼。
再一個防止sql注入的方法就是開啟PHP的魔術配置,開啟安全配置模式,將safe_mode開啟on.以及關閉全局變數模式,register_globals參數設置為on,magic_quotes_gpc參數開啟,防止sql注入.如果對網站防止sql注入不懂的話,也可以找專業的網站安全公司來做安全,防止sql注入。