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

owasp (open web application security project) 是一个记录当前 web 应用所受威胁情况的项目。我一直都在关注他们的网站,从 2010,2013 和 2017 年的报告中我发现了一些相似之处,sql 或其他类型的注入威胁都是高居榜首。

这是个心腹大患。

它会导致你破产,因此这个事情关乎存亡,你单位应该着力处理此类问题避免它的出现。

什么是注入?

所谓注入,就是数据没有经过过滤,将无法信任的内容直接写入了系统解释器,这种行为会导致对站点产生 SQL 注入,更糟糕的是,攻击者可能会获得对系统的全部权限。

立即学习“PHP免费学习笔记(深入)”;

举个例子:

看下面的恶意查询语句,它会将含有恶意行为的 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

SpeakingPass-打造你的专属雅思口语语料 SpeakingPass-打造你的专属雅思口语语料

使用chatGPT帮你快速备考雅思口语,提升分数

SpeakingPass-打造你的专属雅思口语语料 25 查看详情 SpeakingPass-打造你的专属雅思口语语料

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

48225fdce45ec251969d2cb85a8b14c.png

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');    }}Andnamespace 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 助手,将帮助你写出更干净且更安全的代码。

更多PHP相关知识,请访问PHP中文网!

以上就是在你的 PHP 项目中单独使用 Laravel Eloquent 查询语句来避免 SQL 注入的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/365322.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
聚焦新型显示、元宇宙,这场路演科创氛围满满!
上一篇 2025年11月6日 04:59:28
CPU进入千瓦时代!AMD下代霄龙服务器处理器曝光:功耗700-1400W、性能提升70%
下一篇 2025年11月6日 04:59:31

相关推荐

  • laravel如何快速实现数据填充(使用seeder)

    laravel如何快速实现数据填充(使用seeder)laravel如何快速实现数据填充(使用seeder)laravel如何快速实现数据填充(使用seeder)laravel如何快速实现数据填充(使用seeder)

    下面由laravel教程栏目带大家介绍laravel利用seeder实现数据表中填充数据,希望对大家有所帮助! laravel利用seeder实现数据表中填充数据 给大家演示一下如何快速填充数据表中的数据 首先要执行php artisan命令 会出现各种命令指示 查找到 php artisan ma…

    2026年10月2日 • 用户投稿
    000
  • laravel怎么在Nginx或Apache服务器上正确配置_laravel在Nginx/Apache服务器配置方法

    首先确保Web服务器指向Laravel的public目录并配置重写规则,Nginx需设置root和try_files指令,Apache需启用mod_rewrite并配置DocumentRoot及AllowOverride权限,最后调整文件权限与所有权以确保正常访问。 如果您尝试在服务器上部署 Lar…

    2026年10月2日
    100
  • 这7个建议,能让你学laravel事半功倍!

    下面由laravel教程栏目带大家推荐介绍关于学习 laravel 更有效率的七个建议,希望对大家有所帮助! 学习 Laravel 更有效率的七个建议 随着社区的发展,已经出现了很多现成的资源可以帮助你学习 Laravel。看起来很不错不是吗?不过,你该如何选择最好的一个?或者说,究竟哪个更适合你并…

    2026年10月2日
    000
  • 聊聊Laravel Carbon扩展包的作用及用法

    聊聊Laravel Carbon扩展包的作用及用法聊聊Laravel Carbon扩展包的作用及用法聊聊Laravel Carbon扩展包的作用及用法聊聊Laravel Carbon扩展包的作用及用法

    下面由laravel教程栏目带大家推荐介绍关于laravel carbon 扩展包,希望对大家有所帮助!                                                                                 Introduction Carb…

    2026年10月1日 • 用户投稿
    000
  • laravel 依赖注入是什么

    laravel 依赖注入是什么laravel 依赖注入是什么laravel 依赖注入是什么laravel 依赖注入是什么

    laravel依赖注入一词是由Martin Fowler提出的术语,它是将组件注入到应用程序中的一种行为,依赖注入是敏捷架构中关键元素,使用示例如“class UserProvider{protected $connection…}”。                          …

    2026年10月1日 • 用户投稿
    000
  • 就业培训中PHP+MySQL框架的学习情况

    php和mysql在就业培训中学习情况积极,学员通过系统学习和实践可快速掌握并找到工作机会。1. 理解php基本语法和mysql查询语言是基础。2. 学习laravel或symfony等框架提高开发效率。3. 参与实际项目增强技术能力和简历亮点。4. 注重安全性,防范sql注入和xss攻击。5. 优…

    2026年10月1日
    100
  • Mac下怎么安装和搭建Homestead 2.0环境

    Mac下怎么安装和搭建Homestead 2.0环境Mac下怎么安装和搭建Homestead 2.0环境Mac下怎么安装和搭建Homestead 2.0环境Mac下怎么安装和搭建Homestead 2.0环境

    mac下怎么搭建homestead环境?下面本篇文章给大家介绍一下mac版本下安装和搭建 homestead 2.0环境的方法,希望对大家有所帮助! Homestead 是 Laravel 官方推荐的开发环境之一,它由定制 Vagrantfile 的 Homestead 脚本和包含 PHP 开发相关…

    2026年10月1日 • 用户投稿
    100
  • Homestead安装运行laravel项目的步骤详解【图文】

    Homestead安装运行laravel项目的步骤详解【图文】Homestead安装运行laravel项目的步骤详解【图文】Homestead安装运行laravel项目的步骤详解【图文】Homestead安装运行laravel项目的步骤详解【图文】

    虽然homestead预装好了 nginx、php、mysql、postgresql、redis、memcached、node 以及开发令人惊叹的 laravel 应用程序所需的所有其他软件,但laravel仍然是需要我们去安装的,那么在阅读本文前你需要搭建好homestead环境,建议结合此文《最…

    2026年10月1日 • 用户投稿
    100
  • laravel中has方法怎么用

    laravel中has方法怎么用laravel中has方法怎么用laravel中has方法怎么用laravel中has方法怎么用

    laravel中has方法可以用来查询数据间是否有关联关系,常用于判断当前请求中是否含有指定的值,如果请求中存在该值则has()方法将会返回true,当给定一个数组时,该方法将会判断指定的值是否全部存在,语法为“has(‘name’)”。 本教程操作环境:windows10系…

    2026年10月1日 • 用户投稿
    000
  • Homestead 怎么配置 xdebug 进行调试(PhpStorm)

    Homestead 怎么配置 xdebug 进行调试(PhpStorm)Homestead 怎么配置 xdebug 进行调试(PhpStorm)Homestead 怎么配置 xdebug 进行调试(PhpStorm)Homestead 怎么配置 xdebug 进行调试(PhpStorm)

    homestead环境下怎么配置phpstorm xdebug进行调试,下面本篇文章给大家介绍一下phpstorm + homestead 配置 xdebug的方法,希望对大家有所帮助! 环境 windows10PhpStorm v2019.1.3homestead v7.2 (ubuntu18.0…

    2026年10月1日 • 用户投稿
    000
  • laravel与lumen的区别是什么

    laravel与lumen的区别是什么laravel与lumen的区别是什么laravel与lumen的区别是什么laravel与lumen的区别是什么

    区别:1、Laravel是一个全栈Web应用程序框架,而Lumen是一个微框架,用于开发微服务和API开发;2、Laravel可以与更多数量的工具集成,而Lumen与其他工具的集成设施数量较少。 本文操作环境:Windows10系统、Laravel6版、Dell G3电脑。 laravel与lume…

    2026年10月1日 • 用户投稿
    100
  • laravel中dd属于函数吗

    laravel中dd属于函数吗laravel中dd属于函数吗laravel中dd属于函数吗laravel中dd属于函数吗

    在laravel中,dd()属于laravel辅助函数;dd函数用于输出给定的值并结束脚本运行,可以打印laravel中的所有变量,语法为“dd($value1,$value2…)”。 本文操作环境:Windows10系统、Laravel6版、Dell G3电脑。 laravel中dd属…

    2026年10月1日 • 用户投稿
    000
  • laravel orWhere怎么用?(附代码示例)

    下面由laravel教程栏目给大家讲解laravel orwhere怎么用,希望对大家有所帮助! laravel框架下 where 条件查询很简单,这里就不写了,这里主要记录一下平常不怎么用的 orWhere 多条件 or 查询语句的拼接,示例如下: (1)SQL 语句: select `id` f…

    2026年10月1日
    000
  • 汇总laravel migrate的一些常见错误

    汇总laravel migrate的一些常见错误汇总laravel migrate的一些常见错误汇总laravel migrate的一些常见错误汇总laravel migrate的一些常见错误

    下面由laravel教程栏目给大家介绍关于laravel migrate初学的一些常见错误及其解决办法,希望对大家有所帮助! 前言 最近断断续续开始 laravel 入门学习,想整个简单的通讯录系统,设立了两个表,一个 branches ,一个 contacts。在创建 migration 文件的时…

    2026年10月1日 • 用户投稿
    100
  • 推荐两款在laravel中用的markdown格式css样式

    推荐两款在laravel中用的markdown格式css样式推荐两款在laravel中用的markdown格式css样式推荐两款在laravel中用的markdown格式css样式推荐两款在laravel中用的markdown格式css样式

    下面由laravel教程栏目给大家推荐两款非常漂亮的markdown格式css样式,希望对大家有所帮助! 发送markdown格式邮件时推荐的两款非常漂亮的markdown格式css样式:                                                        …

    2026年10月1日 • 用户投稿
    000
  • Laravel能用钉钉接收系统警报!

    Laravel能用钉钉接收系统警报!Laravel能用钉钉接收系统警报!Laravel能用钉钉接收系统警报!Laravel能用钉钉接收系统警报!

    下面由laravel教程栏目给大家介绍laravel框架怎么使用钉钉聊天机器人接收系统警报 ,希望对大家有所帮助!                                                                                 钉钉提供的聊天机器人功能…

    2026年10月1日 • 用户投稿
    000
  • laravel中mix的用法是什么

    laravel中mix的用法是什么laravel中mix的用法是什么laravel中mix的用法是什么laravel中mix的用法是什么

    在laravel中,“laravel mix”是一款前端任务自动化管理工具,mix提供了简洁流畅的API,能够为Laravel应用定义Webpack编译任务,mix支持许多CSS与JavaScript预处理器,通过调用可以管理前端资源。 本文操作环境:Windows10系统、Laravel6版、De…

    2026年10月1日 • 用户投稿
    100
  • 一文详解laravel如何安装inertia vue3的版本

    一文详解laravel如何安装inertia vue3的版本一文详解laravel如何安装inertia vue3的版本一文详解laravel如何安装inertia vue3的版本一文详解laravel如何安装inertia vue3的版本

    下面由laravel教程栏目给大家介绍laravel如何安装inertia vue3的版本,希望对大家有所帮助!                                                                                 一、安装前要求 1.1 已…

    2026年10月1日 • 用户投稿
    000
  • laravel怎么对数据库查询进行性能分析_laravel数据库查询性能分析方法

    首先启用查询日志并记录执行时间,使用DB::enableQueryLog()捕获SQL语句及耗时,筛选time>100ms的慢查询;接着通过Laravel Debugbar可视化分析数据库调用次数与重复查询;再利用Telescope监控所有数据库活动,查看执行时间与调用位置;同时在AppSer…

    2026年10月1日
    300
  • laravel 队列是什么

    laravel 队列是什么laravel 队列是什么laravel 队列是什么laravel 队列是什么

    在laravel中,队列是一种操作受限制的线性表,它只允许在表的前端(队头)进行删除操作,而在表的后端(队尾)进行插入操作;通过队列,开发者可以将耗时任务的处理往后推延,进而可以极大地提升web请求响应速度。 本教程操作环境:windows7系统、Laravel6版、Dell G3电脑。 larav…

    2026年10月1日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信