攻擊者經過構造惡意SQL命令發送到數據庫,若是程序未對用戶輸入的 SQL命令執行判斷過濾,那麼生成的SQL語句可能會繞過安全性檢查,插入其餘用於修改後端數據庫的語句,並可能執行系統命令,從而對系統形成危害php
例如刪除 id 爲 1 的帖子,sql 以下:html
若是有人在提交 post_id 時輸入 1 OR 1 ,你的語句會組合成這樣:laravel
通常比較常出如今原生的 SQL 操做,框架通常會解決這方面的問題。一般採用參數控制或過濾特殊字符避免上述的問題。web
1. 水平越權sql
水平越權就是同等角色下的用戶,不但可以訪問和操做本身私有的數據,還能訪問其餘人私有的數據,其根本是基於數據的訪問權限。數據庫
刪除用戶收款方式的場景以下:json
經過收款方式 {id} 執行 delete 請求的路由爲: localhost/api/payments/{id}
後端
若是沒有作數據控制,A 登陸後攜帶 A 的 token 執行刪除的接口 localhost/api/payments/4
,則會刪除 B 的,因此須要對 destory
方法作數據控制api
推薦使用第三種方式作數據控制,否則面向對象白學了。獲取收款方式的列表一樣須要數據權限控制,用戶和收款方式存在一對多的關聯關係,模型關聯後,獲取用戶收款方式列表能夠寫成瀏覽器
2. 垂直越權
低權限的角色經過一些途徑,得到高權限的能力,就發生了越權訪問。如普通用戶 guest 修改 admin 用戶的密碼;guest 可直接進入後臺取得域名管理、用戶管理等全部權限
解決這個問題,須要把權限職責以最小顆粒細分,基於 RBAC 設計權限管理系統。分爲如下關聯模型
每次執行請求時,在前置中間件判斷這個用戶是否永遠該執行請求的權限,無權限則駁回。
3. 上下文越權
攻擊者可以利用應用程序狀態機中的漏洞得到關鍵資源的訪問權限,這就存在上下文相關的越權。上下文相關的越權漏洞通常屬於業務邏輯漏洞。 如在找回密碼過程當中,攻擊者使用本身的帳戶信息經過驗證,將他人的密碼進行了修改。
在步驟1以後,執行找回密碼,路由爲 。若是此時沒有校驗當前找回密碼的帳戶是否爲進行郵箱校驗後的帳戶,由可能產生越權漏洞.
路由 : 【PUT 】localhost/api/users/find-password
,接收參數 email,new_password.
錯誤:校驗和修改分紅 2 步 localhost/api/email/check
-> localhost/api/users/password
正確:在 findPassword 裏面再次驗證完成郵箱校驗的帳戶是否爲當前找回密碼的帳號
限制分頁條目範圍,防止惡意請求
如獲文章列表的接口 localhost/api/articles
以上代碼若是沒有限制 pagesize 的範圍,惡意請求者請求把 pagesize 輸入 5000,10000 等甚至更大的數,會給數據庫帶來必定的壓力,localhost/api/articles?pageid=0&pagesize=10000
JWT 的 Token 須要二次加密
許多拓展包加密出的token並不十分安全,用base64_decode能夠解密獲取 加密主鍵、載荷等重要信息,因此一般須要對JWT的token進行二次加密
限制上傳文件的類型
對於一個圖片上傳的接口,若是沒有對上傳文件的格式作限制,攻擊者頗有可能把 .php後綴的文件上傳到public/images目錄下,而後經過根目錄執行這個文件。
須要設計安全的文件上傳功能避免上述問題
禁止或者避免寫自動解壓.zip 等壓縮文件的代碼
單純地限制文件或壓縮包大小並無用,一個ZIP炸彈的.zip文件僅有 42 KB,但在解壓後會佔用 4718592 GB
避免登陸密碼被暴力破解
作好異常處理,避免在生產環境中不正確的錯誤報告暴露敏感數據
若是你不當心,可能會在生產環境中由於不正確的錯誤報告泄露了敏感信息,例如:文件夾結構、數據庫結構、鏈接信息與用戶信息。
1 <?php 2 // 關閉錯誤報告 3 error_reporting(0); 4 5 // 報告 runtime 錯誤 6 error_reporting(E_ERROR | E_WARNING | E_PARSE); 7 8 // 報告全部錯誤 9 error_reporting(E_ALL); 10 11 // 等同 error_reporting(E_ALL); 12 ini_set("error_reporting", E_ALL); 13 14 // 報告 E_NOTICE 以外的全部錯誤 15 error_reporting(E_ALL & ~E_NOTICE); 16 ?> 17 18 display_errors = Off
php 弱語言的設計缺陷如:in_array
在一些重要的地方須要使用 ===
來做數據判斷。
LFI (本地文件包含)
LFI (本地文件包含) 是一個用戶未經驗證從磁盤讀取文件的漏洞。
不驗證過濾用戶的輸入 將它要渲染的模板文件用 GET 請求加載。
因爲 Include 能夠加載任何文件,不只僅是 PHP,攻擊者能夠將系統上的任何文件做爲包含目標傳遞。
這將致使 /etc/passwd 文件被讀取並展現在瀏覽器上。
要防護此類攻擊,你必須仔細考慮容許用戶輸入的類型,並刪除可能有害的字符,如輸入字符中的 「.」 「/」 「\」。
XSS
XSS 又叫 CSS (Cross Site Script) ,跨站腳本攻擊。它指的是惡意攻擊者往 Web 頁面裏插入惡意 html 代碼,當用戶瀏覽該頁之時,嵌入其中 Web 裏面的 html 代碼會被執行,從而達到惡意攻擊用戶的特殊目的。
由於咱們把用戶的內容直接打印出來,不通過任何過濾,非法用戶能夠拼接 URL: search.php?q=%3Cscript%3Ealert(1)%3B%3C%2Fscript%3E
PHP 渲染出來的內容以下,能夠看到 Javascript 代碼會被直接執行:
Javascript 能夠:
使用 htmlentities()
過濾特殊字符,防止大部分的 xss 攻擊
CSRF (跨站請求僞造)
例如網站上有用戶能夠用來註銷帳戶的連接。
若是某個用戶評論:
用戶將在查看此評論的時候刪除他們的帳號。
laravel 的 web 路由默認開啓了 csrf 驗證,原理是在客戶端產生一個隨機的 token,在表單校驗時判斷這個 token 是不是這個頁面上的請求