SQL注入大家都不陌生,防范起来也比较容易,但是经常得不到开发者的重视,可能是没有意识到其危害?
我随便举个栗子。。
假设成功注入你的数据库,那么就得到了你的数据,进而进入到网站后台,如果有上传文件的入口,那么我就能很方便的挂上一个木马。即使没有上传文件的入口,我也能在你的模板中加上简单的一句代码eval($_POST[‘hack’]);来执行任意恶意代码,这就是一个webshell。窃取篡改你的数据,格你的盘,提权拿到服务器 的system/root权限…..赤裸裸不忍直视
这是我服务器一年来收到的攻击,绝大多是是sql注入。。可见sql防注入是非常有必要的
我只说一下思路,具体实现网上有很多可以参考
一、过滤非法字符
过滤一定要在后台,前台过滤只能防君子。虽然是废话就怕有人偷懒
好多人认为把引号转义,就可以杜绝sql注入了。
但是这样是远不够的。
比如:
$id = $_GET[‘id’]
select * from user where id = $id
这时根本不需要引号即可注入。
所以在sql语句中即使是数值型字段,也最好加上引号,或者直接过滤掉sql关键字
|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|
也可以使用正则匹配,网上可以搜到。
二、预编译SQL语句
使用预编译SQL语句非常安全,从根本上杜绝了sql注入,同时还提高了性能
php:mysqli就提供了预编译功能,可参考:http://blog.csdn.net/dai_jing/article/details/45271673
java:使用PreparedStatement即可。如果是使用Hibernate框架的话,不要拼接hql和sql,除非过滤做的很好,用参数绑定可以避免注入漏洞。
python:python就很方便了,execute(sql, args)函数本身就可以防注入,会自动过滤掉args中的非法字符。注意不是execute(sql)
三、使用数据库的存储过程
不光可以防注入,还能防止非数据库的开发人员了解到数据库的结构,当然还可以提高性能。缺点就是比较麻烦,代码维护起来不方便,因为看不到存储过程的代码。
四、做好服务器的安全工作
1.在正式环境中不要提示任何错误信息
2.口令要设置的足够复杂(我博客就被暴力破解了密码还被挂了马…哭唧唧)
3.使用比较靠谱的服务器
五、做好已经被注入后的保护措施
若不幸被hack突破最后一道防线,保护好重要的数据也是很必要的。
1.必须要对重要的数据进行加密。据我所知CSDN和百度的密码都是明文存放的。。所以才会有之前CSDN密码泄漏事件
密码使用非对称加密即可,虽然md5有几率被破解,但是加盐后还是很安全的。比如base64加密再md5加密一下,或者md5(md5(salt)+md5(password))这种形式,
2.定期备份数据库
3.限制相应服务的权限,防止服务器进一步沦陷
发表评论
抢沙发~