PHP 入门 - 9.安全
文章目錄
- 過濾輸出
- 跨站腳本
- 預防方法
- SQL 注入
- 預防方法
- 轉義輸出文件名
- 會話固定
- 預防方法
- 文件上傳
- PHP 代碼
過濾輸出
開發一個 Web 網站要了解的最基本的事情之一是:所有非程序自己生成的信息都有潛在的污染,包括表單數據、文件和數據庫。也就是說任何時候我們都不要相信用戶輸入的數據。
關于過濾的最佳實踐:
- 用白名單的方法。這意味著你寧可謹慎地假設數據都是無效的,除非你能證明它有效。
- 不要糾正無效的數據。歷史證明嘗試糾正無效的數據常常會由于錯誤導致安全漏洞。
- 使用命名來幫助區分過濾好的和污染的數據。如果你不確定是否過濾了,過濾是無用的。
跨站腳本
跨站腳本(XSS, Cross-site scripting)由于簡寫 CSS 與層疊樣式表重名,而改寫成 XSS 。是最常見的網頁程序安全漏洞,是注入攻擊的一種。其特點是不對服務器造成任何傷害,而是通過一些正常的站內交互途徑,例如發布評論,提交含有 JavaScript 的內容的文本。
預防方法
對于任何用戶輸入的信息,都要進行轉義/過濾。
SQL 注入
SQL 注入是將惡意的 SQL 查詢或添加語句插入到應用的輸出參數中,在由數據庫服務器解析執行,從而達到攻擊目的。SQL 注入很像 XSS 。
預防方法
- 使用參數化查詢來設計數據訪問功能。
- 轉義輸出來達到過濾
轉義輸出文件名
用 realpath() 和 basename() 來檢查文件名。
-
realpath() : 返回規范化的絕對路徑名
chdir('/var/www/'); // 改變目錄 echo realpath('./../../etc/passwd'); // /etc/passwd -
basename() : 返回路徑中的文件名部分
這里舉一個例子:檢查當前傳入的參數文件名,是否為規范的文件名(也就是沒有 ./ …/ 的文件名)
$filename = $_POST['filename']; $vetted = basename(realpath($filename));if ($filename !== $vetted){die("{$filename} is not good filename"); }會話固定
攻擊者可以很簡單的拿到目標用戶的會話標識,進而目標用戶使用攻擊者的會話標識登錄站點,攻擊者劫持會話成功.
預防方法
- 當用戶登錄的時候重置 sessionID 。
- sessionID 閑置過久,重置 sessionID 。
- 當用戶權限變更時重置 sessionID 。
文件上傳
在文件上傳時,不要相信瀏覽器提供的文件名。正確的方法時:用戶交互中用瀏覽器提供的名字,但是要自己生成唯一的名字用來調用文件。
PHP 代碼
我們知道 eval() 函數,可以讓腳本執行任意PHP代碼。帶 /e 選項的 preg_replace() 函數與 eval() 函數效果一樣。
以上函數不要使用用戶提供的數據,因為這樣很容易遭到攻擊。
感謝你看到了這里。如果文章有錯誤,請評論指正,謝謝!
總結
以上是生活随笔為你收集整理的PHP 入门 - 9.安全的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP 入门 - 8.数据库
- 下一篇: PHP 入门 - 10.应用技术