1
Mogamigawa 2019-12-26 09:59:33 +08:00
放心, SQL 注入是过去时了, 现在的框架都可以抵御 SQL 注入.
|
2
ThirdFlame 2019-12-26 10:01:47 +08:00
@Mogamigawa 不不不 框架有能力 ,不代表你就写不出来 sql 注入。
|
3
xiaochun41 2019-12-26 10:17:04 +08:00
当你需要引用外部输入的变量去构建 sql 语句时候,对输入进行转义就可以了。
具体如何转义,各个语言的 mysql api 一般都有提供方法。 |
4
autung OP 这种广泛存在的问题应该是有规范的吧,有些网站是可以是用全部特殊符号,但是有些网站又会限制某些特殊符号,但是用提示和过滤显得有些麻烦,总不能每个接口有用户输入都要做这些提示吧,且这些特殊符号也有相应的使用场景,啊想想这一连串的问题,真是莫名的头大,而我只是一个改 bug 的垃圾小前端! want to go die !
|
5
autung OP @xiaochun41 我们老大说会有注入问题应该避免传特殊符号,我觉得这并不是一个好的方式,毕竟会莫名的增添很多麻烦
|
6
manami 2019-12-26 10:24:11 +08:00
使用 mysql 的预编译语句可有效防止 sql 注入
```` // 省略…… PreparedStatement ps = con.prepareStatement(sql); ps.setString(xxx) // 省略…… ```` |
7
manami 2019-12-26 10:29:02 +08:00
使用了预编译语句,特殊符号当成普通参数一样插入就行
|
8
xiaochun41 2019-12-26 10:31:18 +08:00
@autung 你也可以直接在获取输入的地方,统一做一下,并不算麻烦。
|
9
sx90 2019-12-26 10:31:55 +08:00
连 CPU 也有 BUG
不嫌累,不嫌加载过慢,就层层加密,层层审计 一般,直接用框架,多快好省 |
12
manami 2019-12-26 10:35:23 +08:00
那只能在执行 sql 语句前对参数进行过滤了
|
13
VictorJing94 2019-12-26 10:38:30 +08:00
关键词在后台过滤一下
|
14
autung OP @VictorJing94 我觉得这才是最正确的答案,毕竟前端的传递的内容和方式都不能信任
|
15
aguesuka 2019-12-26 10:47:44 +08:00 via Android
用 instr 代替 like %param%查询
|
16
hhgfy 2019-12-26 10:47:57 +08:00
% 用 '\' 转义吧
|
17
zrc 2019-12-26 10:48:45 +08:00
instr ?
|
19
aguesuka 2019-12-26 10:54:16 +08:00 via Android
不同的数据库也提供了转义符,谷歌的关键词叫 sql like ecsape
|
20
Felldeadbird 2019-12-26 11:16:34 +08:00
前端不需要刻意处理。后端接收到你提交的数据库后,让后端连接数据库时,基于 SQL 进行预编译处理。
|
21
ily433664 2019-12-26 11:18:34 +08:00
转义特殊字符
public static String escapeLikeValue(String value) { //String[] SPECIAL_CHARACTERS = {"%", "_", "[", "]", "^"}; for (String str : SPECIAL_CHARACTERS) { value = value.replace(str, "\\" + str); } return value; } |
22
zpf124 2019-12-26 11:36:49 +08:00
Java 工具框架用多了, 我也向楼上一样 以为预编译的 sql 就能防御 mysql 的通配符。
不过 Mybatis 确实提供了 通配符的处理, 采用#{} 传的值已经被处理了,只有${} 才会出问题。 |
23
ahqiuy 2019-12-26 12:10:09 +08:00
前两天刚刚遇到这种情况,做了 mybatis 的插件进行转义
|
24
fox0001 2019-12-26 12:54:57 +08:00 via Android
我们用 Solr 实现所有查询,SQL 注入是不存在的
|
25
gaius 2019-12-26 14:28:02 +08:00
like concat('%',#{},'%')不会注入,用$的情况需要 escapeSql
|
26
mary9 2019-12-26 23:33:13 +08:00 via Android
1.%和_都是特殊字符,使用 escape 处理,具体搜 escape 用法。
2.其它语言不清楚,Go 用的原生 sql,值用?代替就可防止注入。 |
27
jss 2019-12-27 00:47:42 +08:00 via iPhone
GO: 啥叫 SQL 注入…
|