OWASP(OpenWebApplicationSecurityProject)是一个记录当前Web应用程序威胁的项目。我一直在关注他们的网站,从2010年、2013年和2017年的报告中我发现了一些相似之处,SQL或其他类型的注入威胁位居榜首。这是一个严重的问题。它可能导致破产,所以这是生死攸关的问题,您的组织应该专注于处理此类问题以避免它发生。什么是注射?所谓注入,就是不对数据进行过滤,将不可信的内容直接写入系统解释器。此行为将导致对站点进行SQL注入。更糟糕的是,攻击者可能获得对系统的访问权限。完全权限。例如:看下面的恶意查询语句,它会将包含恶意行为的SQL语句放在$name变量中,然后让用户通过POST方式传递给PHP脚本,从而最终利用传入的恶意代码攻击的目标。//编写恶意代码,DROPTABLEinto$namevariable`$name="Mark';DROPTABLEusers;--";\$query="SELECT*FROMusersWHEREname='$name'";`通过PHP脚本分析,最终会生成这样一条SQL语句:SELECT*FROMusersWHEREname='Mark';DROPTABLEusers;--'如你所料,上面的语句将从数据库中删除整个users数据表。正如尤达所说:太危险了,是的,太危险了。如何防止恶意注入PHP应用?首先,实际上没有任何东西注入数据库。这种错误只是由于查询语句格式不正确造成的。解决方法很简单,只要正确格式化SQL语句,或者将查询语句和数据分开处理即可。怎么做?使用参数化查询格式化数据并将查询语句与数据分开。使用参数化查询,您可以确保您的程序没有注入风险。例子如下:`$statement=$db->prepare('SELECT*FROMtableWHEREid=?andname=?');\$statement->execute([1,"Mark"]);`另外,一个安全的方法是在项目中使用ORM(对象关系映射)或查询构建器。我要推荐的是Eloquent,著名的PHP框架Laravel也使用了它。接下来教大家如何安装使用,可以帮助我们做好数据格式化,从而有效避免注入危害。有关Eloquent的更多信息,请参阅laravel文档。在安装Eloquent之前,请确保您已经安装了PHP和Composer。入门最好在项目开始时安装ORM。假设我们要构建一个博客应用程序,包括一个posts表和一个users表。初始配置所做的第一件事是为程序创建一个composer.json文件。可以在终端运行composerinit,按照终端提示操作即可。当它要求您定义依赖项时,写入illuminate/database。最终输出应如上图所示。现在您可以通过运行composerinstall在您的项目中安装相应的依赖项。或者,如果你已经有了composer.json文件,可以直接在终端输入composerrequireilluminate/database来安装相应的依赖。现在我们需要在应用程序的根目录中创建start.php文件并将以下代码粘贴到该文件中。我将在下面解释它们的作用。require"vendor/autoload.php";//如果要显示错误*是否显示错误error_reporting(E_ALL);ini_set('display_errors','1');使用Illuminate\Database\Capsule\ManagerasCapsule;$胶囊=新胶囊;$capsule->addConnection(["driver"=>"mysql","host"=>"127.0.0.1","database"=>"test","username"=>"root","password"=>"root"]);//使这个Capsule实例全局可用。*使胶囊全局可用$capsule->setAsGlobal();//设置EloquentORM。$capsule->bootEloquent();在第一行,我们需要导入vendor/autoload.php文件。这样我们就可以加载vendor目录下的所有包了。然后我们引入useIlluminate\Database\Capsule\ManagerasCapsule并给它起个别名,这样我们就可以使用eloquent了。接下来,我们创建一个Capsule对象并使用上面的bootEloquent()初始化我们的数据库连接。现在,显然我们需要做的第一件事是创建一个名为test的数据库,确保在本地输入正确的用户名和密码。迁移/数据迁移使用Eloquent的最大好处之一是能够使用迁移。如果不知道什么是迁移,可以看下面的解释:迁移是一种通过PHP代码创建数据表的方式。在migrations.php文件中创建迁移:require"start.php";useIlluminate\Database\Capsule\ManagerasCapsule;Capsule::schema()->create('users',function($table){$table->increments('id');$table->string('name');$table->string('email')->unique();$table->string('password');$table->时间戳();});Capsule::schema()->create('posts',function($table){$table->increments('id');$table->string('title');$table->text('body');$table->integer('created_by')->unsigned();$table->timestamps();});上面代码通过Capsule类Tables创建了两个数据,一个是users表,一个是posts表,并为它们定义了字段名。运行这个文件,如果看到白屏,就说明迁移成功了,现在可以打开数据库看看是否生成了这两张表。Models现在,唯一要做的就是创建数据表对应的Model类。使用Eloquent,可以在Model类中操作相应的数据表,执行查询语句。创建一个Models文件夹,然后在里面创建User.php和Post.php文件:namespaceModels;useIlluminate\Database\Eloquent\Model;classUserextendsModel{/***对应的数据表**@varstring*/受保护的$表=“用户”;/***允许插入的字段**@vararray*/protected$fillable=['name','email','password'];/***需要隐藏**@vararray*/protected$hidden=['password','remember_token',];/**向User类添加方法**/publicfunctionposts(){return$this->hasMany(Post::class,'created_by');}}AndnamespaceModels;useIlluminate\Database\Eloquent\Model;classPostextendsModel{/***对应数据表**@varstring*/protected$table="posts";/***允许插入的字段**@vararray*/protected$fillable=['title','body','created_by'];}将以下代码添加到composer.json文件中,以确保可以自动加载上面创建的类文件。"autoload":{"classmap":["Models"//所有模型所在的文件夹]}然后执行composerdump-autoload。通过Eloquent操作数据库就基本搞定了。我们来测试一下,在根目录下创建一个index.php文件,添加如下代码:require"start.php";useModels\User;useModels\Post;User::create(['name'=>'MarkMike','email'=>'temp-email-1@mark.com','password'=>'1234']);Post::create(['title'=>'NewBlogPost','body'=>'新博客内容','created_by'=>1]);print_r(User::all());print_r(Post::all());print_r(User::find(1)->职位);如你所见,使用Eloquent处理数据库就是这么简单。此外,Eloquent还提供了很多方法供你使用,而且非常安全。结论:Eloquent就像是给你的SQL查询添加了一个安全层,它可以过滤掉我们在执行SQL查询时所犯的错误。如果你想使用它,但又不想安装Laravel框架,那么我想你已经从这篇文章中学会了如何去做。这个优雅的SQL助手将帮助您编写更干净、更安全的代码。文章转自:https://learnku.com/php/t/25962更多文章:https://learnku.com/php/c/tra...
