1
lilian57 2013-04-15 11:46:10 +08:00 1
简单说一下
1.首先要理解为什么能防止sql注入:参数化查询,sql能重用查询计划(有助于提高性能)。而表名是不能参数化查询的 2.如果你用的sql模块的paramstyle不是'format', 'pyformat',也就是你的sql 形式是"SELECT * FROM user_info WHERE email = ?" 之类的你会更好的理解代码为什么是这样的。 3.自定义表名的时候应该先拼接表名(因为表名是安全的),再参数化查询(用户输入条件不安全)。不建议转义或过滤特殊字符。 cursor.execute("SELECT * FROM %s WHERE email = ?" % user_info, youremail) 或者 cursor.execute("SELECT * FROM %s WHERE email = %%s" % user_info, youremail) |
2
alexrezit 2013-04-15 12:25:15 +08:00 1
之前也遇到过这个问题, 我来说一下吧: 表名都要自己过滤的, 包括其他语言例如 C 的也一样, 只能 bind 参数.
如果一定要用参数的话请去掉除去 a-Z, 0-9 之外的字符. ``` def scrub(table_name): return ''.join( chr for chr in table_name if chr.isalnum() ) scrub('); drop tables --') # returns 'droptables' ``` ref: http://stackoverflow.com/questions/3247183/variable-table-name-in-sqlite |
3
Livid MOD 如果用了一个 ORM 框架的话,大部分这类细节 ORM 框架会搞定的。
|
4
1ang 2013-04-16 16:24:59 +08:00 1
1. 如果你的SQL表名都是从HTML FORM里提交过来的话,说明这个设计已经不是很好了,想一下如何做的更好把
2. 如果一定要这样做的话,先自己过滤表名,只允许0-9a-zA-Z$_这些字符,然后 sql = "SELECT * FROM %s WHERE email = %%s" % tablename,最后再cursor.execute(sql, yourmail) 这个use case 大部分ORM也解决不了,自己做就好了。 |
5
nichan OP |
7
nichan OP @binux 嗯~base64不是,只是类似于base64。
不过即使是base64应该也很难被注入吧?加密后的字符只有a-z和0-9 |
8
1ang 2013-04-17 04:37:38 +08:00
所以你的这个应用总共会有多少个表?
|