php防止注入
網站的運行安全肯定是每個站長必須考慮的問題,大家知道,大多數黑客攻擊網站都是採用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注入
PHP防止sql注入是一個比較低級的問題了,這個問題其實在我大一上學期做第一個個人博客的時候就已經關注過了,不過乎槐簡單的說一下關於PHP防注入的方式吧。
對於現在的防注入技術其實已經成熟虧備了,對於一個站點該關心的不是防注入了,而是大規模高並發如何處理的問題,或者關於各種其他漏洞,比如現在世界上仍然有百分之80使用redis的站點存在redis漏洞,通過redis漏洞可以直接拿到機器的訪問許可權,一般來說都是直接給你種一個挖礦機器人來。
㈢ 求php防止被sql 注入攻擊的過濾用戶輸入內容的函數
functionclean($v){
//判斷magic_quotes_gpc是否為打開
if(!get_magic_quotes_gpc()){
//進行magic_quotes_gpc沒有打開的情況對提交數據的過濾
$v=addslashes($v);
}
//把'_'過濾掉
$v=str_replace("_","\_",$v);
//把'%'過濾掉
$v=str_replace("%","\%",$v);
//把'*'過濾掉
$v=str_replace("*","*",$v);
//回車轉換
$v=nl2br($v);
//html標記轉換
$v=htmlspecialchars($v);
return$v;
}
如果需要,還可以屏蔽一下危險字元,例如insert, update, delete等
//將update去掉
$v=str_replace("update","",$v);
最後,在拼裝sql語句時,用戶輸入的東西,全括在單引號內
㈣ 誰能給我這一個php防sql注入的函數啊,功能越強大越好
functioninject_check($Sql_Str){//自動過濾Sql的注入語句。
$check=preg_match('/select|insert|update|delete|'|\*|*|../|./|union|into|load_file|outfile/i',$Sql_Str);
if($check){
echo'<scriptlanguage="JavaScript">alert("系統警告: 請不要嘗試在參數中包含非法字元嘗試注入!");</script>';
exit();
}else{
return$Sql_Str;
}
}
我這個是自己寫的,通過正則判斷是否含有危險關鍵字,希望採納。
㈤ php防止sql注入示例分析和幾種常見攻擊正則
functioncustomError($errno,$errstr,$errfile,$errline)
{
echo"Errornumber:[$errno],erroronline$errlinein$errfile
";
die();
}
set_error_handler("customError",E_ERROR);
$getfilter="'|(and|or)\b.+?(>|<|=|in|like)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
$postfilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
$cookiefilter="\b(and|or)\b.{1,6}?(=|>|<|\bin\b|\blike\b)|\/\*.+?\*\/|<\s*script\b|\bEXEC\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\s+(TABLE|DATABASE)";
functionStopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq)
{
if(is_array($StrFiltValue))
{
$StrFiltValue=implode($StrFiltValue);
}
if(preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1&&!isset($_REQUEST['securityToken']))
{
slog("
操作IP:".$_SERVER["REMOTE_ADDR"]."
操作時間:".strftime("%Y-%m-%d%H:%M:%S")."
操作頁面:".$_SERVER["PHP_SELF"]."
提交方式:".$_SERVER["REQUEST_METHOD"]."
提交參數:".$StrFiltKey."
提交數據:".$StrFiltValue);
print"resultnotice:Illegaloperation!";
exit();
}
}
foreach($_GETas$key=>$value)
{
StopAttack($key,$value,$getfilter);
}
foreach($_POSTas$key=>$value)
{
StopAttack($key,$value,$postfilter);
}
foreach($_COOKIEas$key=>$value)
{
StopAttack($key,$value,$cookiefilter);
}
functionslog($logs)
{
$toppath="log.htm";
$Ts=fopen($toppath,"a+");
fputs($Ts,$logs." ");
fclose($Ts);
}
?>
㈥ php如何防止sql注入
防止SQL注入的關鍵在於避免直接將用戶的輸入插入到SQL查詢字元串中,因為這樣使得攻擊者能夠操縱查詢,從而進行注入攻擊。例如,如果用戶輸入的是 `'); DROP TABLE table;--`,那麼最終的SQL語句將變成 `DROP TABLE table;`,這將導致表被刪除。
要避免這種情況,需要採用准備語句和參數化查詢。這種方法將SQL語句和參數分開發送和解析,攻擊者無法利用注入來執行惡意SQL。以下是兩種實現方式:
首先,可以使用MySQLi擴展。
如果你使用的是非MySQL資料庫,例如PostgreSQL,可以通過使用`pg_prepare()`和`pg_execute()`方法實現類似功能。PDO(PHP Data Objects)則提供了更廣泛的兼容性。
在設置資料庫連接時,確保關閉准備模擬選項,以確保真正的SQL語句准備和參數分離。例如,如下代碼展示了如何正確設置連接:
設置錯誤模式為推薦的,以便在遇到問題時提供有用的錯誤信息。
重點在於設置`PDO`屬性為不模擬准備語句,而是真正准備語句。這樣,PHP不會自行解析SQL,而是將SQL語句發送給MySQL伺服器,防止了攻擊者注入惡意SQL。
值得注意的是,某些老版本的PHP(<5.3.6)會忽略DSN中的字元集參數。
通過參數化查詢,SQL語句與參數分離。這樣,參數和編譯過的語句結合,而不是與SQL字元串結合,避免了混淆參數和語句的攻擊機制。例如,如果`$name`變數是 `'Sarah'; DELETE FROM employees`,實際執行的SQL語句將為 `'Sarah'; DELETE FROM employees'`,而不是刪除整個表。這保證了數據安全。
另一個優勢是,對於重復執行的相同查詢,SQL語句只需編譯一次,可以提高執行效率。
對於需要執行動態查詢的場景,最好採用白名單限制輸入。准備語句僅用於准備參數,查詢結構不能改變。