再谈安全 - SQL
不能放过任何细节,小错会变成大错,只要有一个小地方能撕开个口子,将会是非常大的安全隐患。
服务器上不要放一些没用的页面,能输出有用信息的,debug信息,不要显示异常信息给页面上(特别是那个asp.net的默认异常页面),显得太不专业。
数据库帐号,千万不要用root/sa帐号,针对每个应用/项目开帐号,严格控制权限(select/update...),只访问有需要库,注意mysql存储过程访问权限。
禁止其它ip访问数据库(仅允许web应用服务器访问或office临时需要但要限制ip)
版本,尽量用新一点的,但要稳定版本,与时俱进,比如.net framework4+, mysql5.5+,tornado4+
用户输入,要特别小心,特别是暴露在前端的,一个输入可能让系统毁掉,永远不要相信用户输入,所以合法性验证非常必要,知道你做的项目的重要性。
SQL注入,老生常谈,还在拼接SQL语句的,应该一律枪毙。任何语言里任何地方任何情况,都坚决不能出现以下写法
SELECT * FROM tblApps WHERE title ='"+q+"' LIMIT 10
必须使用参数化
MySqlCommand cmd = new MySqlCommand("SELECT * FROM tblApps WHERE title =?title LIMIT 10", con);
cmd.Parameters.Add("?title", MySqlDbType.VarChar, 50);
cmd.Parameters[0].Value = q;
cmd.Parameters.Add("?title", MySqlDbType.VarChar, 50);
cmd.Parameters[0].Value = q;
Python里的MySQLdb
cur.execute("SELECT t1,t2 FROM tbl WHERE p=%s limit %s,%s",(q,0,10))
-- 这本身就是参数化了,类似上面c#的
cur.execute(sqlstring,(parameters))
-- 这本身就是参数化了,类似上面c#的
cur.execute(sqlstring,(parameters))
浙公网安备 33010602011771号