小編給大家分享一下PHP項目中如何單獨使用Laravel Eloquent查詢語句來避免SQL注入,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都地區(qū)優(yōu)秀IDC服務器托管提供商(創(chuàng)新互聯(lián)).為客戶提供專業(yè)的服務器托管,四川各地服務器托管,服務器托管、多線服務器托管.托管咨詢專線:18982081108
OWASP (Open Web Application Security Project) 是一個記錄當前 web 應用所受威脅情況的項目。我一直都在關(guān)注他們的網(wǎng)站,從 2010,2013 和 2017 年的報告中我發(fā)現(xiàn)了一些相似之處,SQL 或其他類型的注入威脅都是高居榜首。
這是個心腹大患。
它會導致你破產(chǎn),因此這個事情關(guān)乎存亡,你單位應該著力處理此類問題避免它的出現(xiàn)。
什么是注入?
所謂注入,就是數(shù)據(jù)沒有經(jīng)過過濾,將無法信任的內(nèi)容直接寫入了系統(tǒng)解釋器,這種行為會導致對站點產(chǎn)生 SQL 注入,更糟糕的是,攻擊者可能會獲得對系統(tǒng)的全部權(quán)限。
舉個例子:
看下面的惡意查詢語句,它會將含有惡意行為的 SQL 語句放在 $name 變量里,然后允許用戶通過 POST 的方式傳遞給 PHP 腳本,從而達到最終使用傳入的惡意代碼進行攻擊的目的。
// 將惡意代碼,DROP TABLE 寫入 $name 變量 $name = "Mark';DROP TABLE users; -- ";\ $query = "SELECT * FROM users WHERE name='$name'";
經(jīng)過 PHP 腳本解析,這會最終生成這樣的 SQL 語句:
SELECT * FROM users WHERE name='Mark';DROP TABLE users; -- '
正如你猜的那樣,上述語句會將整個 users 數(shù)據(jù)表從數(shù)據(jù)庫里刪除掉。
正如尤達說的:
這太危險了,是的,太危險了。
如何防止對 PHP 應用的惡意注入?
首先,其實并沒有真的往數(shù)據(jù)庫里注入什么東西,這種錯誤只是由于沒有正確地將查詢語句格式化。解決的方法很簡單,只要正確地格式化 SQL 語句,或者是直接把查詢語句和數(shù)據(jù)分開處理。
怎么做呢?用參數(shù)化查詢對數(shù)據(jù)格式化,并使查詢語句與數(shù)據(jù)分離。
使用參數(shù)化查詢,可以確保程序遠離注入風險。
例子如下:
$statement = $db->prepare('SELECT * FROM table WHERE id = ? and name = ? ');\ $statement->execute([1, "Mark"]);
除此之外,還有一種安全的做法,就是在項目中使用 ORM ( 對象關(guān)系映射)或者是查詢構(gòu)造器。
我要推薦的是著名的 PHP 框架 Laravel 也在用的 Eloquent。接下來,我會教你如何安裝和使用,它可以幫助我們做好數(shù)據(jù)格式化的工作,從而有效避免注入危害。
安裝 Eloquent
準備工作
請確保你已經(jīng)安裝了 PHP 和 Composer。
正式開始
最好在項目開始之初就安裝 ORM。
假設我們想建一個博客應用,包含一個 posts 表和一個 users 表。
初始化配置
首先要做的是為程序創(chuàng)建 composer.json 文件。 你可以在終端上運行 composer init 并按照終端上的提示進行操作。
當他要求您來定義依賴關(guān)系的時候,寫入 illuminate/database . 最后的輸出應該和上面的圖片中顯示的一樣?,F(xiàn)在你就可以在項中通過運行 composer install 來安裝相應的依賴了。
或者,如果你已經(jīng)有了 composer.json 這個文件,你可以直接在終端輸入 composer require illuminate/database 來安裝相應的依賴。
現(xiàn)在我們需要在應用程序的根目錄中創(chuàng)建 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 了。
接下來,我們創(chuàng)建一個 Capsule 對象并初始化我們的數(shù)據(jù)庫連接, 如上 bootEloquent() 。
現(xiàn)在,很明顯我們要做的第一件事就是創(chuàng)建名為 test 的數(shù)據(jù)庫,請確保你在自己本地輸入的是正確的用戶名和密碼.
Migrations / 數(shù)據(jù)遷移
使用 Eloquent 的一個最大的好處就是可以使用 migrations。
如果你不了解什么是 migrations,可以看下面的解釋:
migration 是一種可以通過 PHP 代碼創(chuàng)建數(shù)據(jù)表的方式。
在 migrations.php 文件中創(chuàng)建 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 類創(chuàng)建了兩個數(shù)據(jù)表,一個是 users 表,另一個是 posts 表,并且分別為他們定義了字段名。
運行這個文件,如果你看到白屏,就說明 migrations 運行成功了,現(xiàn)在就可以打開數(shù)據(jù)庫看看是否生成了這兩個表。
Models
現(xiàn)在,唯一要做的就是創(chuàng)建對應數(shù)據(jù)表的 Model 類。
用了 Eloquent,你就可以在 Model 類里操作相應的數(shù)據(jù)表,執(zhí)行查詢語句了。
創(chuàng)建一個 Models 文件夾,然后在其中分別創(chuàng)建 User.php 和 Post.php 文件:
namespace Models; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * 對應的數(shù)據(jù)表 * * @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 { /** * 對應的數(shù)據(jù)表 * * @var string */ protected $table = "posts"; /** * 允許插入的字段 * * @var array */ protected $fillable = [ 'title', 'body', 'created_by' ]; } 在 composer.json 文件中加入如下代碼,以確保上面創(chuàng)建的類文件能夠被自動加載。 "autoload": { "classmap": [ "Models" // Folder where all your models are ] }
然后執(zhí)行 composer dump-autoload。
通過 Eloquent 操作數(shù)據(jù)庫
基本大功告成了。 測一下吧,在根目錄創(chuàng)建 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 操作數(shù)據(jù)庫就是這么簡單。除此之外,Eloquent 還提供了很多方法供你使用,而且很安全。
結(jié)語:
Eloquent 就像是給你的 SQL 查詢加了一道安全層,它可以過濾掉我們在執(zhí)行 SQL 查詢時所犯的錯誤。如果你想用它,但是又不想安裝 Laravel 框架,那么我想你已經(jīng)從這篇文章中學到了該如何去做。這個優(yōu)雅的 SQL 助手,將幫助你寫出更干凈且更安全的代碼。
以上是“PHP項目中如何單獨使用Laravel Eloquent查詢語句來避免SQL注入”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
網(wǎng)站題目:PHP項目中如何單獨使用LaravelEloquent查詢語句來避免SQL注入
文章轉(zhuǎn)載:http://bm7419.com/article14/igsgde.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、自適應網(wǎng)站、虛擬主機、網(wǎng)站收錄、App設計、營銷型網(wǎng)站建設
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)