什么是 SQL Injection?该如何避免?
2023年2月9日
💎 加入 E+ 成長計畫 與超過 500+ 位軟體工程師一同在社群中成長,並且獲得更多的軟體工程學習資源
什么是 SQL Injection?
SQL Injection 是透过修改 SQL 语句,进而达到对资料库的恶意攻击,常见的方法为,用户填写的表格中,刻意填写 SQL 语句,使得后端获得文字后,用拼接的方式可能会得到意想不到的 SQL 语句,并且对资料库做执行,如下图所示。
因此用户只要在 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 的问题。