防止phpsql注入
網站的運行安全肯定是每個站長必須考慮的問題,大家知道,大多數黑客攻擊網站都是採用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 {} \;
2. php 關於thinkphp的防sql注入跟過濾問題
防止SQL注入
opensns
對於WEB應用來說,SQL注入攻擊無疑是首要防範的安全問題,系統底層對於數據安全方面本身進行了很多的處理和相應的防範機制,例如:
$User = M("User"); // 實例化User對象
$User->find($_GET["id"]);
即便用戶輸入了一些惡意的id參數,系統也會強制轉換成整型,避免惡意注入。這是因為,系統會對數據進行強制的數據類型檢測,並且對數據來源進行數據格式轉換。而且,對於字元串類型的數據,ThinkPHP都會進行escape_string處理(real_escape_string,mysql_escape_string)。
通常的安全隱患在於你的查詢條件使用了字元串參數,然後其中一些變數又依賴由客戶端的用戶輸入,要有效的防止SQL注入問題,我們建議:
查詢條件盡量使用數組方式,這是更為安全的方式;
如果不得已必須使用字元串查詢條件,使用預處理機制(3.1版本新增特性);
開啟數據欄位類型驗證,可以對數值數據類型做強制轉換;(3.1版本開始已經強制進行欄位類型驗證了)
使用自動驗證和自動完成機制進行針對應用的自定義過濾;
欄位類型檢查、自動驗證和自動完成機制我們在相關部分已經有詳細的描述。
查詢條件預處理
where方法使用字元串條件的時候,支持預處理(安全過濾),並支持兩種方式傳入預處理參數,例如:
$Model->where("id=%d and username='%s' and xx='%f'",array($id,$username,$xx))->select();
或者
$Model->where("id=%d and username='%s' and xx='%f'",$id,$username,$xx)->select();
模型的query和execute方法 同樣支持預處理機制,例如:
$model->query('select * from user where id=%d and status=%d',$id,$status);
或者
$model->query('select * from user where id=%d and status=%d',array($id,$status));
execute方法用法同query方法。
3. SQL參數化查詢--最有效可預防SQL注入攻擊的防禦方式
參數化查詢,作為預防SQL注入攻擊的有效手段,通過在SQL語句中使用參數來傳入值,避免了直接將用戶輸入插入到SQL語句中,從而保護資料庫免受惡意攻擊。廣泛應用於Access、SQL Server、MySQL、SQLite等資料庫。
在ASP環境中,參數化查詢主要通過Connection對象和Command對象實現。對於Access資料庫,使用問號作為參數標志,而SQL Server支持匿名和非匿名參數,但ASP中僅支持匿名方式。
ASP.NET環境下,參數化查詢同樣通過Connection對象和Command對象完成。當資料庫為SQL Server時,可以使用帶參數名的命名參數,格式為「@」字元加參數名。
PHP環境中,MySQL支持的參數格式為「?」加參數名,實現參數化查詢。
綜上所述,參數化查詢是一種有效防止SQL注入攻擊的方法,其在不同編程環境和資料庫系統中均有實現。通過使用參數化查詢,可以確保資料庫安全,避免敏感數據泄露和系統被惡意篡改。
4. php如何防止sql注入
PHP防止sql注入是一個比較低級的問題了,這個問題其實在我大一上學期做第一個個人博客的時候就已經關注過了,不過乎槐簡單的說一下關於PHP防注入的方式吧。
對於現在的防注入技術其實已經成熟虧備了,對於一個站點該關心的不是防注入了,而是大規模高並發如何處理的問題,或者關於各種其他漏洞,比如現在世界上仍然有百分之80使用redis的站點存在redis漏洞,通過redis漏洞可以直接拿到機器的訪問許可權,一般來說都是直接給你種一個挖礦機器人來。
5. 能夠有效應對sql注入攻擊的方法是
預編譯語句(Prepared Statements)是能夠有效應對SQL注入攻擊的方法。
詳細
1. 預編譯語句的工作原理
預編譯語句將SQL查詢分為兩個步驟。首先,資料庫預編譯SQL語句模板,然後,應用程序綁定參數到該模板。由於參數值是在預編譯後傳入的,因此,它們不會被解釋為SQL代碼,從而防止了SQL注入。
2. 使用預編譯語句的例子
以PHP和MySQL為例,假設我們要從資料庫中查詢某個用戶的信息:
傳統的、容易受到SQL注入攻擊的方法:
php
$username = $_GET['username']; // 假設用戶輸入的是 'admin' OR '1'='1'
$query = "SELECT FROM users WHERE username = '$username'";
使用預編譯語句的方法:
php
$stmt = $pdo->prepare('SELECT FROM users WHERE username = :username');
$stmt->execute(['username' => $_GET['username']]);
在上述例子中,即使攻擊者嘗試注入惡意的SQL代碼,它也只會被當作普通的參數值處理,不會被資料庫解釋為SQL指令。
3. 其他防禦措施
雖然預編譯語句是防禦SQL注入的有效手段,但還需要結合其他安全措施,如:
輸入驗證:確保用戶輸入的數據符合預期格式和長度。例如,如果期望的是一個電話號碼,那麼非數字字元就不應該被接受。
錯誤處理:不要向用戶顯示詳細的資料庫錯誤信息,因為這可能為攻擊者提供有關資料庫結構的有價值的信息。
最小許可權原則:為應用程序使用的資料庫賬號分配最小的必要許可權。例如,如果應用程序只需要從資料庫中讀取數據,那麼就不應該給它寫入許可權。
4. 培訓和意識
除了技術手段外,對開發人員進行關於SQL注入的教育和培訓也非常重要。開發人員需要了解SQL注入的基本原理、如何檢測潛在的注入點以及如何修復這些問題。此外,定期的安全審查和測試也有助於確保應用程序的安全性。
6. 留言板防灌水功能應該怎麼做怎麼防止sql注入用PHP編寫
防灌水:
對無意義帖判定,比如:字數太少,純數字,無意義的連續數字或字母。
發帖時間間隔和發帖量
系統設置一批關鍵詞匹配,發現有類似的先設為需審核 ,由後台手動操作。
防sql注入
先對提交數據中的危險字元過濾或編碼。比如:名稱或帖子標題,一定不能是html,直接進行htmlencode ,最後輸出到頁面上,也不會變成html,而是顯示原始字元。對需要使用html的內容部分,過濾script,style等標簽,或者直接用strip_tags 函數只保留必要的段落等排版標簽。
其次也可以考慮使用bbcode或markdown等對排版有限制的語法轉義
資料庫操作使用pdo參數編譯的模式,可以有效防止提交數據中的注入字元(會變成正常字元插入到資料庫中,這也可以防止誤判,因為很多IT類的技術帖需要在內容中有這些關鍵字)