sqlalchemy 或者 底层 mysqldb 如何防止 sql 注入??

2014-12-29 15:40:35 +08:00
 1989922yan
8312 次点击
所在节点    Python
12 条回复
janxin
2014-12-29 16:26:52 +08:00
MySQLdb:

不要直接拼装SQL语句,比如:
cmd = "select tab where id='%s'" % id
curs.execute(cmd)

如果要拼装,参数一定要用MySQLdb.escape_string()过一下。当然,下面的写法更省事:

cmd = "select people set name=%s where id=%s"
curs.execute(cmd, (name, id))

sqlalchemy没用过,不清楚了,应该也是默认过滤的,只要你不直接传SQL进来
janxin
2014-12-29 16:27:56 +08:00
第二个SQL语句不对:
cmd = "select tab where id='%s'"
curs.execute(cmd, (id,))
010blue
2014-12-29 16:34:57 +08:00
底层 mysqldb防注入这个想法挺前卫的,可以在mysql数据库之前做一层mysql-proxy,通过这个来对接收的sql语句做一次检查过滤,当然还能顺便把读写给做了;如果再底层到mysql服务器的话,估计要写存储过程了,这个也是要改程序的
wingyiu
2014-12-29 17:12:20 +08:00
@janxin `cmd = "select tab where id='%s'"` => `cmd = "select tab where id=%s"`
MasterYoda
2014-12-30 10:26:10 +08:00
Prestatement会好一些。
1989922yan
2014-12-30 10:56:44 +08:00
@janxin
完美答案。谢谢。
1989922yan
2014-12-30 10:58:09 +08:00
@010blue
跟数据库交互的api,还是有很多需要注意的,还是需要多学习
1989922yan
2014-12-30 11:14:42 +08:00
@MasterYoda
刚刚查了查,了解了,java中有的概念,一直python感觉可以学习java很多框架经验啊
MasterYoda
2014-12-30 13:13:41 +08:00
@1989922yan
倒不算Java概念,可以叫绑定参数还是什么的。
MySQL本身支持而已,Prepared Statement http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html
各个语言的库基本都支持。
1989922yan
2014-12-30 14:26:48 +08:00
@MasterYoda
新技能。
我先看看。
THX:)
010blue
2015-01-06 14:08:40 +08:00
@1989922yan 对,解决安全问题的最佳方案还是在架构层面上,单纯依靠程序员的经验是容易出问题的
1989922yan
2015-01-06 15:50:53 +08:00
@010blue

扯大了。
只是说说sql注入,防范方法也就是那些。
架构也是程序员写的,架构师也都是写积累的。
大家接触的项目,真的跟12306一样大吗?
能出了问题让解决了才开心。

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

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

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

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

© 2021 V2EX