色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

PHP開發(fā)中常見的安全問題詳解和解決方法(如Sql注入、CSRF、Xss、CC等)

淺談php安全和防Sql注入,防止Xss攻擊,防盜鏈,防CSRF

前言:

首先,筆者不是web安全的專家,所以這不是web安全方面專家級文章,而是學(xué)習(xí)筆記、細(xì)心總結(jié)文章,里面有些是我們phper不易發(fā)現(xiàn)或者說不重視的東西。所以筆者寫下來方便以后查閱。在大公司肯定有專門的web安全測試員,安全方面不是phper考慮的范圍。但是作為一個phper對于安全知識是:“知道有這么一回事,編程時自然有所注意”。

目錄:

1、php一些安全配置
(1)關(guān)閉php提示錯誤功能
(2)關(guān)閉一些“壞功能”
(3)嚴(yán)格配置文件權(quán)限。
2、嚴(yán)格的數(shù)據(jù)驗(yàn)證,你的用戶不全是“好”人
2.1為了確保程序的安全性,健壯性,數(shù)據(jù)驗(yàn)證應(yīng)該包括內(nèi)容。
2.2程序員容易漏掉point或者說需要注意的事項
3、防注入
   3.1簡單判斷是否有注入漏洞以及原理
   3.2常見的mysql注入語句
       (1)不用用戶名和密碼
       (2)在不輸入密碼的情況下,利用某用戶
       (3)猜解某用戶密碼
(4)插入數(shù)據(jù)時提權(quán)
(5)更新提權(quán)和插入提權(quán)同理
(6)惡意更新和刪除
(7)union、join等
(8)通配符號%、_
(9)還有很多猜測表信息的注入sql
   33防注入的一些方法
       2.3.1 php可用于防注入的一些函數(shù)和注意事項。
       2.3.2防注入字符優(yōu)先級。
2.3.3防注入代碼
    (1)參數(shù)是數(shù)字直接用intval()函數(shù)
    (2)對于非文本參數(shù)的過濾
(3)文本數(shù)據(jù)防注入代碼。
(4)當(dāng)然還有其他與addslashes、mysql_escape_string結(jié)合的代碼。
4、防止xss攻擊
4.1Xss攻擊過程
4.2常見xss攻擊地方
4.3防XSS方法
5、CSRF
5.1簡單說明CSRF原理
5.2防范方法
6、防盜鏈
7、防拒CC攻擊

1、php一些安全配置


(1)關(guān)閉php提示錯誤功能

php.ini 中把display_errors改成
復(fù)制代碼 代碼如下:display_errors = OFF
或在php文件前加入
復(fù)制代碼 代碼如下:error_reporting(0)

1)使用error_reporting(0);失敗的例子:

A文件代碼:
復(fù)制代碼 代碼如下:<? 
error_reporting(0); 
echo 555 
echo 444; 
?>
錯誤:
復(fù)制代碼 代碼如下:Parse error: parse error, expecting `','' or `';'' in E:/webphp/2.php on line 4
2)使用error_reporting(0);成功的例子:
a文件代碼:
復(fù)制代碼 代碼如下:
<?php 
error_reporting(0); 
include("b.php"); 
?>
b文件代碼:
復(fù)制代碼 代碼如下:
<?php 
echo 555 
echo 444; 
?>
這是很多phper說用error_reporting(0)不起作用。第一個例子A.php里面有致命錯誤,導(dǎo)致不能執(zhí)行,不能執(zhí)行服務(wù)器則不知有這個功能,所以一樣報錯。

第二個例子中a.php成功執(zhí)行,那么服務(wù)器知道有抑制錯誤功能,所以就算b.php有錯誤也抑制了。

ps:抑制不了mysql錯誤。

(2)關(guān)閉一些“壞功能”

1)關(guān)閉magic quotes功能

php.ini 把magic_quotes_gpc = OFF
避免和addslashes等重復(fù)轉(zhuǎn)義

2)關(guān)閉register_globals = Off

php.ini 把register_globals = OFF

在register_globals = ON的情況下

地址欄目:http://www.jb51.NET?bloger=benwin
復(fù)制代碼 代碼如下:
<?php 
//$bloger = $_GET['bloger']   //因?yàn)閞egister_globals = ON 所以這步不用了直接可以用$bloger
  echo $bloger; 
?>

這種情況下會導(dǎo)致一些未初始化的變量很容易被修改,這也許是致命的。所以把register_globals = OFF關(guān)掉

(3)嚴(yán)格配置文件權(quán)限。

為相應(yīng)文件夾分配權(quán)限,比如包含上傳圖片的文件不能有執(zhí)行權(quán)限,只能讀取

2、嚴(yán)格的數(shù)據(jù)驗(yàn)證,你的用戶不全是“好”人。

記得筆者和一個朋友在討論數(shù)據(jù)驗(yàn)證的時候,他說了一句話:你不要把你用戶個個都想得那么壞!但筆者想說的這個問題不該出現(xiàn)在我們開發(fā)情景中,我們要做的是嚴(yán)格驗(yàn)證控制數(shù)據(jù)流,哪怕10000萬用戶中有一個是壞用戶也足以致命,再說好的用戶也有時在數(shù)據(jù)input框無意輸入中文的時,他已經(jīng)不經(jīng)意變“壞”了。

2.1為了確保程序的安全性,健壯性,數(shù)據(jù)驗(yàn)證應(yīng)該包括

(1)     關(guān)鍵數(shù)據(jù)是否存在。如刪除數(shù)據(jù)id是否存在
(2)     數(shù)據(jù)類型是否正確。如刪除數(shù)據(jù)id是否是整數(shù)
(3)     數(shù)據(jù)長度。如字段是char(10)類型則要strlen判斷數(shù)據(jù)長度
(4)     數(shù)據(jù)是否有危險字符

數(shù)據(jù)驗(yàn)證有些人主張是把功能完成后再慢慢去寫安全驗(yàn)證,也有些是邊開發(fā)邊寫驗(yàn)證。筆者偏向后者,這兩種筆者都試過,然后發(fā)現(xiàn)后者寫的驗(yàn)證相對健壯些,主要原因是剛開發(fā)時想到的安全問題比較齊全,等開發(fā)完功能再寫時有兩個問題,一個phper急于完成指標(biāo)草草完事,二是確實(shí)漏掉某些point。
2.2程序員容易漏掉point或者說需要注意的事項:

(1)     進(jìn)庫數(shù)據(jù)一定要安全驗(yàn)證,筆者在廣州某家公司參與一個公司內(nèi)部系統(tǒng)開發(fā)的時候,見過直接把$_POST數(shù)據(jù)傳給類函數(shù)classFunctionName($_POST),理由竟然是公司內(nèi)部使用的,不用那么嚴(yán)格。暫且不說邏輯操作與數(shù)據(jù)操控耦合高低問題,連判斷都沒判斷的操作是致命的。安全驗(yàn)證必須,沒任何理由推脫。
(2)     數(shù)據(jù)長度問題,如數(shù)據(jù)庫建表字段char(25),大多phper考慮到是否為空、數(shù)據(jù)類型是否正確,卻忽略字符長度,忽略還好更多是懶于再去判斷長度。(這個更多出現(xiàn)在新手當(dāng)中,筆者曾經(jīng)也有這樣的思想)
(3)     以為前端用js判斷驗(yàn)證過了,后臺不需要判斷驗(yàn)證。這也是致命,要知道偽造一個表單就幾分鐘的事,js判斷只是為了減少用戶提交次數(shù)從而提高用戶體驗(yàn)、減少http請求減少服務(wù)器壓力,在安全情況下不能防“小人”,當(dāng)然如果合法用戶在js驗(yàn)證控制下是完美的,但作為phper我們不能只有js驗(yàn)證而拋棄再一次安全驗(yàn)證。
(4)     缺少對表單某些屬性比如select、checkbox、radio、button等的驗(yàn)證,這些屬性在web頁面上開發(fā)者已經(jīng)設(shè)置定其值和值域(白名單值),這些屬性值在js驗(yàn)證方面一般不會驗(yàn)證,因?yàn)楹戏ㄓ脩糁挥羞x擇權(quán)沒修改權(quán),然后phper就在后端接受數(shù)據(jù)處理驗(yàn)證數(shù)據(jù)的時候不會驗(yàn)證這些數(shù)據(jù),這是一個慣性思維,安全問題也就有了,小人一個偽表單。
(5)     表單相應(yīng)元素name和數(shù)據(jù)表的字段名一致,如用戶表用戶名的字段是user_name,然后表單中的用戶名輸入框也是user_name,這和暴庫沒什么區(qū)別。
(6)     過濾危險字符方面如防注入下面會獨(dú)立講解。

3、防注入

3.1簡單判斷是否有注入漏洞以及原理。

網(wǎng)址:http://www.jb51.NET/benwin.php?id=1 運(yùn)行正常,sql語句如:select  *  from phpben where id = 1

(1) 網(wǎng)址:http://www.jb51.NET/benwin.php?id=1'   sql語句如:select  *  from phpben where id = 1'  然后運(yùn)行異常 這能說明benwin.php文件沒有對id的值進(jìn)行“'” 過濾和intval()整形轉(zhuǎn)換,當(dāng)然想知道有沒有對其他字符如“%”,“/*”等都可以用類似的方法窮舉測試(很多測試軟件使用)
(2)網(wǎng)址:http://www.jb51.NET/benwin.php?id=1 and 1=1  則sql語句可能是 select  *  from phpben where id = 1 and 1=1,運(yùn)行正常且結(jié)果和http://www.jb51.NET/benwin.php?id=1結(jié)果一樣,則說明benwin.php可能沒有對空格“ ”、和“and”過濾(這里是可能,所以要看下一點(diǎn))
(3)網(wǎng)址:http://www.jb51.NET/benwin.php?id=1 and 1=2則sql語句可能是 select  *  from phpben where id = 1 and 1=2 如果運(yùn)行結(jié)果異常說明sql語句中“and 1=2”起作用,所以能3個條件都滿足都則很確定的benwin.php存在注入漏洞。

ps:這里用get方法驗(yàn)證,post也可以,只要把值按上面的輸入,可以一一驗(yàn)證。

3.2常見的mysql注入語句。

(1)不用用戶名和密碼
復(fù)制代碼 代碼如下:
//正常語句 
$sql ="select * from phpben where user_name='admin' and pwd ='123'"; 
//在用戶名框輸入'or'='or'或 'or 1='1 然后sql如下 
$sql ="select * from phpben where user_name=' 'or'='or'' and pwd ='' "; 
$sql ="select * from phpben where user_name=' 'or 1='1' and pwd ='' ";
這樣不用輸入密碼。話說筆者見到登錄框都有嘗試的沖動。

(2)在不輸入密碼的情況下,利用某用戶。
復(fù)制代碼 代碼如下:
//正常語句 
$sql ="select * from phpben where user_name='$username' and pwd ='$pwd'"; 
//利用的用戶名是benwin 則用戶名框輸入benwin'#  密碼有無都可,則$sql變成 
$sql ="select * from phpben where user_name=' benwin'#' and pwd ='$pwd'";
這是因?yàn)閙ysql中其中的一個注悉是“#”,上面語句中#已經(jīng)把后面的內(nèi)容給注悉掉,所以密碼可以不輸入或任意輸入。網(wǎng)上有些人介紹說用“/*”來注悉,筆者想提的是只有開始注悉沒結(jié)束注悉“*/”時,mysql會報錯,也不是說“/**/”不能注悉,而是這里很難添加上“*/”來結(jié)束注悉,還有“

主站蜘蛛池模板: 长春市| 高雄县| 都匀市| 柘城县| 马鞍山市| 肥西县| 玉树县| 峡江县| 南木林县| 隆林| 奉节县| 通许县| 济南市| 永丰县| 平安县| 子长县| 页游| 湖南省| 台山市| 泰州市| 马公市| 乐清市| 且末县| 平潭县| 农安县| 杨浦区| 大渡口区| 新兴县| 大港区| 瓦房店市| 商洛市| 高台县| 泰来县| 文昌市| 都昌县| 四会市| 石城县| 和顺县| 西安市| 东阳市| 平南县|