根本原因
后台用字符串拼接参数的方式组成 SQL 语句
select * from bookTbl where author = '上野宣' and flag = 1;
对应 URL
http://example.com/search?q=上野宣
如果将请求改成
http://example.com/search?q=上野宣 '--
就会执行
select * from bookTbl where author = '上野宣'--' and flag = 1;
相当于
select * from bookTbl where author = '上野宣'
两种方法
- 使用成熟的 ORM 框架提供的API(其本身也是用过滤危险字符的方式)
- 如果必须写原生 SQL 语句,SQL 参数用 ? + replacements 的形式传,例如 JDBC 的 PreparedStatement