首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

從 PHP/JS 混合判斷邏輯漏洞談程式碼簡化之道

     編輯:PHP 綜合知識

問題代碼還原

原始碼混合 PHP 與 JavaScript,意圖透過 Cookie 控制某段 JS 只執行一次:

<?php
header("Content-type: text/javascript");
if (!haveCookie('cookieName')) {
?>
/* JavaScript 代碼 */
if ('undefined' == typeof document.cookie['cookieName']) {
    setCookie('cookieName', 3600);
}
// ... 其它 JS 邏輯
<?php
}
?>

核心邏輯缺陷

乍看合理,實則 JavaScript 判斷永遠為 true:

if ('undefined' == typeof document.cookie['cookieName']) { ... }

原因: 這段 JS 只有在 PHP 端 !haveCookie('cookieName') 成立時才會輸出到客戶端。也就是說,JS 執行時 Cookie 必定不存在,判斷條件恆真,等同於重複檢查。

純 PHP 視角重構

<?php
header("Content-type: text/javascript");
if (!haveCookie('cookieName')) {
    if (!haveCookie('cookieName')) { // 邏輯重複
        setCookie('cookieName');
    }
}
?>

一眼即見多餘的巢狀判斷。

程式碼簡化七大原則

  1. 代碼越長 ≠ 效率越高 — 冗長邏輯往往隱藏冗餘。
  2. 合併同層級判斷 — 在不影響流程前提下,將多個條件合併為單一複合條件。
  3. 低複雜度優先 — 將輕量級檢查(如變數存在性)置於昂貴操作(如資料庫查詢)之前,善用短路求值。
  4. 警惕高複雜度函數在判斷中 — 避免在 if 條件中直接呼叫耗時函數。
  5. 巢狀過深即重構 — if 巢狀超過 3 層,應重新審視演算法與流程設計。
  6. 健壯性 ≠ 過度防禦 — 過多判斷往往反映對代碼缺乏信心,而非真正健壯。
  7. 重構即發現隱藏 Bug — 簡化過程中常能發現邏輯錯誤(如本例的重複判斷)。

重構建議

  • 將 Cookie 檢查與設置邏輯封裝為獨立函數/類別方法。
  • 若需前後端同步狀態,考慮用 AJAX 回傳 JSON 狀態碼,而非混合輸出 JS。
  • 善用 isset()、empty()、??(Null 合併運算子)簡化條件撰寫。

感謝 小馬 同志指正,促成此番反思。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved