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