比如我输入登录名 login_name 为 \'
就拼出这种 sql:
SELECT * FROM account WHERE (1) AND (`account`.login_name = '\\\'')
这样能否避免 sql 注入?
![]() | 1 jybox 2017-05-10 13:48:17 +08:00 ![]() 可以看下 mysql client 的 escape 是怎么实现的,除了单引号还有其他的符号 https://github.com/mysqljs/sqlstring/blob/master/lib/SqlString.js |
![]() | 2 zjsxwc OP |
![]() | 3 grayon 2017-05-10 14:12:43 +08:00 ![]() 单引号、双引号、反斜杠、NULL 都要转义 还要对数字进行处理,比如整形进行 intval 还要防止 Unicode 编码的双字节绕过 |
4 as463419014 2017-05-10 14:17:03 +08:00 用 ESAPI |
![]() | 5 fy 2017-05-10 14:49:37 +08:00 什么年代了 为什么还要手动拼 sql |
8 wdd2007 2017-05-10 14:59:59 +08:00 不能。 |
![]() | 9 tomczhen 2017-05-10 15:00:46 +08:00 via iPhone 老系统可以在 web server 做过滤请求参数来做防注入,理论上无需修改代码。 如果判断逻辑复杂,可以考虑使用 openresty 或者直接上现成的开源项目。 |
10 lianz 2017-05-10 15:01:39 +08:00 |
11 woshixiaohao1982 2017-05-10 15:06:59 +08:00 @lianz 都什么年代了,还让程序员来解决这种 SQL 注入问题,我直接就是 ORM 往那里一套, 谁能注入这些开源框架,我服 |
![]() | 12 102400 2017-05-10 15:18:29 +08:00 @woshixiaohao1982 ORM 也会有 SQL 注入漏洞 |
13 woshixiaohao1982 2017-05-10 18:57:39 +08:00 @102400 有些连接池自带防注入的功能,总而言之,集成一个开源过滤层进去就好了,这种代码 还自己来写,不是自找麻烦 |
14 helica 2017-05-10 19:00:44 +08:00 via iPhone 可以了解一下二次注入 |
15 ic3z 2017-05-10 20:03:57 +08:00 via Android SELECT * FROM goods where id = 1 |
![]() | 16 bombless 2017-05-11 00:58:05 +08:00 via Android 我印象中最大的坑是不同编码环境下哪些字符被等同于引号也是不同的。还有就是有时候可以通过不匹配的代理对或者类似的技术把右引号穿过去,那么在它后面的一对引号的左引号就被用来结束字面量,从这里开始就可以干坏事了 |
![]() | 17 realpg PRO 拼接 SQL 在很多复杂逻辑场景下是必须的 statement 并不包治百病 |
18 hoythan 2017-05-11 13:51:36 +08:00 麻烦问下楼上的,你们项目都用什么年代的方式才能都不用拼 sql |
![]() | 20 t333st 2017-05-11 16:52:24 +08:00 这种做法是不行的 1 如果你的 sql 语句没有单引号(select * from user where id =$id),那攻击者无需构造带单引号的语句攻击 2 还有种注入叫宽字符注入,网站使用 gbk 编码情况下,攻击者提交%df' ,即可绕过(%df 和\ 组成%df%5c 形成汉字 ) |
![]() | 21 zjsxwc OP |