SQL防注入全攻略

SQL注入大家都不陌生,防范起来也比较容易,但是经常得不到开发者的重视,可能是没有意识到其危害?

我随便举个栗子。。

假设成功注入你的数据库,那么就得到了你的数据,进而进入到网站后台,如果有上传文件的入口,那么我就能很方便的挂上一个木马。即使没有上传文件的入口,我也能在你的模板中加上简单的一句代码eval($_POST[‘hack’]);来执行任意恶意代码,这就是一个webshell。窃取篡改你的数据,格你的盘,提权拿到服务器 的system/root权限…..赤裸裸不忍直视

这是我服务器一年来收到的攻击,绝大多是是sql注入。。可见sql防注入是非常有必要的

QQ截图20170509213059

我只说一下思路,具体实现网上有很多可以参考

一、过滤非法字符

过滤一定要在后台,前台过滤只能防君子。虽然是废话就怕有人偷懒

好多人认为把引号转义,就可以杜绝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.限制相应服务的权限,防止服务器进一步沦陷

发表评论

[/0o0] [..^v^..] [0_0] [T.T] [=3-❤] [❤.❤] [^v^] [-.0] [!- -] [=x=] [→_→] [><] 更多 »
昵称

抢沙发~