常見攻擊類型
1.sql注入:
攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的字符串,欺騙服務器執行惡意的SQL命令。
防范方法:
- 1.檢查變量數據類型和格式
- 2.過濾特殊符號
- 3.綁定變量,使用預處理語句
2.xss攻擊
XSS其實就是Html的注入問題,攻擊者的輸入沒有經過嚴格的控制進入了數據庫,最終顯示給來訪的用戶,導致可以在來訪用戶的瀏覽器里以瀏覽用戶的身份執行Html代碼,
數據流程如下:攻擊者的Html輸入—>web程序—>進入數據庫—>web程序—>用戶瀏覽器。
防范方法:使用htmlspecialchars函數將特殊字符轉換成HTML編碼,過濾輸出的變量
3.csrf攻擊:
CSRF 顧名思義,是偽造請求,冒充用戶在站內的正常操作。我們知道,絕大多數網站是通過 cookie 等方式辨識用戶身份(包括使用服務器端 Session 的網站,因為 Session ID 也是大多保存在 cookie 里面的),再予以授權的。所以要偽造用戶的正常操作,最好的方法是通過 XSS 或鏈接欺騙等途徑,讓用戶在本機(即擁有身份 cookie 的瀏覽器端)發起用戶所不知道的請求。
要完成一次CSRF攻擊,受害者必須依次完成兩個步驟:
- 1.登錄受信任網站A,並在本地生成Cookie。
- 2.在不登出A的情況下,訪問危險網站B。
XSS 是實現 CSRF 的諸多途徑中的一條,但絕對不是唯一的一條。一般習慣上把通過 XSS 來實現的 CSRF 稱為 XSRF。因為網站A有漏洞,當我們訪問的時候,可能已經被注入了訪問危險網站B的操作
防范方法:
- 1、檢查網頁的來源,比如laravel使用令牌
- 2、檢查內置的隱藏變量
- 3、使用POST,不要使用GET,處理變量也不要直接使用$_REQUEST
php安全三板斧:過濾輸入、驗證數據,以及轉義輸出。
1.數據過濾:
過濾輸入是指轉義或刪除不安全的字符。在數據到達應用的存儲層之前,一定要過濾輸入數據,這是第一道防線,
- HTML
我們可以使用PHP提供的htmlentities函數過濾HTML,該函數會將所有HTML標簽字符(&、<、>等)轉化為對應的HTML實體,以便在應用存儲層取出后安全渲染。
- SQL查詢
在SQL查詢中一定不能使用未過濾的輸入數據,如果要在SQL查詢中使用輸入數據,一定要使用PDO預處理語句(PDO是PHP內置的數據庫抽象層,為不同的數據庫驅動提供統一接口),PDO預處理語句是PDO提供的一個功能,可以用於過濾外部數據,然后把過濾后的數據嵌入SQL語句,避免出現上述SQL注入問題,此外預處理語句一次編譯多次運行,可以有效減少對系統資源的占用,獲取更高的執行效率。關於PDO后我們后續還會在數據庫部分重點討論。
值得注意的是,很多現代PHP框架都使用了MVC架構模式,將數據庫的操作封裝到了Model層,框架底層已經做好了對SQL注入的規避,只要我們使用模型類提供的方法執行對數據庫的操作,基本上可以避免SQL注入風險。
2.驗證數據:
可以php原生實現,借助php組件實現,laravel中是有專門的驗證類validation
3.轉義輸出:
把輸出渲染成網頁或API響應時,一定要轉義輸出,這也是一種防護措施,能避免渲染惡意代碼,造成XSS攻擊,還能防止應用的用戶無意中執行惡意代碼。
laravel中使用blade模板,模板引擎在底層已經為了做好了轉義處理
laravel 中如何避免csrf攻擊

用戶在網站b的時候發送了操作a網站的請求,同時a網站下已經有了cookie信息,所以是合法的。laravel通過csrf_token來進行判定是不是我們自己的網站訪問的,因為每次訪問都帶着這個token,如果是網站b過來的非法操作a網站請求,肯定不會帶着這個token,也就不合法了。
參考資料:
http://www.freebuf.com/articles/web/39234.html
http://www.cnblogs.com/luyucheng/p/6234524.html
http://laravelacademy.org/post/4610.html
