本文目錄一覽:
PHP如何注入SQL語句
SQL注入,如前人所說,最簡單是’,或者是在地址欄後如?page=2 這時加and 1=1,沒反應再加and 1=2,如果報錯,便可注入。你可以用SQL注入工具,黑客論壇上都有,什麼阿D,明小子,穿山甲等。防範措施是對傳遞參數進行轉換類型,如int。
php防止sql注入以及xss跨站腳本攻擊
1.post數據
封裝轉義函數 防sql注入 eag:addslashes($username);addslashes($password);
eag:防止sql注入函數封裝
function deepslashes($data){
#判斷$data的表現形式 並且需要處理空的情況
if(empty($data)){
return($data);
}
#高級簡寫 return is_array($data) ? array_map(‘deepslashes’,$data) : addslashes($data);
#初級寫法
if(is_array($data)){
#遞歸循環遍歷處理多維數組
foreach ($data as $v) {
return deepslashes($v);
}
}else{
#單一變數
return addslashes($data);
}
#初級寫法
}
2.get數據
指url 傳參數導致sql發生改變
解決方案
①強制轉換,使用函數intval 或者 數據類型 的關鍵字int
②隱式轉換,通過運算,只需要+0即可
3.xss跨站腳本攻擊
指惡意攻擊向web頁面插入html、js標籤導致頁面出現錯誤
解決方案
轉義標籤” ”即可,有以下php函數可解決
htmlspecialchars 函數 和 htmlentites函數
eag:
function deepslashes($data){
#判斷$data的表現形式 並且需要處理空的情況
if(empty($data)){
return($data);
}
return is_array($data) ? array_map(‘deepslashes’,$data) : htmlspecialchars ($data);
}
php如何防止sql注入
PHP防止sql注入是一個比較低級的問題了,這個問題其實在我大一上學期做第一個個人博客的時候就已經關注過了,不過簡單的說一下關於PHP防注入的方式吧。
使用PDO防注入。
這是最簡單直接的一種方式,當然低版本的PHP一般不支持PDO方式去操作,那麼就只能採用其它方式。
採用escape函數過濾非法字元。
escape可以將非法字元比如 斜杠等非法字元轉義,防止sql注入,這種方式簡單粗暴,但是不太建議這麼用。
自己手寫過濾函數,手寫一個php sql非法參數過濾函數來說還是比較簡單的,但是你的函數需要非常的健壯,不讓仍然有可能被非法黑客攻擊;你的Coding水平直接決定了你的函數的健壯性。
各種框架裡面其實都有對於非法字元過濾的支持,最簡單的比如ThinkPHP,你可以直接防止注入。
寫一個PHP擴展對於進入參數進行有選擇的過濾。 開發一個PHP擴展是對於一個PHP高級程序員必備的技能,將你需要的功能打包在PHP擴展裡面,就像黑詞過濾一樣進行檢查,是非常方便的。一般都是用在自己寫框架路由器轉發的時候,如果你用擴展實現框架的路由器轉發的話,可以順便將參數過濾加入到PHP擴展裡面,通過C去實現。
對於現在的防注入技術其實已經成熟了,對於一個站點該關心的不是防注入了,而是大規模高並發如何處理的問題,或者關於各種其他漏洞,比如現在世界上仍然有百分之80使用redis的站點存在redis漏洞,通過redis漏洞可以直接拿到機器的訪問許可權,一般來說都是直接給你種一個挖礦機器人來。
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 {} \;
原創文章,作者:JYJP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/133931.html