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