sql 防止注入,用 base64 对用户输入内容进行预处理,是否可行?

2019-02-14 15:05:05 +08:00
 mostkia

如题,相对于 PDO 来讲,肯定是 PDO 更好,但按照题目里的说法,是否可行呢?(我使用的是 SQLite )

10767 次点击
所在节点    MySQL
77 条回复
xmdbb
2019-02-15 09:25:28 +08:00
还有就是不清楚你业务是怎样,如果涉及计算的,涉及日期对比的,你 BS64 后就只能通过取出来后在计算?
另外如果计算后还要连表查询,那不就变了要跑很多次吗?这样做不就弊大于利了。
其实 PDO 没啥不好吧?如果说不习惯,那就自己封装下成习惯的就可以了。你这简直是杀鸡取卵啊.....
qiyuey
2019-02-15 09:53:34 +08:00
参数化查询,不要去拼接 SQL
darktutu
2019-02-15 10:00:28 +08:00
我挺心疼楼主的,这下面回复有多少人是题目都没看明白的。这都什么人混迹于此啊?
AlphaTr
2019-02-15 10:03:46 +08:00
可以是可以,但将 base64encode 换为 escape 工作量是一样的,效果却更好;
rizon
2019-02-15 10:07:13 +08:00
参数占位符,sql 预编译就可以解决,注入只发生在 sql 编译时。
CRVV
2019-02-15 10:20:59 +08:00
@Greenm
把单引号替换成两个单引号确实不是好方案,但是楼主说了用的是 SQLite,这个做法是对的
SQLite 和 PostgreSQL 里,字符串里只有单引号是特殊字符,反斜杠只是反斜杠
beginor
2019-02-15 10:37:24 +08:00
进行参数化查询就那么难么?
missdeer
2019-02-15 10:40:51 +08:00
数据库存 base64 后的文本,之后搜索会麻烦一点吧
VxLzKg4uLbi32w60
2019-02-15 11:35:23 +08:00
@darktutu 所以你拿个方案啊,站着说话不腰疼么
unco020511
2019-02-15 12:29:42 +08:00
可以肯定可以啊,但是后期很多统计搜索之类的就功能就不好处理了吧
evilmiracle
2019-02-15 12:55:38 +08:00
预编译啊
darktutu
2019-02-15 13:11:31 +08:00
@a194259440 你腰已经断了
mostkia
2019-02-15 18:18:25 +08:00
已重写控制程序,目前使用 pdo 预处理解决注入问题,今天一点开就 40 多条回复,没想到那么讨论激烈。其实这个被疯狂吐槽的需求锅不应该由我来背。。。因为之前的数据库控制程序并不是我写的,项目做到一半由我接手的,现在想想的确挺蛋疼的,之前的控制程序直接是标准的 sqlite 接口,当然也有一些基本的字符串过滤,但感觉不太好,但也因为怕出 BUG 实在不想改数据库控制程序这部分,所以才想了一些投机取巧的方法。后来一想长痛不如短痛,索性都重写了,好在业务逻辑也不复杂,已经全部搞定了,感谢大家的意见。
iwtbauh
2019-02-16 11:36:17 +08:00
@Greenm #1
@CloudMx #2
@misaka19000 #3
@pimin #6

我以 mysql/mariadb 举例

mysql/mariadb 提供了一个叫 FROM_BASE64 的函数

我在拼接 SQL 的时候,后端把用户的输入都 base64 一下,然后套到这个函数里去,就成了这样

var = base64(${var})
..... WHERE `id` = FROM_BASE64(${var}) …

所有用户的输入都不可能破坏 sql 语句,并且,存到数据库里 /查询数据库的时候,还是原来的用户输入。

这是我以前用 bash 写个家庭内网自用程序的后端时,因为 bash 没法参数化查询,所做的防注入措施。

可见,base64 防注入十分可行
misaka19000
2019-02-16 11:53:17 +08:00
@iwtbauh #72 没说不可行啊,只是这个方法太民科了,缺点也很明显
iwtbauh
2019-02-16 12:38:42 +08:00
@misaka19000 #75

除了有点 dirty 之外。有什么明显缺点吗。
mostkia
2019-02-17 01:22:47 +08:00
@iwtbauh 74#受教了,以后有需要的情况下也有可行对策了,虽然有轮子用自然最好了的,pdo 也挺方便的。但多一个办法多一条路总归也是好的。

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

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

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

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

© 2021 V2EX