什么是 SQL Injection?该如何避免?

2023年2月9日

💎 加入 E+ 成長計畫 與超過 350+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源

什么是 SQL Injection?

SQL Injection 是透过修改 SQL 语句,进而达到对资料库的恶意攻击,常见的方法为,用户填写的表格中,刻意填写 SQL 语句,使得后端获得文字后,用拼接的方式可能会得到意想不到的 SQL 语句,并且对资料库做执行,如下图所示。

SQL Injection
SQL Injection

因此用户只要在 password 的栏位填写 ' OR 1 = 1 -- 使得字串拼接起来为

queryStr = """ SELECT * FROM users WHERE username = 'Jack' AND password = '' OR 1= 1 --';"

因为 username = 'Jack' AND password = '' OR 1 = 1 恒为 True ,因此不用密码也能够登入成功。

如何防范 SQL Injection ?

Escape Parameters

利用正规表达式,对用户输入的参数进行检查,如果有符合 SQL 语句的关键字,就将他替换成合法字元,但这个方法的缺点为,若 SQL 语法关键字一旦新增,则正规表达式的规则也需要新增;而且总是会有漏网之鱼,无法全面防范。

Query Parameterization

这个防范是最安全的,原理就是资料库语法中的占位符号:

SELECT * FROM users WHERE username = $1 AND password = $2 ;

有些程式语言会先将 SQL 语句进行编译,最后再将参数丢入做执行,因此可以有效防范 SQL Injection 的攻击。

Object Relational Mapping (ORM)

使用 ORM 而非原始的 SQL 语句可以直接避免掉 SQL Injection 的问题。


相关文章

🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們