首页 php框架 Laravel 在你的 PHP 项目中单独使用 Laravel Eloquent 查询语句来避免 SQL 注入

在你的 PHP 项目中单独使用 Laravel Eloquent 查询语句来避免 SQL 注入

Oct 19, 2019 pm 02:34 PM
laravel

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 并按照终端上的提示进行操作。

fbc1f817c85fbc41e6a98a4f7feafca.png

当他要求您来定义依赖关系的时候,写入 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 运行成功了,现在就可以打开数据库看看是否生成了这两个表。

48225fdce45ec251969d2cb85a8b14c.png

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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系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.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 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)

PHP中如何使用对象-关系映射(ORM)简化数据库操作? PHP中如何使用对象-关系映射(ORM)简化数据库操作? May 07, 2024 am 08:39 AM

使用ORM可简化PHP中的数据库操作,它将对象映射到关系数据库中。Laravel中的EloquentORM允许使用面向对象的语法与数据库交互,可通过定义模型类、使用Eloquent方法或在实战中构建博客系统等方式来使用ORM。

Laravel和CodeIgniter的最新版本对比 Laravel和CodeIgniter的最新版本对比 Jun 05, 2024 pm 05:29 PM

Laravel9和CodeIgniter4的最新版本提供了更新的特性和改进。Laravel9采用MVC架构,提供数据库迁移、身份验证和模板引擎等功能。CodeIgniter4采用HMVC架构,提供路由、ORM和缓存。在性能方面,Laravel9的基于服务提供者设计模式和CodeIgniter4的轻量级框架使其具有出色的性能。在实际应用中,Laravel9适用于需要灵活性和强大功能的复杂项目,而CodeIgniter4适用于快速开发和小型应用程序。

Laravel - Artisan 命令 Laravel - Artisan 命令 Aug 27, 2024 am 10:51 AM

Laravel - Artisan 命令 - Laravel 5.7 提供了处理和测试新命令的新方法。它包括测试 artisan 命令的新功能,下面提到了演示?

Laravel 和 CodeIgniter 中数据处理能力的比较如何? Laravel 和 CodeIgniter 中数据处理能力的比较如何? Jun 01, 2024 pm 01:34 PM

比较Laravel和CodeIgniter的数据处理能力:ORM:Laravel使用EloquentORM,提供类对象关系映射,而CodeIgniter使用ActiveRecord,将数据库模型表示为PHP类的子类。查询构建器:Laravel具有灵活的链式查询API,而CodeIgniter的查询构建器更简单,基于数组。数据验证:Laravel提供了一个Validator类,支持自定义验证规则,而CodeIgniter的验证功能内置较少,需要手动编码自定义规则。实战案例:用户注册示例展示了Lar

Laravel 和 CodeIgniter 对于初学者来说哪一个更友好? Laravel 和 CodeIgniter 对于初学者来说哪一个更友好? Jun 05, 2024 pm 07:50 PM

对于初学者来说,CodeIgniter的学习曲线更平缓,功能较少,但涵盖了基本需求。Laravel提供了更广泛的功能集,但学习曲线稍陡。在性能方面,Laravel和CodeIgniter都表现出色。Laravel具有更广泛的文档和活跃的社区支持,而CodeIgniter更简单、轻量级,具有强大的安全功能。在建立博客应用程序的实战案例中,Laravel的EloquentORM简化了数据操作,而CodeIgniter需要更多的手动配置。

Laravel和CodeIgniter:哪种框架更适合大型项目? Laravel和CodeIgniter:哪种框架更适合大型项目? Jun 04, 2024 am 09:09 AM

在选择大型项目框架时,Laravel和CodeIgniter各有优势。Laravel针对企业级应用程序而设计,提供模块化设计、依赖项注入和强大的功能集。CodeIgniter是一款轻量级框架,更适合小型到中型项目,强调速度和易用性。对于具有复杂需求和大量用户的大型项目,Laravel的强大功能和可扩展性更合适。而对于简单项目或资源有限的情况下,CodeIgniter的轻量级和快速开发能力则更为理想。

PHP 代码单元测试与集成测试 PHP 代码单元测试与集成测试 May 07, 2024 am 08:00 AM

PHP单元和集成测试指南单元测试:关注单个代码单元或函数,使用PHPUnit创建测试用例类进行验证。集成测试:关注多个代码单元协同工作的情况,使用PHPUnit的setUp()和tearDown()方法设置和清理测试环境。实战案例:使用PHPUnit在Laravel应用中进行单元和集成测试,包括创建数据库、启动服务器以及编写测试代码。

Laravel和CodeIgniter:哪种框架更适合小型项目? Laravel和CodeIgniter:哪种框架更适合小型项目? Jun 04, 2024 pm 05:29 PM

对于小型项目,Laravel适用于大型项目,需要强大的功能和安全性。CodeIgniter适用于非常小的项目,需要轻量级和易用性。

See all articles