PHP 安全與加密:守護 Web 應用的基石


PHP 學習資料

PHP 學習資料

PHP 學習資料


在當今數字化時代,Web 應用無處不在,而 PHP 作為一種廣泛使用的服務器端腳本語言,承載著無數網站和應用的核心邏輯。然而,隨著網絡攻擊手段日益復雜,PHP 應用面臨著諸多安全威脅,如 SQL 注入、XSS 攻擊等,同時,數據的加密保護也至關重要。本文將深入探討 PHP 中的安全問題及加密算法的應用,幫助開發者構建更安全可靠的 Web 應用。

一、PHP 安全之殤 ——SQL 注入攻擊

1.1 SQL 注入的原理與危害

SQL 注入是一種常見且極具破壞力的 Web 攻擊方式。當 Web 應用程序對用戶輸入數據的合法性未進行嚴格判斷或過濾時,攻擊者就可以在 SQL 查詢語句中插入惡意代碼。例如,在一個簡單的用戶登錄驗證系統中,若代碼使用了如下不安全的查詢方式:

$username = $_POST['username'];
$password = $_POST['password'];
$query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
$result = mysqli_query($conn, $query);

攻擊者可以在用戶名或密碼輸入框中輸入特殊字符和 SQL 語句,如在用戶名處輸入’ OR ‘1’='1,密碼隨意輸入,此時拼接后的 SQL 語句變為:

SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '任意值'

這樣的語句將繞過正常的驗證邏輯,使攻擊者能夠非法訪問系統。SQL 注入的危害極大,攻擊者可以獲取數據庫中的敏感信息,如用戶賬號密碼、信用卡信息等,甚至可以篡改、刪除數據,對網站和用戶造成嚴重損失。

1.2 防范 SQL 注入的方法

使用預處理語句:預處理語句是防范 SQL 注入的有效手段。以 MySQLi 擴展為例,代碼如下:

$username = $_POST['username'];
$password = $_POST['password'];
$stmt = $conn->prepare("SELECT * FROM users WHERE username =? AND password =?");
$stmt->bind_param("ss", $username, $password);
$stmt->execute();
$result = $stmt->get_result();

預處理語句會對用戶輸入進行嚴格的類型檢查和轉義處理,有效防止惡意 SQL 代碼的注入。

輸入驗證與過濾:對用戶輸入的數據進行嚴格的驗證和過濾,只允許合法的數據進入數據庫查詢。可以使用正則表達式等方法驗證數據格式,如驗證郵箱格式:

$email = $_POST['email'];
if (!preg_match("/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/", $email)) {die("非法的郵箱格式");
}

最小權限原則:為數據庫用戶分配最小的權限,避免使用擁有過高權限的賬號連接數據庫。例如,只賦予用戶執行特定查詢和操作的權限,而不是授予管理員級別的所有權限。

二、XSS 攻擊 —— 網頁中的隱形殺手

2.1 XSS 攻擊的原理與類型

XSS(跨站腳本攻擊)是指攻擊者在網頁中注入惡意的客戶端腳本(如 JavaScript),當用戶訪問該網頁時,惡意腳本會在用戶瀏覽器中執行,從而竊取用戶信息、篡改頁面內容等。XSS 攻擊主要分為以下幾種類型:

反射型 XSS:攻擊者通過誘使用戶點擊包含惡意腳本的鏈接,將惡意腳本反射到用戶瀏覽器中執行。例如,一個搜索功能的頁面,若對用戶輸入的搜索關鍵詞未進行過濾,攻擊者可以構造如下鏈接:http://example.com/search.php?q=,當用戶點擊該鏈接時,瀏覽器會執行惡意腳本。

存儲型 XSS:攻擊者將惡意腳本存儲在服務器端數據庫中,當其他用戶訪問相關頁面時,惡意腳本會被加載并執行。比如在一個留言板應用中,攻擊者在留言內容中插入惡意腳本,后續查看留言的用戶都會受到攻擊。

DOM 型 XSS:通過修改頁面的 DOM 結構來注入惡意腳本。例如,攻擊者利用頁面中對 URL 參數的處理不當,修改 DOM 元素,注入惡意腳本。

2.2 防范 XSS 攻擊的策略

輸出編碼:在將用戶輸入的數據輸出到頁面時,進行 HTML 編碼,將特殊字符轉換為 HTML 實體,防止惡意腳本被執行。在 PHP 中,可以使用htmlspecialchars函數:

$content = $_POST['content'];
echo htmlspecialchars($content, ENT_QUOTES, 'UTF-8');

內容安全策略(CSP):通過設置 HTTP 頭信息中的 Content - Security - Policy,限制頁面可以加載的資源來源,阻止惡意腳本的加載。例如:

header("Content - Security - Policy: default - src'self'; script - src'self'");

這表示頁面只允許從當前域名加載資源和腳本,有效防止外部惡意腳本的注入。

輸入驗證與過濾:與防范 SQL 注入類似,對用戶輸入進行嚴格驗證,不允許包含惡意腳本的內容進入系統。可以使用白名單過濾,只允許特定的標簽和屬性,如使用 HTMLPurifier 庫對用戶輸入的 HTML 內容進行凈化。

三、PHP 加密算法 —— 數據的堅固盾牌

3.1 哈希加密

哈希加密是一種不可逆的加密方式,將任意長度的輸入數據轉換為固定長度的哈希值。在 PHP 中,常用的哈希函數有password_hash和hash系列函數。password_hash專門用于密碼加密,它采用了自適應哈希算法,如 bcrypt,具有較高的安全性:

$password = "user_password";
$hashed = password_hash($password, PASSWORD_DEFAULT);

在驗證密碼時,使用password_verify函數:

$input_password = $_POST['input_password'];
if (password_verify($input_password, $hashed)) {echo "密碼正確";
} else {echo "密碼錯誤";
}

hash函數則可以用于生成其他類型數據的哈希值,如計算文件的 MD5 或 SHA - 1 哈希值:

$file_content = file_get_contents('example.txt');
$md5_hash = hash('md5', $file_content);
$sha1_hash = hash('sha1', $file_content);

3.2 對稱加密

對稱加密使用同一個密鑰進行加密和解密,加密和解密速度快,適合大量數據的加密。在 PHP 中,可以使用 OpenSSL 擴展實現對稱加密,如 AES 算法:

$plaintext = "sensitive_data";
$key = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($plaintext, 'aes-256-cbc', $key, 0, $iv);

解密時:

$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);

需要注意的是,對稱加密的密鑰管理非常重要,密鑰一旦泄露,數據就會失去保密性。

3.3 非對稱加密

非對稱加密使用一對密鑰,即公鑰和私鑰。公鑰用于加密數據,私鑰用于解密數據。在 PHP 中,常用的非對稱加密算法是 RSA。例如,生成密鑰對:

$config = array("digest_alg" => "sha512","private_key_bits" => 4096,"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $private_key);
$public_key = openssl_pkey_get_details($res)['key'];

使用公鑰加密數據:

$plaintext = "important_message";
openssl_public_encrypt($plaintext, $encrypted, $public_key);

使用私鑰解密數據:

openssl_private_decrypt($encrypted, $decrypted, $private_key);

非對稱加密常用于數據傳輸過程中的加密,如 HTTPS 協議就使用了非對稱加密來保證數據的安全傳輸。

四、結語

PHP 安全與加密是 Web 開發中不可或缺的環節。通過有效防范 SQL 注入、XSS 攻擊等安全漏洞,合理應用加密算法保護數據,開發者可以為用戶打造一個安全可靠的 Web 應用環境。在實際開發中,應不斷關注安全技術的發展,持續學習和更新知識,將安全意識融入到每一行代碼中,為 Web 應用的安全保駕護航。隨著網絡安全形勢的日益嚴峻,只有不斷提升安全防護能力,才能在數字世界的浪潮中穩立潮頭。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70377.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70377.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70377.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt中使用QPdfWriter類結合QPainter類繪制并輸出PDF文件

一.類的介紹 1.QPdfWriter介紹 Qt中提供了一個直接可以處理PDF的類,這就是QPdfWriter類。 (1)PDF文件生成 支持創建新的PDF文件或覆蓋已有文件,通過構造函數直接綁定文件路徑或QFile對象; 默認生成矢量圖形PDF&#…

Golang GORM系列:GORM無縫集成web框架

高效的數據管理是每個成功的web應用程序的支柱。GORM是通用的Go對象關系映射庫,它與流行的Go web框架搭配得非常好,提供了無縫集成,簡化了數據交互。本指南將帶你探索GORM和web框架(如Gin, Echo和Beego)之間…

SAM C++ TensorRT(實時圖像分割)

SPEED SAM C TENSORRT 🌐 1、概述 用于SAM(segment anything model分割一切模型)的TensorRT和CUDA優化的高表現C實現,特別適用于實時圖像分割任務。 📢 更新 模型轉換:從ONNX模型構建TensorRT引擎以加速…

【LLAMA】羊駝從LLAMA1到LLAMA3梳理

every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 LLAMA 1到3梳理 1. LLAMA 1 論文: LLaMA: Open and Efficient Foundation Language Models 時間: 2023.02 1.1 前言…

什么是網絡安全?網絡安全防范技術包括哪些?

伴隨著互聯網的發展,它已經成為我們生活中不可或缺的存在,無論是個人還是企業,都離不開互聯網。正因為互聯網得到了重視,網絡安全問題也隨之加劇,給我們的信息安全造成嚴重威脅,而想要有效規避這些風險&…

【從0做項目】Java搜索引擎(7) web模塊

阿華代碼,不是逆風,就是我瘋 你們的點贊收藏是我前進最大的動力!! 希望本文內容能夠幫助到你!! 目錄 文章導讀 零:項目結果展示 一:后端web模塊 1:思路 2&#xff1a…

Visual Studio Code 集成 Baidu Comate

文章目錄 安裝Baidu Comate插件 安裝Baidu Comate插件 從左主側欄中 點擊 【擴展】這個圖標,然后在上方輸入欄中輸入 baidu comate —>選中列出的Bai Comate —>點擊 【安裝】按鈕,等待安裝完畢…

WeMos D1+PIR+Android 的小場景制作

最近在做一個有趣的小場景功能,其實已經有成熟產品,但是考慮到沒法實現場景擴展,所以自己開始動手做。 場景描述:玄關人體感應,有人進門,致歡迎詞,有人離開,致歡送詞。 硬件設備&a…

Android ListPreference使用

Android ListPreference使用 參考 添加鏈接描述 導入 androidx.preference.ListPreferenceListPreference是Android中的一個Preference子類,用于顯示一個可選擇的列表,并且可以保存用戶所選擇的值。它繼承自DialogPreference,可以在用戶點擊時彈出一個對話框,顯示可選擇的…

Spring Security實現記住我功能的實戰指南

在現代Web應用中,"記住我"功能是提升用戶體驗的重要特性之一。用戶無需在每次訪問時重新登錄,這不僅方便,還能增強用戶對應用的粘性。今天,我們將通過一個具體的實例,詳細探討如何在Spring Security中實現&q…

用命令模式設計一個JSBridge用于JavaScript與Android交互通信

用命令模式設計一個JSBridge用于JavaScript與Android交互通信 在開發APP的過程中,通常會遇到Android需要與H5頁面互相傳遞數據的情況,而Android與H5交互的容器就是WebView。 因此要想設計一個高可用的 J S B r i d g e JSBridge JSBridge,不…

ModuleNotFoundError: No module named ‘timm.optim.novogr兩種解決方法

運行報錯 from timm.optim.novograd import NovoGradModuleNotFoundError: No module named ‘timm.optim.novograd’。 問題原因 timm版本過高,novograd函數已被拋棄。 解決辦法 方法1:安裝更低版本的timm pip install timm0.4.12方法2&#xff1a…

DeepSeek 本地部署指南:從零開始搭建 AI 搜索工具

1. 引言 背景介紹 DeepSeek 是一款基于 AI 的搜索工具,能夠高效處理海量數據,提供精準的搜索結果。它結合了 Ollama 的模型管理能力,使得部署更加便捷。 為什么選擇本地部署 本地部署可以確保數據隱私,避免云端傳輸的風險&…

昇騰DeepSeek模型部署優秀實踐及FAQ

2024年12月26日,DeepSeek-V3橫空出世,以其卓越性能備受矚目。該模型發布即支持昇騰,用戶可在昇騰硬件和MindIE推理引擎上實現高效推理,但在實際操作中,部署流程與常見問題困擾著不少開發者。本文將為你詳細闡述昇騰 De…

vscode復制到下一行

linux中默認快捷鍵是ctrl shift alt down/up 但是在vscode中無法使用,應該是被其他的東西綁定了,經測試,可以使用windows下的快捷鍵shift alt down/up { “key”: “shiftaltdown”, “command”: “editor.action.copyLinesDownAction”…

網絡爬蟲學習:借助DeepSeek完善爬蟲軟件,實現模擬鼠標右鍵點擊,將鏈接另存為本地文件

一、前言 最近幾個月里,我一直在學習網絡爬蟲方面的知識,每有收獲都會將所得整理成文發布,不知不覺已經發了7篇日志了: 網絡爬蟲學習:從百度搜索結果抓取標題、鏈接、內容,并保存到xlsx文件中 網絡爬蟲學…

Arduino 第十六章:pir紅外人體傳感器練習

Arduino 第十六章:PIR 傳感器練習 一、引言 在 Arduino 的眾多有趣項目中,傳感器的應用是非常重要的一部分。今天我們要學習的主角是 PIR(被動紅外)傳感器。PIR 傳感器能夠檢測人體發出的紅外線,常用于安防系統、自動…

CV -- YOLOv8 圖像分割(GPU環境)

目錄 參考視頻: 標注 JSON轉為TXT 訓練 驗證 參考視頻: 使用 Yolov8 自定義數據集進行圖像分割_嗶哩嗶哩_bilibili 標注 數據集: 我使用的是一些蘋果數據集,可以在我的csdn資源中下載: https://download.csdn.net/do…

深入理解 lua_KFunction 和 lua_CFunction

在 Lua C API 中,lua_KFunction 和 lua_CFunction 是兩個核心概念,尤其在處理協程和 C 函數擴展時扮演著至關重要的角色。lua_CFunction 作為一種 C 函數類型,允許開發者將 C 函數注冊到 Lua 環境中,使得這些 C 函數可以在 Lua 腳本中被調用,進而實現 Lua 的功能擴展。而 …

基于微信小程序的電影院訂票選座系統的設計與實現,SSM+Vue+畢業論文+開題報告+任務書+指導搭建視頻

本系統包含用戶、管理員兩個角色。 用戶角色:注冊登錄、查看首頁電影信息推薦、查看電影詳情并進行收藏預定、查看電影資訊、在線客服、管理個人訂單等。 管理員角色:登錄后臺、管理電影類型、管理放映廳信息、管理電影信息、管理用戶信息、管理訂單等。…