面试题:什麽是 SQL injection?如何预防?

什麽是 SQL injection

透过网页 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 有两阶段:

  1. 准备指令
  2. 执行

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

ORM

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();

Reference


<<:  如何让 Laravel Eloquent 支援 composite key

>>:  IOS、Python自学心得30天 Day-19 TensorFlowLiteSwift模组

第 14 天 不断尝试直到成功( leetcode 017 )

https://leetcode.com/problems/letter-combinations...

[Angular] Day8. Templates and Text interpolation

前几天大概讲完了 Angular 的 Component 的基本功能与介绍,在很多例子中可以看到在 ...

#5 Python进阶教学2

类别 类别里封装了变数和函数 被封装在类别里的变数称为属性 被封装在类别里的函数称为方法(方式、功能...

DAY07_终於要来资产搬点啦~啊~不是~是盘点XDDD" 搬点是要搬家是吗~

前言依旧被吃了~跟月饼一样(虽然明天才是中秋节XD) ▉前导观念~先理解这两个数值是怎麽评分的~ (...

Day28 firebase authentication

前两天我们教大家怎麽部属了网页,但网页的内容几乎没说。 基本上网页配置有右侧的bar及左侧的表格,这...