首頁 php框架 ThinkPHP ThinkPHP的安全注意事項

ThinkPHP的安全注意事項

Dec 16, 2019 pm 05:33 PM
thinkphp 安全注意事項

ThinkPHP的安全注意事項

本文主要和大家探討ThinkPHP的安全注意事項,可以作為ThinkPHP建議的安全規範實務。

首先,沒有絕對的安全,只要你有足夠的安全意識才能盡可能的杜絕安全隱憂。規範的使用框架,能讓你盡量避免一些看起來比較幼稚的安全問題。本文所描述的安全注意事項主要是指生產環境下面的安全策略,本地開發的情況下有時候為了調試的需要安全並不是第一考慮。

ThinkPHP在考慮開發體驗的同時,仍然十分重視框架的底層安全,雖然屢有安全漏洞被播報,但官方都是第一時間進行修復處理,而且大部分漏洞只要開發者有一定的安全意識都是可以避免的,今年也和國內的幾個安全團隊建立了合作關係,有助於提前發現和及時修正框架可能被利用的漏洞或隱患。

規範部署

這一點很多開發者不是特別重視,安全是一個整體性的問題,任何一個環節出問題,帶來的後果都是一樣的嚴重,部署的安全策略是基礎安全問題。

很多開發者往往不按照官方的部署規範進行部署,請務必把你的WEB根目錄指向public目錄而不是應用根目錄,並且不要隨意更改入口文件的位置。 public目錄下面不要放除了入口文件和資源文件以外的其它應用檔。

關閉偵錯模式

在部署到生產環境的時候,確保你已經關閉了偵錯模式,可以透過修改環境變數的方式關閉偵錯模式。

APP_DEBUG=false
登入後複製

無論是本地開發還是生產環境部署,都不建議直接透過修改設定檔的方式來開啟/關閉偵錯模式,而應該使用環境變數(本地開發可以透過定義.env檔) 。

關閉偵錯模式後,系統的健康狀態和運行監控主要依靠日誌或你使用的監控服務。所以,要養成定時檢查日誌和運作狀態的習慣。

請求變數過濾

永遠不要相信使用者的輸入,這是一句至理名言。盡可能的過濾請求變數能有效防範大部分的漏洞和隱憂。

框架建議的取得請求變數的方法是Request類別的param方法(如非必要不要再使用get或post方法獲取,更不要使用原生的$_GET/$_POST等方法取得)。

public function index(Request $request)
{
    $name = $request->param('name');
    // 在这里可以根据你的业务需求进行更严谨的过滤
    // 例如 $name = $request->param('name','','htmlentities,strtolower');
    // 或者使用验证器进行专门的验证
}
登入後複製

對於有明確類型的請求變量,可以在使用param方法的時候使用類型強制轉換,例如:

public function index(Request $request)
{
    // 强制转换字符串数据
    $name = $request->param('name/s');
    // 强制转换整型数据
    $name = $request->param('id/d');
    // 强制转换浮点型数据
    $name = $request->param('score/f');
}
登入後複製

或直接使用方法參數來取得請求變數

public function index(string $name)
{
    // 在这里可以根据你的业务需求进行更严谨的过滤
    // 或者使用验证器进行专门的验证
}
登入後複製

如果你需要對所有資料進行處理,可以設定全域的篩選方法。對不同的應用程式需求設定default_filter過濾規則(預設沒有任何過濾規則),常見的安全過濾函數包括stripslashes、htmlentities、htmlspecialchars和strip_tags等,請根據業務場景選擇最適合的過濾方法。

如果需要取得多個數據,建議使用only方法指定需要取得的變數名稱,避免有些不懷好意的資料提交導致權限問題。

public function index(Request $request)
{
    // 指定表单数据名称
    $data = $request->only(['name','title']);
}
登入後複製

當你使用資料庫或模型操作寫入資料的時候,也可以指定字段,避免非法和不希望的字段寫入資料庫。

// 模型
User::allowField(['name','title'])
    ->save($data);
// 数据库
Db::name('user')
    ->field(['name','title'])
    ->insert($data);
登入後複製

模型還有一個唯讀欄位的功能能避免你的資料受到外部的修改。

上傳偵測

網站的上傳功能也是非常容易被攻擊的入口,所以上傳功能的安全性檢查是特別必要的。

系統的think\File類別提供了文件上傳的安全支持,包括對文件後綴、文件類型、文件大小以及上傳圖片文件的合法性檢查,確保你已經在上傳操作中啟用了這些合法性檢查,可以參考手冊的上傳章節。

SQL注入

ThinkPHP的查詢統一使用了PDO的prepare預查詢和參數綁定機制,能有效的避免SQL注入的發生。但不代表絕對安全,如果你缺乏良好的程式碼規範,仍然有可能被利用。

一個最簡單的原則就是不要讓使用者決定你的查詢條件(或欄位排序)和控制你的查詢資料。

對於一些字串的查詢條件(包括原生查詢)或特殊的查詢(包括ORDER部分),需要手動進行參數綁定。

// 错误的
Db::query("select * from think_user where id=$id AND status=$statis");
// 正确的
Db::query("select * from think_user where id=? AND status=?", [ $id, $status]);
// 正确的
Db::execute("update think_user set name=:name where status=:status", [
    'name'     => 'thinkphp', 
    'status'   => 1
]);
登入後複製

對於使用了whereExp和whereRaw方式的查詢,你也需要使用參數綁定。

Db::name('user')
    ->whereRaw('id > ? AND status = ?',[10, 1])
    ->select();
登入後複製

使用驗證器

對於大量的表單需要驗證的情況,建議使用驗證器功能統一進行資料的合規驗證。驗證器的驗證操作應該在控制器或路由階段使用validate方法處理,模型的資料驗證功能新版已經取消不再建議使用,模型和資料庫操作的時候應該傳入經過安全處理的資料。

XSS攻擊

跨站脚本攻击(cross-site scripting,简称 XSS),XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

在渲染输出的页面中,要对一些数据进行安全处理,防止被恶意利用造成XSS攻击,如果是5.1版本的话,所有的输出都已经经过了htmlentities 转义输出,确保安全。如果是5.0版本的话,你可以自定义一个xss过滤函数,在模板文件中对一些关键内容变量进行函数处理。

CSRF

CSRF 跨站请求伪造是 Web 应用中最常见的安全威胁之一,攻击者伪造目标用户的HTTP请求,然后此请求发送到有CSRF漏洞的网站,网站执行此请求后,引发跨站请求伪造攻击。攻击者利用隐蔽的HTTP连接,让目标用户在不注意的情况下单击这个链接,由于是用户自己点击的,而他又是合法用户拥有合法权限,所以目标用户能够在网站内执行特定的HTTP链接,从而达到攻击者的目的。

开启表单令牌验证,尽量开启强制路由并严格规范每个URL请求,定义单独的MISS路由规则。

遵循请求类型的使用规范并做好权限验证,删除操作必须使用DELETE请求,数据更改操作必须使用POST、PUT 或者 PATCH 请求方法,GET请求不应该更改任何数据。

会话劫持

会话劫持是指攻击者利用各种手段来获取目标用户的session id。一旦获取到session id,那么攻击者可以利用目标用户的身份来登录网站,获取目标用户的操作权限。

有效的防护策略包括:

在每次会话启动的时候,调用regenerate方法。

Session::start();
Session::regenerate(true);
登入後複製

更改session配置参数,开启安全选项:

'use_trans_sid' => 0,
'httponly' => true,
'secure' => true,
登入後複製

升级到安全版本

官方会对一些安全隐患和潜在漏洞进行修复,并且发布一个更为安全的版本。请确认你升级到更安全的版本,确保底层的安全和健壮性。

目前各个版本的建议版本如下:

ThinkPHP的安全注意事項

业务逻辑安全

这个属于应用层面的安全,很多漏洞源于某个业务逻辑自身的安全隐患,包括没有做合理的数据验证和权限检查,尤其是涉及资金及财务层面的,一定要做更多的安全检查,并且开启事务。一个好的建议是更多的对应用进行分层设计,减少每层的复杂性,独立的分层设计便于提高安全性。

服务器安全

最后一点是运维阶段需要特别注意的,及时更新服务器的安全补丁,确保没有可利用的公开系统漏洞,包括你的数据库系统安(尤其是数据备份工作)。

PHP中文网,有大量免费的ThinkPHP入门教程,欢迎大家学习!

本文转自:https://blog.thinkphp.cn/789333

以上是ThinkPHP的安全注意事項的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

thinkphp專案怎麼運行 thinkphp專案怎麼運行 Apr 09, 2024 pm 05:33 PM

執行 ThinkPHP 專案需要:安裝 Composer;使用 Composer 建立專案;進入專案目錄,執行 php bin/console serve;造訪 http://localhost:8000 查看歡迎頁面。

thinkphp有幾個版本 thinkphp有幾個版本 Apr 09, 2024 pm 06:09 PM

ThinkPHP 擁有多個版本,針對不同 PHP 版本而設計。主要版本包括 3.2、5.0、5.1 和 6.0,而次要版本用於修復 bug 和提供新功能。目前最新穩定版本為 ThinkPHP 6.0.16。在選擇版本時,需考慮 PHP 版本、功能需求和社群支援。建議使用最新穩定版本以獲得最佳性能和支援。

thinkphp怎麼運行 thinkphp怎麼運行 Apr 09, 2024 pm 05:39 PM

ThinkPHP Framework 的本機運作步驟:下載並解壓縮 ThinkPHP Framework 到本機目錄。建立虛擬主機(可選),指向 ThinkPHP 根目錄。配置資料庫連線參數。啟動 Web 伺服器。初始化 ThinkPHP 應用程式。存取 ThinkPHP 應用程式 URL 運行。

laravel和thinkphp哪個好 laravel和thinkphp哪個好 Apr 09, 2024 pm 03:18 PM

Laravel 和 ThinkPHP 框架的效能比較:ThinkPHP 效能通常優於 Laravel,專注於最佳化和快取。 Laravel 性能良好,但對於複雜應用程序,ThinkPHP 可能更適合。

開發建議:如何利用ThinkPHP框架實現非同步任務 開發建議:如何利用ThinkPHP框架實現非同步任務 Nov 22, 2023 pm 12:01 PM

《開發建議:如何利用ThinkPHP框架實現非同步任務》隨著網路技術的快速發展,Web應用程式對於處理大量並發請求和複雜業務邏輯的需求也越來越高。為了提高系統的效能和使用者體驗,開發人員常常會考慮利用非同步任務來執行一些耗時操作,例如發送郵件、處理文件上傳、產生報表等。在PHP領域,ThinkPHP框架作為一個流行的開發框架,提供了一些便捷的方式來實現非同步任務。

thinkphp怎麼安裝 thinkphp怎麼安裝 Apr 09, 2024 pm 05:42 PM

ThinkPHP 安裝步驟:準備 PHP、Composer、MySQL 環境。使用 Composer 建立專案。安裝 ThinkPHP 框架及相依性。配置資料庫連線。產生應用程式碼。啟動應用程式並造訪 http://localhost:8000。

thinkphp效能怎麼樣 thinkphp效能怎麼樣 Apr 09, 2024 pm 05:24 PM

ThinkPHP 是一款高效能的 PHP 框架,具備快取機制、程式碼最佳化、平行處理和資料庫最佳化等優勢。官方性能測試顯示,它每秒可處理超過 10,000 個請求,實際應用中被廣泛用於京東商城、攜程網等大型網站和企業系統。

基於ThinkPHP6和Swoole的RPC服務實作檔案傳輸功能 基於ThinkPHP6和Swoole的RPC服務實作檔案傳輸功能 Oct 12, 2023 pm 12:06 PM

基於ThinkPHP6和Swoole的RPC服務實作檔案傳輸功能引言:隨著網路的發展,檔案傳輸在我們的日常工作中變得越來越重要。為了提高檔案傳輸的效率和安全性,本文將介紹基於ThinkPHP6和Swoole的RPC服務實作檔案傳輸功能的具體實作方法。我們將使用ThinkPHP6作為Web框架,利用Swoole的RPC功能來實現跨伺服器的檔案傳輸。一、環境準

See all articles