摘要:是一個記錄當前應用所受威脅情況的項目。怎么做呢用參數化查詢對數據格式化,并使查詢語句與數據分離。使用參數化查詢,可以確保程序遠離注入風險。例子如下除此之外,還有一種安全的做法,就是在項目中使用對象關系映射或者是查詢構造器。
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 知識可以參考?laravel docs.
安裝 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 IlluminateDatabaseCapsuleManager 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 IlluminateDatabaseCapsuleManager as Capsule 并起別名 ,這樣子我們就能使用 eloquent 了。
接下來, 我們創建一個 Capsule 對象并初始化我們的數據庫連接, 如上 ?bootEloquent()?。
現在, 很明顯我們要做的第一件事就是創建名為 test?的數據庫,請確保你在自己本地輸入的是正確的用戶名和密碼.
Migrations / 數據遷移使用 Eloquent 的一個最大的好處就是可以使用 migrations。
如果你不了解什么是 migrations,可以看下面的解釋:
migration 是一種可以通過 PHP 代碼創建數據表的方式。
在 migrations.php 文件中創建 migration:
require "start.php"; use IlluminateDatabaseCapsuleManager 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 IlluminateDatabaseEloquentModel; 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 IlluminateDatabaseEloquentModel; 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 ModelsUser; use ModelsPost; 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 助手,將幫助你寫出更干凈且更安全的代碼。
文章轉自:https://learnku.com/php/t/25962
更多文章:https://learnku.com/php/c/tra...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31079.html
摘要:第三步注冊工廠啟動數據庫服務數據庫服務的啟動主要設置的連接分析器,讓能夠用服務連接數據庫。 在我們學習和使用一個開發框架時,無論使用什么框架,如何連接數據庫、對數據庫進行增刪改查都是學習的重點,在Laravel中我們可以通過兩種方式與數據庫進行交互: DB, DB是與PHP底層的PDO直接進行交互的,通過查詢構建器提供了一個方便的接口來創建及運行數據庫查詢語句。 Eloquent...
摘要:一簡介的數據庫查詢構造器提供了一個方便流暢的接口,用來創建及運行數據庫查詢語句。的查詢構造器使用參數綁定,來保護你的應用程序免受注入的攻擊。和返回的是影響行數,即失敗為,成功為刪除行數。 相信很多人在學習 Laravel 時,會對 ORM 返回的數據類型產生混淆,如返回集合,模或者整數類型,下面將對增刪改查操作進行一個小結。 一、簡介 Laravel 的數據庫查詢構造器提供了一個方便、...
摘要:在本文中,我們將了解中的懶加載和即時加載以及它如何在后臺運行。現在所有的房屋數據和在關系表中的數據都同時加載出來了,查詢的語句的是使用即時加載時僅執行個查詢。總結現在你理解了這個過程,希望它能幫助你理解懶加載和即時加載的用法和基本原理。 Laravel中的Eloquent(ORM)的工作方式很令人驚訝,并提供訪問數據庫的非常簡單的方法。在本文中,我們將了解Laravel Eloquen...
摘要:,看下源碼返回很容易知道返回值是,然后將該值存儲在變量中,這時。看下的源碼去除掉字符后為返回從源碼中可知道返回值為,這時。 說明:本文主要學習下Query Builder編譯Fluent Api為SQL的細節和執行SQL的過程。實際上,上一篇聊到了IlluminateDatabaseQueryBuilder這個非常重要的類,這個類含有三個主要的武器:MySqlConnection, M...
摘要:本文翻譯改編自的十八個最佳實踐這篇文章并不是什么由改編的原則模式等。只是為了讓你注意你在現實生活的項目中最常忽略的內容。單一職責原則正在幫助你避免重復。當然,這也包括了模板的范圍等。此外,也擁有很棒的內置工具,比如軟刪除事件范圍等。 showImg(https://segmentfault.com/img/remote/1460000015166532); 本文翻譯改編自 Larave...
閱讀 1829·2021-11-11 16:55
閱讀 749·2019-08-30 15:53
閱讀 3587·2019-08-30 15:45
閱讀 670·2019-08-30 14:10
閱讀 3262·2019-08-30 12:46
閱讀 2122·2019-08-29 13:15
閱讀 2025·2019-08-26 13:48
閱讀 933·2019-08-26 12:23