仅仅只是把单引号与反斜杠转义不用 prepare statement 能否避免 sql 注入?

2017-05-10 13:26:32 +08:00
 zjsxwc

比如我输入登录名 login_name 为 \' 就拼出这种 sql:

SELECT * FROM account WHERE (1) AND (`account`.login_name = '\\\'')

这样能否避免 sql 注入?

3714 次点击
所在节点    程序员
23 条回复
jybox
2017-05-10 13:48:17 +08:00
可以看下 mysql client 的 escape 是怎么实现的,除了单引号还有其他的符号
https://github.com/mysqljs/sqlstring/blob/master/lib/SqlString.js
zjsxwc
2017-05-10 14:03:44 +08:00
@jybox 谢谢回复。

对于你说的这些其他符号都是以反斜杠开头的,我已经转义了反斜杠,也就包括了对这些特殊符号转义。 因为参数最后会被 2 个单引号包裹,所以可以不对双引号转义
grayon
2017-05-10 14:12:43 +08:00
单引号、双引号、反斜杠、NULL 都要转义
还要对数字进行处理,比如整形进行 intval
还要防止 Unicode 编码的双字节绕过
as463419014
2017-05-10 14:17:03 +08:00
用 ESAPI
fy
2017-05-10 14:49:37 +08:00
什么年代了 为什么还要手动拼 sql
zjsxwc
2017-05-10 14:57:34 +08:00
@fy
就是在维护一个老系统,才来问的
fy
2017-05-10 14:58:23 +08:00
@zjsxwc 233 那就没办法了,祝好运
wdd2007
2017-05-10 14:59:59 +08:00
不能。
tomczhen
2017-05-10 15:00:46 +08:00
老系统可以在 web server 做过滤请求参数来做防注入,理论上无需修改代码。

如果判断逻辑复杂,可以考虑使用 openresty 或者直接上现成的开源项目。
lianz
2017-05-10 15:01:39 +08:00
只转移 \ 是不够的,三楼 @grayon 说得非常对。
五楼 @fy 说得非常好:都什么年代了,为什么还要手动拼 sql ?
在实践中,因为程序猿水平参差不齐,代码质量混杂,仅靠程序猿人力进行转义是完全不靠谱的,防得了一时,防不了一世,总会有一天会出漏洞,所以实际项目中除非绝对必要,否则绝对不要手动拼字符串。
woshixiaohao1982
2017-05-10 15:06:59 +08:00
@lianz 都什么年代了,还让程序员来解决这种 SQL 注入问题,我直接就是 ORM 往那里一套,
谁能注入这些开源框架,我服
102400
2017-05-10 15:18:29 +08:00
@woshixiaohao1982 ORM 也会有 SQL 注入漏洞
woshixiaohao1982
2017-05-10 18:57:39 +08:00
@102400 有些连接池自带防注入的功能,总而言之,集成一个开源过滤层进去就好了,这种代码 还自己来写,不是自找麻烦
helica
2017-05-10 19:00:44 +08:00
可以了解一下二次注入
ic3z
2017-05-10 20:03:57 +08:00
SELECT * FROM goods where id = 1
bombless
2017-05-11 00:58:05 +08:00
我印象中最大的坑是不同编码环境下哪些字符被等同于引号也是不同的。还有就是有时候可以通过不匹配的代理对或者类似的技术把右引号穿过去,那么在它后面的一对引号的左引号就被用来结束字面量,从这里开始就可以干坏事了
realpg
2017-05-11 12:49:51 +08:00
拼接 SQL 在很多复杂逻辑场景下是必须的
statement 并不包治百病
hoythan
2017-05-11 13:51:36 +08:00
麻烦问下楼上的,你们项目都用什么年代的方式才能都不用拼 sql
Mitt
2017-05-11 14:54:48 +08:00
@hoythan ORM
t333st
2017-05-11 16:52:24 +08:00
这种做法是不行的
1 如果你的 sql 语句没有单引号(select * from user where id =$id),那攻击者无需构造带单引号的语句攻击
2 还有种注入叫宽字符注入,网站使用 gbk 编码情况下,攻击者提交%df' ,即可绕过(%df 和\ 组成%df%5c 形成汉字 縗)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/360353

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX