|
淺談php安全和防Sql注入,防止Xss攻擊,防盜鏈,防CSRF
前言:
首先,筆者不是web安全的專家,所以這不是web安全方面專家級文章,而是學習筆記、細心總結文章,里面有些是我們phper不易發現或者說不重視的東西。所以筆者寫下來方便以后查閱。在大公司肯定有專門的web安全測試員,安全方面不是phper考慮的范圍。但是作為一個phper對于安全知識是:“知道有這么一回事,編程時自然有所注意”。
目錄:
1、php一些安全配置
(1)關閉php提示錯誤功能
(2)關閉一些“壞功能”
(3)嚴格配置文件權限。
2、嚴格的數據驗證,你的用戶不全是“好”人
2.1為了確保程序的安全性,健壯性,數據驗證應該包括內容。
2.2程序員容易漏掉point或者說需要注意的事項
3、防注入
3.1簡單判斷是否有注入漏洞以及原理
3.2常見的mysql注入語句
(1)不用用戶名和密碼
(2)在不輸入密碼的情況下,利用某用戶
(3)猜解某用戶密碼
(4)插入數據時提權
(5)更新提權和插入提權同理
(6)惡意更新和刪除
(7)union、join等
(8)通配符號%、_
(9)還有很多猜測表信息的注入sql
33防注入的一些方法
2.3.1 php可用于防注入的一些函數和注意事項。
2.3.2防注入字符優先級。
2.3.3防注入代碼
(1)參數是數字直接用intval()函數
(2)對于非文本參數的過濾
(3)文本數據防注入代碼。
(4)當然還有其他與addslashes、mysql_escape_string結合的代碼。
4、防止xss攻擊
4.1Xss攻擊過程
4.2常見xss攻擊地方
4.3防XSS方法
5、CSRF
5.1簡單說明CSRF原理
5.2防范方法
6、防盜鏈
7、防拒CC攻擊
1、php一些安全配置
(1)關閉php提示錯誤功能
在php.ini 中把display_errors改成
復制代碼 代碼如下:display_errors = OFF
或在php文件前加入
復制代碼 代碼如下:error_reporting(0)
1)使用error_reporting(0);失敗的例子:
A文件代碼:
復制代碼 代碼如下:<?
error_reporting(0);
echo 555
echo 444;
?>
錯誤:
復制代碼 代碼如下:Parse error: parse error, expecting `','' or `';'' in E:/webphp/2.php on line 4
2)使用error_reporting(0);成功的例子:
a文件代碼:
復制代碼 代碼如下:
<?php
error_reporting(0);
include("b.php");
?>
b文件代碼:
復制代碼 代碼如下:
<?php
echo 555
echo 444;
?>
這是很多phper說用error_reporting(0)不起作用。第一個例子A.php里面有致命錯誤,導致不能執行,不能執行服務器則不知有這個功能,所以一樣報錯。
第二個例子中a.php成功執行,那么服務器知道有抑制錯誤功能,所以就算b.php有錯誤也抑制了。
ps:抑制不了mysql錯誤。
(2)關閉一些“壞功能”
1)關閉magic quotes功能
在php.ini 把magic_quotes_gpc = OFF
避免和addslashes等重復轉義
2)關閉register_globals = Off
在php.ini 把register_globals = OFF
在register_globals = ON的情況下
地址欄目:http://www.jb51.NET?bloger=benwin
復制代碼 代碼如下:
<?php
//$bloger = $_GET['bloger'] //因為register_globals = ON 所以這步不用了直接可以用$bloger
echo $bloger;
?>
這種情況下會導致一些未初始化的變量很容易被修改,這也許是致命的。所以把register_globals = OFF關掉
(3)嚴格配置文件權限。
為相應文件夾分配權限,比如包含上傳圖片的文件不能有執行權限,只能讀取
2、嚴格的數據驗證,你的用戶不全是“好”人。
記得筆者和一個朋友在討論數據驗證的時候,他說了一句話:你不要把你用戶個個都想得那么壞!但筆者想說的這個問題不該出現在我們開發情景中,我們要做的是嚴格驗證控制數據流,哪怕10000萬用戶中有一個是壞用戶也足以致命,再說好的用戶也有時在數據input框無意輸入中文的時,他已經不經意變“壞”了。
2.1為了確保程序的安全性,健壯性,數據驗證應該包括
(1) 關鍵數據是否存在。如刪除數據id是否存在
(2) 數據類型是否正確。如刪除數據id是否是整數
(3) 數據長度。如字段是char(10)類型則要strlen判斷數據長度
(4) 數據是否有危險字符
數據驗證有些人主張是把功能完成后再慢慢去寫安全驗證,也有些是邊開發邊寫驗證。筆者偏向后者,這兩種筆者都試過,然后發現后者寫的驗證相對健壯些,主要原因是剛開發時想到的安全問題比較齊全,等開發完功能再寫時有兩個問題,一個phper急于完成指標草草完事,二是確實漏掉某些point。
2.2程序員容易漏掉point或者說需要注意的事項:
(1) 進庫數據一定要安全驗證,筆者在廣州某家公司參與一個公司內部系統開發的時候,見過直接把$_POST數據傳給類函數classFunctionName($_POST),理由竟然是公司內部使用的,不用那么嚴格。暫且不說邏輯操作與數據操控耦合高低問題,連判斷都沒判斷的操作是致命的。安全驗證必須,沒任何理由推脫。
(2) 數據長度問題,如數據庫建表字段char(25),大多phper考慮到是否為空、數據類型是否正確,卻忽略字符長度,忽略還好更多是懶于再去判斷長度。(這個更多出現在新手當中,筆者曾經也有這樣的思想)
(3) 以為前端用js判斷驗證過了,后臺不需要判斷驗證。這也是致命,要知道偽造一個表單就幾分鐘的事,js判斷只是為了減少用戶提交次數從而提高用戶體驗、減少http請求減少服務器壓力,在安全情況下不能防“小人”,當然如果合法用戶在js驗證控制下是完美的,但作為phper我們不能只有js驗證而拋棄再一次安全驗證。
(4) 缺少對表單某些屬性比如select、checkbox、radio、button等的驗證,這些屬性在web頁面上開發者已經設置定其值和值域(白名單值),這些屬性值在js驗證方面一般不會驗證,因為合法用戶只有選擇權沒修改權,然后phper就在后端接受數據處理驗證數據的時候不會驗證這些數據,這是一個慣性思維,安全問題也就有了,小人一個偽表單。
(5) 表單相應元素name和數據表的字段名一致,如用戶表用戶名的字段是user_name,然后表單中的用戶名輸入框也是user_name,這和暴庫沒什么區別。
(6) 過濾危險字符方面如防注入下面會獨立講解。
3、防注入
3.1簡單判斷是否有注入漏洞以及原理。
網址:http://www.jb51.NET/benwin.php?id=1 運行正常,sql語句如:select * from phpben where id = 1
(1) 網址:http://www.jb51.NET/benwin.php?id=1' sql語句如:select * from phpben where id = 1' 然后運行異常 這能說明benwin.php文件沒有對id的值進行“'” 過濾和intval()整形轉換,當然想知道有沒有對其他字符如“%”,“/*”等都可以用類似的方法窮舉測試(很多測試軟件使用)
(2)網址:http://www.jb51.NET/benwin.php?id=1 and 1=1 則sql語句可能是 select * from phpben where id = 1 and 1=1,運行正常且結果和http://www.jb51.NET/benwin.php?id=1結果一樣,則說明benwin.php可能沒有對空格“ ”、和“and”過濾(這里是可能,所以要看下一點)
(3)網址:http://www.jb51.NET/benwin.php?id=1 and 1=2則sql語句可能是 select * from phpben where id = 1 and 1=2 如果運行結果異常說明sql語句中“and 1=2”起作用,所以能3個條件都滿足都則很確定的benwin.php存在注入漏洞。
ps:這里用get方法驗證,post也可以,只要把值按上面的輸入,可以一一驗證。
3.2常見的mysql注入語句。
(1)不用用戶名和密碼
復制代碼 代碼如下:
//正常語句
$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)在不輸入密碼的情況下,利用某用戶。
復制代碼 代碼如下:
//正常語句
$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'";
這是因為mysql中其中的一個注悉是“#”,上面語句中#已經把后面的內容給注悉掉,所以密碼可以不輸入或任意輸入。網上有些人介紹說用“/*”來注悉,筆者想提的是只有開始注悉沒結束注悉“*/”時,mysql會報錯,也不是說“/**/”不能注悉,而是這里很難添加上“*/”來結束注悉,還有“
主站蜘蛛池模板:
日本高清色www
|
日韩毛片免费视频一级特黄
|
久久综合综合久久
|
91国内在线国内在线播放
|
欧美一级性视频
|
综合久久久久久久综合网
|
国产精品久久久久毛片真精品
|
亚洲综合网在线
|
欧美一级在线全免费
|
国产日韩中文字幕
|
婷婷久久精品
|
思思九九热
|
国产精品系列在线观看
|
日韩美女拍拍免费视频网站
|
国产福利微拍精品一区二区
|
亚洲一区二区三区在线播放
|
精品日韩一区二区三区
|
国产成人福利美女观看视频
|
免费看污成人午夜网站
|
日本一区二区三区国产
|
麻豆国产|
国产麻豆精品视频
|
中文字幕精品一区二区日本
|
亚洲美女视频网址
|
成年香蕉大黄美女美女
|
91麻豆影视
|
97精品国产自在现线免费
|
色综久久天天综合绕视看
|
亚洲色四在线视频观看
|
131美女一区二区三区视频
|
久久激情五月
|
免费一区二区三区视频导航
|
激情影院a
|
成人女人a毛片在线看
|
九九九在线视频
|
久久婷婷综合中文字幕
|
久久国产精品久久久
|
九九色综合
|
法国性xxxxx极品
|
精品新一区二区三区四区
|
色网址在线观看
|