237
Php編程
Php碼農最容易出現的10條錯誤
PHP程序員在實際操作時都會或多或少的犯一些錯誤,並且還是重複多次的犯同樣的錯誤,今天我們就來總結了10條PHP程序員最容易犯的錯誤,讓大家有一個改正參考。
1.不轉意html entities
一個基本的常識:所有不可信任的輸入(特別是用戶從form中提交的數據) ,輸出之前都要轉意。
echo $_GET['usename'] ;
這個例子有可能輸出:
這是一個明顯的安全隱患,除非你保證你的用戶都正確的輸入。
如何修複 :
我們需要將"","and" 等轉換成正確的HTML表示(', and "),函數htmlspecialchars 和 htmlentities()正是幹這個活的。
正確的方法:
echo htmlspecialchars($_GET['username'], ENT_QUOTES);
2. 不轉意SQL輸入
我曾經在一篇文章中最簡單的防止sql注入的方法(php+mysql中)討論過這個問題並給出了一個簡單的方法 。有人對我說,他們已經在php.ini中將magic_quotes設置為On,所以不必擔心這個問題,但是不是所有的輸入都是從$_GET, $_POST或 $_COOKIE中的得到的!
如何修複:
和在最簡單的防止sql注入的方法(php+mysql中)中一樣我還是推薦使用mysql_real_escape_string()函數
正確做法:
3.錯誤的使用HTTP-header 相關的函數: header(), session_start(), setcookie()
遇到過這個警告嗎?"warning: Cannot add header 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
如果allow_url_fopen=On,你更是死定了:
如何修複:
你必須自己控製哪些文件可以包含在的include或require指令中。
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
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
還有一種PHP程序員最容易出現錯誤的情況就是,用戶一開始輸入了錯誤的登錄信息,服務器檢測到錯誤輸入後,輸出同樣的form要求用戶再次輸入,導致用戶的輸入轉意兩次!
最後更新:2017-10-08 17:57:26