透过网页 input 或 url,在送资料的时候带 SQL query 去操作资料库,可以是新增、删除或其他操作。
简单来说,就是对输入的 request 做检查,把 SQL query 过滤掉。
实作上,PHP 可以透过 PDO 来相对容易做到。
PDO—PHP Data Objects—are a database access layer providing a uniform method of access to multiple databases.
使用 PDO 有两阶段:
Using prepared statements will help protect you from SQL injection.
透过在准备阶段使用 placeholder 去过滤 SQL 达到预防 SQL injection 的效果。
# 有 SQL Injection 风险
$query = $DB->prepare("INSERT INTO users (name, email) values ($name, $email)");
# unnamed placeholders
$query = $DB->prepare("INSERT INTO users (name, email) values (?, ?)");
# named placeholders
$query = $DB->prepare("INSERT INTO users (name, email) values (:name, :email)");
bind 是绑定参数到 placeholder
Object-Relational Mapping
将关连式资料库的资料映射到物件,好让我们能用物件导向的逻辑去存取资料库资料;目前大部分框架都有搭配各自的 ORM,Laravel 搭配的是 Eloquent ORM、Django 搭配的是 Django ORM。
而 Eloquent ORM 基本上是建构在 PDO 之上的,所以使用得当的话是预防 SQL Injection 的。
值得注意的是,还是有一些方法是会有漏洞的,例如 whereRaw()
。有 raw 的基本上就是不会去做 SQL 的过滤;使用时就要记得用 placeholder,就是写那个「?」,而非直接把变数接在 SQL 里。
// Dont Do
$users = User::whereRaw('age > ? and votes = 100', [25])->get();
// Do
$users = User::whereRaw("age > {$_GET['age']} and votes = 100")->get();
<<: 如何让 Laravel Eloquent 支援 composite key
>>: IOS、Python自学心得30天 Day-19 TensorFlowLiteSwift模组
https://leetcode.com/problems/letter-combinations...
前几天大概讲完了 Angular 的 Component 的基本功能与介绍,在很多例子中可以看到在 ...
类别 类别里封装了变数和函数 被封装在类别里的变数称为属性 被封装在类别里的函数称为方法(方式、功能...
前言依旧被吃了~跟月饼一样(虽然明天才是中秋节XD) ▉前导观念~先理解这两个数值是怎麽评分的~ (...
前两天我们教大家怎麽部属了网页,但网页的内容几乎没说。 基本上网页配置有右侧的bar及左侧的表格,这...