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