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