
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 底层 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 @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 |