OWASP (Open Web Application Security Project) 是一個記錄目前 web 應用程式所受威脅情況的專案。我一直在關注他們的網站,從 2010,2013 和 2017 年的報告中我發現了一些相似之處,SQL 或其他類型的注入威脅都是高居榜首。
這是個心腹大患。
它會導致你破產,因此這個事情關乎存亡,你單位應該著力處理此類問題避免它的出現。
什麼是注入?
所謂注入,就是資料沒有經過過濾,將無法信任的內容直接寫入了系統解釋器,這種行為會導致對網站產生SQL 注入,更糟的是,攻擊者可能會獲得系統的全部權限。
舉例:
看下面的惡意查詢語句,它會將含有惡意行為的SQL 語句放在$name 變數裡,然後允許使用者透過POST的方式傳遞給PHP 腳本,從而達到最終使用傳入的惡意程式碼攻擊的目的。
// 将恶意代码,DROP TABLE 写入 $name 变量 $name = "Mark';DROP TABLE users; -- ";\ $query = "SELECT * FROM users WHERE name='$name'";
經過 PHP 腳本解析,這會最終產生這樣的 SQL 語句:
SELECT * FROM users WHERE name='Mark';DROP TABLE users; -- '
正如你猜的那樣,上述語句會將整個 users 資料表從資料庫中刪除掉。
正如尤達所說的:
這太危險了,是的,太危險了。
如何防止對 PHP 應用的惡意注入?
首先,其實並沒有真的往資料庫注入什麼東西,這種錯誤只是因為沒有正確地將查詢語句格式化。解決的方法很簡單,只要正確格式化 SQL 語句,或是直接把查詢語句和資料分開處理。
怎麼做呢?用參數化查詢對資料格式化,並使查詢語句與資料分離。
使用參數化查詢,可以確保程式遠離注入風險。
範例如下:
$statement = $db->prepare('SELECT * FROM table WHERE id = ? and name = ? ');\ $statement->execute([1, "Mark"]);
除此之外,還有一種安全的做法,就是在專案中使用 ORM ( 物件關係映射)或是查詢建構器。
我要推薦的是著名的 PHP 框架 Laravel 也在使用的 Eloquent。接下來,我會教你如何安裝和使用,它可以幫助我們做好資料格式化的工作,從而有效避免注入危害。
安裝 Eloquent
準備工作
請確保你已經安裝了 PHP 和 Composer。
正式開始
最好在專案開始之初就安裝 ORM。
假設我們想要建立一個部落格應用,包含一個 posts 表和一個 users 表。
初始化配置
首先要做的是為程式建立 composer.json 檔案。你可以在終端機上運行 composer init 並按照終端上的提示進行操作。
當他要求您來定義依賴關係的時候,寫入 illuminate/database . 最後的輸出應該和上面的圖片中顯示的一樣。現在你就可以在項中透過執行 composer install 來安裝對應的依賴了。
或者,如果你已經有了 composer.json 這個文件,你可以直接在終端機輸入 composer require illuminate/database 來安裝對應的依賴。
現在我們需要在應用程式的根目錄中建立 start.php 檔案並把下面的程式碼貼到檔案中。我會在下面解釋他們的作用。
require "vendor/autoload.php"; //If you want the errors to be shown *是否显示错误 error_reporting(E_ALL); ini_set('display_errors', '1'); use Illuminate\Database\Capsule\Manager as Capsule; $capsule = new Capsule; $capsule->addConnection([ "driver" => "mysql", "host" =>"127.0.0.1", "database" => "test", "username" => "root", "password" => "root" ]); //Make this Capsule instance available globally. *要让 capsule 能在全局使用 $capsule->setAsGlobal(); // Setup the Eloquent ORM. $capsule->bootEloquent();
在第一行我們需要引入 vendor/autoload.php 檔案。這樣我們才能載入到 vendor 目錄下的所有套件。
然後我們引入 use Illuminate\Database\Capsule\Manager as Capsule 並起別名 ,這樣子我們就能使用 eloquent 了。
接下來,我們建立一個 Capsule 物件並初始化我們的資料庫連接, 如上 bootEloquent() 。
現在,很明顯我們要做的第一件事就是建立名為test 的資料庫,請確保你在自己本地輸入的是正確的使用者名稱和密碼.
Migrations / 資料遷移
使用Eloquent 的一個最大的好處就是可以使用migrations。
如果你不了解什麼是 migrations,你可以看下面的解釋:
migration 是一種可以透過 PHP 程式碼建立資料表的方式。
在migrations.php 檔案中建立migration:
require "start.php"; use Illuminate\Database\Capsule\Manager as Capsule; Capsule::schema()->create('users', function ($table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->timestamps(); }); Capsule::schema()->create('posts', function ($table) { $table->increments('id'); $table->string('title'); $table->text('body'); $table->integer('created_by')->unsigned(); $table->timestamps(); });
上面這段程式碼,透過Capsule 類別建立了兩個資料表,一個是users 表,另一個是posts 表,並且分別為他們定義了字段名。
運行這個文件,如果你看到白屏,就表示 migrations 運行成功了,現在就可以打開資料庫看看是否產生了這兩個表。
Models
現在,唯一要做的就是建立對應資料表的 Model 類別。
用了 Eloquent,你就可以在 Model 类里操作相应的数据表,执行查询语句了。
创建一个 Models 文件夹,然后在其中分别创建 User.php 和 Post.php 文件:
namespace Models; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 对应的数据表 * * @var string */ protected $table = "users"; /** * 允许插入的字段 * * @var array */ protected $fillable = [ 'name', 'email', 'password' ]; /** * 需要被隐藏的字段 * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; /* * 给 User 类添加方法 * */ public function posts() { return $this->hasMany(Post::class, 'created_by'); } } And namespace Models; use Illuminate\Database\Eloquent\Model; class Post extends Model { /** * 对应的数据表 * * @var string */ protected $table = "posts"; /** * 允许插入的字段 * * @var array */ protected $fillable = [ 'title', 'body', 'created_by' ]; } 在 composer.json 文件中加入如下代码,以确保上面创建的类文件能够被自动加载。 "autoload": { "classmap": [ "Models" // Folder where all your models are ] }
然后执行 composer dump-autoload。
通过 Eloquent 操作数据库
基本大功告成了。 测一下吧,在根目录创建 index.php 文件,添加如下代码:
require "start.php"; use Models\User; use Models\Post; User::create( [ 'name' => 'Mark Mike', 'email' => 'temp-email-1@mark.com', 'password' => '1234' ] ); Post::create( [ 'title' => 'New Blog Post', 'body' => 'New Blog Content', 'created_by' => 1 ] ); print_r(User::all()); print_r(Post::all()); print_r(User::find(1)->posts);
如你所见,用 Eloquent 操作数据库就是这么简单。除此之外,Eloquent 还提供了很多方法供你使用,而且很安全。
结语:
Eloquent 就像是给你的 SQL 查询加了一道安全层,它可以过滤掉我们在执行 SQL 查询时所犯的错误。如果你想用它,但是又不想安装 Laravel 框架,那么我想你已经从这篇文章中学到了该如何去做。这个优雅的 SQL 助手,将帮助你写出更干净且更安全的代码。
更多PHP相关知识,请访问PHP中文网!
以上是在你的 PHP 專案中單獨使用 Laravel Eloquent 查詢語句來避免 SQL 注入的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Laravel通過簡化Web開發過程和提供強大功能脫穎而出。其優勢包括:1)簡潔的語法和強大的ORM系統,2)高效的路由和認證系統,3)豐富的第三方庫支持,使得開發者能專注於編寫優雅的代碼並提高開發效率。

laravelispredminandermanthandermanthandermanthandermanthermanderframework,設計Forserver-SideLogic,databasemagement,andapideplupment,thryitalsosupportsfortfortsfrontenddevelopmentwithbladeTemplates。

Laravel和Python在性能和可擴展性方面的表現各有優劣。 Laravel通過異步處理和隊列系統提升性能,但受PHP限制在高並發時可能有瓶頸;Python利用異步框架和強大的庫生態系統表現出色,但在多線程環境下受GIL影響。

Laravel適合團隊熟悉PHP且需功能豐富的項目,Python框架則視項目需求而定。 1.Laravel提供優雅語法和豐富功能,適合需要快速開發和靈活性的項目。 2.Django適合複雜應用,因其“電池包含”理念。 3.Flask適用於快速原型和小型項目,提供極大靈活性。

Laravel可以用於前端開發。 1)使用Blade模板引擎生成HTML。 2)集成Vite管理前端資源。 3)構建SPA、PWA或靜態網站。 4)結合路由、中間件和EloquentORM創建完整Web應用。

PHP和Laravel可用於構建高效的服務器端應用。 1.PHP是開源腳本語言,適用於Web開發。 2.Laravel提供路由、控制器、EloquentORM、Blade模板引擎等功能,簡化開發。 3.通過緩存、代碼優化和安全措施,提升應用性能和安全性。 4.測試和部署策略確保應用穩定運行。

Laravel和Python在學習曲線和易用性上的表現各有優劣。 Laravel適合快速開發Web應用,學習曲線相對平緩,但掌握高級功能需時間;Python語法簡潔,學習曲線平緩,但動態類型系統需謹慎。

Laravel在後端開發中的優勢包括:1)優雅的語法和EloquentORM簡化了開發流程;2)豐富的生態系統和活躍的社區支持;3)提高了開發效率和代碼質量。 Laravel的設計讓開發者能夠更高效地進行開發,並通過其強大的功能和工具提升代碼質量。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3漢化版
中文版,非常好用

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

WebStorm Mac版
好用的JavaScript開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),