說到安全,做網站的都知道,如果你的網站不安全,當被黑的時候會給公司帶來巨大的損失,給用戶帶來不可靠的感受,流失用戶。而且越是有名氣的公司,越容易被黑。
比如下面的秘密后臺被黑。

再有索尼play station服務被黑等等。
是什么原因導致的呢?
**我們輕易相信了用戶提交的數據。**
雖然,我們嘴上說,世界上好人總比壞人多,我們小網站,黑客看不上。不用做什么安全防范。但是心里明白:**永遠不要相信用戶輸入**。
那么,我們如何增強網站安全性防護呢?
我們還是先了解一下web安全攻擊的方式和防范的手段。
web應用安全分為兩大塊,代碼安全性和服務器安全防范
# 代碼安全性
## js XSS Cross Site Script 跨站腳本攻擊
### 原理
利用存入的 未做特殊的html標簽被網站顯示時當成網頁自身腳本執行了的特性來執行黑客的非法代碼。
最新的ThinkPHP里的I函數默認用htmlspecialchars轉義了特殊標簽。
我們看一個簡單的例子:


發布時 我動態當type 為0 的時候,就不過濾,為1的時候過濾。
因此,我以同樣的內容不同類型發布兩篇文章時。
存入數據庫的內容字符不一樣:

過濾過的正常顯示:

未過濾的就執行script標簽了:

高級點的黑客,xss 就不是給你惡作劇那么簡單了。比如盜號:



上面的盜號過程我說明一下:黑客活躍于沒有安全過濾的a網站,發了一篇釣魚文章。寫了一段js標簽,將a網站上查看該帖時用戶的的cookie信息傳送到b.com也就是黑客自己的服務器網站上。然后黑客只要在a.com上用js設置cookie為非法收集到的某個c用戶的cookie之后,刷新。登錄身份就會變為c用戶。如果網站安全性差一點,假c用戶就會可能被操作現金、積分交易,惡意發帖再攻擊其他人等。
### 防止XSS攻擊的方
1.httponly
`session.cookie_httponly = On`
黑客不能盜取cookie了
但是還能破壞我們的網站:
~~~
<script>location=“http://b.com”; </script>
~~~
2.strip_tags 過濾HTML標簽

3.htmlentities轉義引號,第二個參數要設置為`ENT_QUOTES`

4.將反斜杠轉義:`str_replace(‘\\’,‘\’)`
呵呵, 某些情況下,黑客還能執行JS代碼
~~~
<a href="javascript:alert(1)"></a>
<div style="width:expression(alert(/xss/));"></div>
~~~
5.替換script,expression
`str_ireplace(array(‘script’,’ expression’),array(‘script’,’ expression’),str);`
注意:是替換,不是刪除。

6.在登錄程序處,強制重置session_id ?:session_regenerate_id(true)?
PHP默認的session_id 始終為瀏覽器的PHPSESSID的cookie。 即使服務器端SESSION已經過期也一樣。
用戶的session_id 可能是百年不變。
7.最全的過濾方法
~~~
function filter($input){
$input = strip_tags(trim($input));
$input = htmlentities($input, ENT_QUOTES, 'UTF-8');
$input = str_ireplace(array('\\', 'script', 'expression'),
array('\', 'scrip t ', 'expressio n'),
$input
);
return $input;
}
~~~
8.使用markdown或UBB編輯器
##sql注入
### 方法

利用聯合查詢 ?

查詢mysql版本: 查詢當前連接的數據庫
`SELECT title,content FROM `article` WHERE `id`=‘-1’ union select database(),2 -- ’`
查詢數據庫結構:
`SELECT `title`,`content` FROM `article` WHERE `id`=‘-1’ union1, select (SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,‘ [ ’,table_schema,‘ ] >’,table_name,‘ > ’,column_name))))x) --’`
查詢用戶名密碼:
`SELECT title,content FROM `article` WHERE `id`=‘-1’ union select username,password from user-- ’`
萬能登錄密碼:
`SELECT * FROM `user` WHERE `username`=‘admin’ -- ’ AND `password`=‘xxxx’`
更多攻擊方法: http://websec.ca/kb/sql_injection
### 防止方法
1) ?數字類型也要用單引號括起?
2) ?數字類型的值可以用?intval函數轉換? ?
3) ?使用過濾函數?
?用mysql_real_escape_string 不用 mysql_escape_string?
使用PDO時用:PDO::quote??或者?PDO::prepare?
3) 設置好mysql用戶權限,只允許操作指定的數據庫
4) 表名加前綴,不要容易被猜出。
5) 用戶密碼不要用簡單的md5加密。多種算法hash256,DES、md5 再加鹽值 6) 變量在sql語句拼接是過濾。
`$sql = “SELECT * FROM `user` WHERE `id`=‘“.intval($id).”’”`
代碼發布系統強制檢查SQL語句的寫法
7) 開發環境安裝php-taint模塊自動檢測安全問題
**PHP_Taint** 和**SocketLog** 結合,?在開發時就能發現安全問題。有效的防止開發人員的粗心。

## iframe csrf 跨站請求偽造
### 原理
強制用戶進行某操作?
`<imgsrc=“/loginout.php”/>?`
涉及用戶權限的操縱最好用POST

自動提交表單的代碼:

### 防范方法
1,判斷來源,$_SERVER[‘HTTP_REFERER’]?
2,驗證碼?
顯示表單時,顯示驗證碼圖片,并將驗證碼的值存到session。
提交表單后,程序判斷用戶輸入的驗證是否等于session的驗證碼值。?
3,令牌驗證。??
原理和驗證碼類似。
顯示表單時,生成一個隱藏域,值為隨機字符串。并將值存到session。?
提交表單后,程序判斷提交的隱藏域值是否等于session中的值。? ?
以上方式,能防止黑客刷真粉絲,?但是防不了刷僵尸粉。

# 服務器安全防范
## 上傳文件的安全
黑客可以上傳webshell修改網站程序文件,然后放置木馬。?
### 漏洞原因:?
1,沒有對上傳文件的格式進行嚴格判斷。
2,運行文件都漏洞,如果nginx和IIS7都出現過畸形解析的漏洞。?
查找漏洞:? 用find命令?查找最近被修改的文件,?再查看網站日志中文件修改時間時用 戶再進行什么操作。?
`find?./?-mtime?0:?查詢最近24小時修改的文件`?
### 預防方法:???
程序文件的設置為只讀。??
上傳文件和程序文件分離。(配置單獨的二級域名訪問,并不能執行PHP)
執行命令的安全
## include文件的安全
`include './class/'.$_GET['file']; ->?../../../../etc/passwd? ?`
會泄露服務器賬戶信息。
防御方法:??
1,?include'./class/'.?basename($_GET['file'].'.Class.php');?
2, PHP?配置?open_basedir?
## 可執行命令的安全
exec, shell_exec, system。 執行的命令如果有用戶輸入的命令,
用escapeshellcmd函數防止用戶輸入分號進行閉合命令。 用escapeshellarg函數防止用戶閉合命令的參數。
配置 safe_mode_exec_dir ,讓php只能執行指定目錄下的命令程序?
- 序
- 前言
- 內容簡介
- 目錄
- 基礎知識
- 起步
- 控制器
- 模型
- 模板
- 命名空間
- 進階知識
- 路由
- 配置
- 緩存
- 權限
- 擴展
- 國際化
- 安全
- 單元測試
- 拿來主義
- 調試方法
- 調試的步驟
- 調試工具
- 顯示trace信息
- 開啟調試和關閉調試的區別
- netbeans+xdebug
- Socketlog
- PHP常見錯誤
- 小黃鴨調試法,每個程序員都要知道的
- 應用場景
- 第三方登錄
- 圖片處理
- 博客
- SAE
- REST實踐
- Cli
- ajax分頁
- barcode條形碼
- excel
- 發郵件
- 漢字轉全拼和首字母,支持帶聲調
- 中文分詞
- 瀏覽器useragent解析
- freelog項目實戰
- 需求分析
- 數據庫設計
- 編碼實踐
- 前端實現
- rest接口
- 文章發布
- 文件上傳
- 視頻播放
- 音樂播放
- 圖片幻燈片展示
- 注冊和登錄
- 個人資料更新
- 第三方登錄的使用
- 后臺
- 微信的開發
- 首頁及個人主頁
- 列表
- 歸檔
- 搜索
- 分頁
- 總結經驗
- 自我提升
- 進行小項目的鍛煉
- 對現有輪子的重構和移植
- 寫技術博客
- 制作視頻教程
- 學習PHP的知識和新特性
- 和同行直接溝通、交流
- 學好英語,走向國際
- 如何參與
- 瀏覽官網和極思維還有看云
- 回答ThinkPHP新手的問題
- 嘗試發現ThinkPHP的bug,告訴官方人員或者push request
- 開發能提高效率的ThinkPHP工具
- 嘗試翻譯官方文檔
- 幫新手入門
- 創造基于ThinkPHP的產品,進行連帶推廣
- 展望未來
- OneThink
- ThinkPHP4
- 附錄