php編程中要留意的那些坑,php弊端

本文目錄一覽:

PHP7的優缺點及從當前版本升級到PHP7都遇見了哪些坑

php7主要就是優化了底層數據結構,大幅提高了性能。目前升級沒遇到什麼坑建議果斷升級,機器數量至少節約一半

如何避免ThinkPHP的兩個坑

public function createProblems(){

$problems = I(‘json.’);

if (empty($problems)) {

$this-error($problems, ‘json格式不符合規範’);

}

foreach ($problems as $problem) {

$data = D(‘Problem’)-create($problem, self::OP_INSERT);

if (!$data) {

$this-error($problem, D(‘Problem’)-getError());

}

$temp[] = $data;

}

$ret = D(‘Problem’, ‘Service’)-addProblems($temp);

if ($ret === false) {

$this-error(null, ‘導入失敗’);

}

$this-success(null);

}

接口完成的功能是批量創建問題,參數為json數組,addProblem()方法中就是一個addAll操作。

第一個坑-自動填充

使用自動填充可能會覆蓋表單提交項目。其目的是為了防止表單非法提交字段。使用Model類的create方法創建數據對象的時候會自動進行表單數據處理。

官方文檔明確說了自動填充會覆蓋表單,所以即使你post過來的參數中給出了具體數值,使用create方法之後也可能會被覆蓋。千萬注意!!!

第二個坑-addAll方法

addAll方法中不能出現null值,否則其他數據會自動向前移動,導致添加失敗。舉例:

[

{

“appId”: 1,

“serviceId”: 2,

“createUser”:null,

“status”: 1,

“priority”: 2

}

]

其中,createUser字段為null,插入時的sql語句會變成insert into va_problem (appId, serviceId, createUser, status, priority)values (1, 2, 1, 2)。null值沒了,導致插入失敗,這應該是ThinkPHP3.2.3的一個bug。這篇博客有相關的討論。

引入坑的過程

problemModel裏面有對createUser做自動填充。

通過api創建問題時,首先自動填充會覆蓋,所以表單中的createUser值失效,這是第一個坑。然後,由於自動填充createUser調用的是get_username()函數,通過api調用時,session(username)取不到值,所以create之後字段變成”createUser”:null,引入了第二個坑。

PHP軟件開發程序拓展的五大方法?

相信大多數程序員都有過對程序進行拓展的一些操作了,但是對於新手工程師來說這還是比較難的一個技術。今天,雲南java培訓就通過案例分析來了解和學習一下,PHP編程拓展的方法都有哪些。

1.使用PHP的APC特性。APC——AlternativePHPCache,雖然官方稱為「可選PHP緩存」,但是稱為「另一個PHP緩存也不為過」,因為它可以切實的提升網站的性能。

2.把所有不是.php的請求都分配給CDN(內容分髮網絡),不要使用你的服務器處理靜態文件。他們使用S3來存儲所有,並使用CloudFront作為他們的CDN。近CloudFront出現的一些問題迫使他們不得不直接使用S3服務。

3.切勿將PHP代碼里的鏈接指向其它的服務器。比如數據庫以及memcache服務器,除非是強制性的或者是沒有其它方法實現你的目的。在執行流中讓鏈接指向其它服務器是非常沒有效率的:可能會使服務器受到限制,從而降低處理的速度。使用APC鍵/值存儲來儲存數據,並使用Barnish來緩存整個頁面。

4.使用Varnish。一般情況下,站點上的所有網頁都不會改變或者是不會做大型的改動。Varnish就對於網絡服務器緩存有着Memcache/ModRewrite的作用。同樣在壓力測試中,使用前後的性能差異很大。

5.使用更大的服務器實例,比如c1.xlarge有8個核心可以應對負載,而m1.medium只有一個核心可以處理請求。

可以使用GoogleAnalytics來分析每個用戶在每個頁面上花費的時間。收集這些信息,使用Siege來運行壓力測試,從而不斷的熟悉自己業務的負載類型,以便更好的提升程序的擴展性。

找一個拒絕學php的理由?

語法設計不合理

這個誠然有歷史原因,但確實是不合理。

命名空間用(\)分隔,簡直喪心病狂;對象成員用(-)訪問,略顯繁瑣

函數名不區分大小寫,老版本的類名也不區分大小寫,而變量名卻區分大小寫

數組的寫法繁瑣(array()),直到 5.4 才有簡寫語法([])

這樣function test_array(array $input_array), 可以限制參數的類型,適用於類和數組,卻不適用於 int 和 string

unset, echo, empty, list 長得像函數,卻不是函數

直到 5.4 才支持 func()[0] 這種寫法

大部分內部函數默認不會拋出異常,導致 PHP 中存在兩套獨立的錯誤處理機制

很多被棄用的功能仍被廣泛使用,新的功能被普及得很慢

這個是使用者的事情,但情況就是如此。

在開源軟件中更為突出,比如 WordPress 為了儘可能兼容舊的 PHP 版本,沒法用上例如匿名函數(5.3), 數組簡寫語法(5.4) 這種能夠大幅改善代碼可讀性的功能。

下面是一些被棄用的功能,這些功能大多是設計上存在失誤,後來因為可能導致潛在的問題被棄用,但因為網絡上互相轉載的一些不靠譜教程,所以很多人依然在使用。

__autoload

mysql_* 系列函數

Register Globals

Magic Quotes

Safe Mode

缺少好用的包管理器和依賴管理方案

PHP 和 Python, Ruby, Node.js 在使用領域上是有一定重疊的,我們來比較一下包的數量:

雖然包的數量不代表質量,但是代表了人們是否願意發佈和使用包。

Composer 在 PHP 中的普及率恐怕不及上面其他三款包管理器,比如作為最火的博客程序 WordPress, 和國內的 Typecho 都沒有使用 Composer, 而是直接在源代碼中包含所有依賴。

PHP Composer: 46k

Python PyPI: 53k

Ruby Gems: 94k

Node.js NPM: 116k

必須為每個請求創建一個單獨的進程

PHP 必須為每個請求創建一個進程(或線程),這導致在高並發的情況下會佔用大量內存。

在 PHP 中很難創建一個資源,並讓它可以在全局範圍內,可以被所有請求訪問到,只能通過外部的數據庫或緩存來實現。亦沒有辦法定義一項任務,獨立於其他請求運行,只能通過單獨的任務隊列來解決。雖然這兩個問題並不嚴重,但無法輕量級地維護全局的狀態,算是一個缺憾。

PHP 是為 Web 優化的編程語言

現在大多數 Web 程序,往往都是 MVC 架構,在這種架構下,具有額外語法糖的 PHP 並不會比通用編程語言更好用。

相反的方面,雖然 PHP 可以用於 Web 之外的場景,但坑實在是多。例如缺少好用的異步流程控制的方案等。

可以直接用 $_GET 和 $_POST 訪問來自客戶端的 GET 和 POST 數據

可以用 ?php ? 的方式嵌入到 HTML 文件中

在電商網站開發中有哪些常見漏洞

一、常見PHP網站安全漏洞

對於PHP的漏洞,目前常見的漏洞有五種。分別是Session文件漏洞、SQL注入漏洞、腳本命令執行漏洞、全局變量漏洞和文件漏洞。這裡分別對這些漏洞進行簡要的介紹。

1、session文件漏洞

Session攻擊是黑客最常用到的攻擊手段之一。當一個用戶訪問某一個網站時,為了免客戶每進人一個頁面都要輸人賬號和密碼,PHP設置了Session和Cookie用於方便用戶的使用和訪向。

2、SQL注入漏洞

在進行網站開發的時候,程序員由於對用戶輸人數據缺乏全面判斷或者過濾不嚴導致服務器執行一些惡意信息,比如用戶信息查詢等。黑客可以根據惡意程序返回的結果獲取相應的信息。這就是月行胃的SQL注入漏洞。

3、腳本執行漏洞

腳本執行漏洞常見的原因是由於程序員在開發網站時對用戶提交的URL參數過濾較少引起的,用戶提交的URL可能包含惡意代碼導致跨站腳本攻擊。腳本執行漏洞在以前的PHP網站中經常存在,但是隨着PHP版本的升級,這些間題已經減少或者不存在了。

4、全局變量漏洞

PHP中的變量在使用的時候不像其他開發語言那樣需要事先聲明,PHP中的變量可以不經聲明就直接使用,使用的時候系統自動創建,而且也不需要對變 量類型進行說明,系統會自動根據上下文環境自動確定變量類型。這種方式可以大大減少程序員編程中出錯的概率,使用起來非常的方便。

5、文件漏洞

文件漏洞通常是由於網站開發者在進行網站設計時對外部提供的數據缺乏充分的過濾導致黑客利用其中的漏洞在Web進程上執行相應的命令。

二、PHP常見漏洞的防範措施

1、對於Session漏洞的防範

從前面的分析可以知道,Session攻擊最常見的就是會話劫持,也就是黑客通過各種攻擊手段獲取用戶的Session ID,然後利用被攻擊用戶的身份來登錄相應網站。為此,這裡可以用以下幾種方法進行防範:一是定期更換Session ID,更換Session ID可以用PHP自帶函數來實現;二是更換Session名稱,通常情況下Session的默認名稱是PHPSESSID,這個變量一般是在cookie中保存的,如果更改了它的名稱,就可以阻檔黑客的部分攻擊;三是對透明化的Session ID進行關閉處理,所謂透明化也就是指在http請求沒有使用cookies來制定Session id時,Sessioin id使用鏈接來傳遞.關閉透明化Session ID可以通過操作PHP.ini文件來實現;四是通過URL傳遞隱藏參數,這樣可以確保即使黑客獲取了session數據,但是由於相關參數是隱藏的,它也很難獲得Session ID變量值。

2、對SQL注入漏洞的防範

黑客進行SQL注入手段很多,而且靈活多變,但是SQL注人的共同點就是利用輸入過濾漏洞。因此,要想從根本上防止SQL注入,根本解決措施就是加強對請求命令尤其是查詢請求命令的過濾。具體來說,包括以下幾點:一是把過濾性語句進行參數化處理,也就是通過參數化語句實現用戶信息的輸入而不是直接把用戶輸入嵌入到語句中。二是在網站開發的時候儘可能少用解釋性程序,黑客經常通過這種手段來執行非法命令;三是在網站開發時儘可能避免網站出現bug,否則黑客可能利用這些信息來攻擊網站;僅僅通過防禦SQL注入還是不夠的,另外還要經常使用專業的漏洞掃描工具對網站進行漏洞掃描。

3、對腳本執行漏洞的防範

黑客利用腳本執行漏洞進行攻擊的手段是多種多樣的,而且是靈活多變的,對此,必須要採用多種防範方法綜合的手段,才能有效防止黑客對腳本執行漏洞進行攻擊。這裡常用的方法方法有以下四種。一是對可執行文件的路徑進行預先設定。

4、對全局變量漏洞防範

對於PHP全局變量的漏洞問題,以前的PHP版本存在這樣的問題,但是隨着PHP版本升級到5.5以後,可以通過對php.ini的設置來實現,設置ruquest_order為GPC。另外在php.ini配置文件中,可以通過對Magic_quotes_runtime進行布爾值設置是否對外部引人的數據中的溢出字符加反斜線。為了確保網站程序在服務器的任何設置狀態下都能運行。

5、對文件漏洞的防範

對於PHP文件漏桐可以通過對服務器進行設置和配置來達到防範目的。這裡具體的操作如下:一是把PHP代碼中的錯誤提示關閉,這樣可以避免黑客通過錯誤提示獲取數據庫信息和網頁文件物理路徑;二是對open_basedir盡心設置,也就是對目錄外的文件操作進行禁止處理;這樣可以對本地文件或者遠程文件起到保護作用,防止它們被攻擊,這裡還要注意防範Session文件和上載文件的攻擊;三是把safe-made設置為開啟狀態,從而對將要執行的命令進行規範,通過禁止文件上傳,可以有效的提高PHP網站的安全係數。

php程序是必修寫在中嗎,為什麼很多的只有就結束了,這是個錯誤嗎

您好:

首先,如果是PHP和HTML混排的時候,PHP代碼默認必須寫在?php ?之間。

比如:h1?php echo $title; ?/h1;

其次,如果一個PHP文件中全部都是PHP代碼,可以不寫結束符號,只寫開始就行。

Zend的編碼規範中也提到了這一點,大意是:只含有PHP代碼的文件是不允許有 ? 結束符號的,是為了防止有意外的結尾輸出(比如空格,換行),導致程序出現意外響應。

一般這種意外多發生在文件包含。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/249760.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 17:11
下一篇 2024-12-12 17:12

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • PHP登錄頁面代碼實現

    本文將從多個方面詳細闡述如何使用PHP編寫一個簡單的登錄頁面。 1. PHP登錄頁面基本架構 在PHP登錄頁面中,需要包含HTML表單,用戶在表單中輸入賬號密碼等信息,提交表單後服…

    編程 2025-04-27
  • PHP與Python的比較

    本文將會對PHP與Python進行比較和對比分析,包括語法特性、優缺點等方面。幫助讀者更好地理解和使用這兩種語言。 一、語法特性 PHP語法特性: <?php // 簡單的P…

    編程 2025-04-27
  • PHP版本管理工具phpenv詳解

    在PHP項目開發過程中,我們可能需要用到不同版本的PHP環境來試驗不同的功能或避免不同版本的兼容性問題。或者我們需要在同一台服務器上同時運行多個不同版本的PHP語言。但是每次手動安…

    編程 2025-04-24
  • PHP數組去重詳解

    一、array_unique函數 array_unique是php中常用的數組去重函數,它基於值來判斷元素是否重複,具體使用方法如下: $array = array(‘a’, ‘b…

    編程 2025-04-24
  • PHP導出Excel文件

    一、PHP導出Excel文件列寬調整 當我們使用PHP導出Excel文件時,有時需要調整單元格的列寬。可以使用PHPExcel類庫中的setWidth方法來設置單元格的列寬。下面是…

    編程 2025-04-24
  • php擴展庫初探

    一、什麼是php擴展庫? PHP擴展庫(PHP extension)是一些用C語言編寫的動態鏈接庫,用於擴展PHP的功能。PHP擴展庫使得PHP可以與各種數據庫系統相連、SMTP、…

    編程 2025-04-23

發表回復

登錄後才能評論