浅谈女站长12年建站风险经验,让您的网站更安全
浅谈女站长12年建站风险经验,让您的网站更安全
我想写这个文章,告诉一些开始学习写程序的人,怎么让他的代码更安全。
从我写ASP到现在,大约有12年了,我写ASP的时候,那时用 WIN NT 4.0环境,安全性很不好,在地址后加几个特殊字符
,就可以看到ASP的源代码了, 后来,在多年写ASP的过程中,碰到无数的黑客试图黑我作的网站,花样百出,因此我一直特别
注重程序的安全性。
现在为止,很久没有写ASP了,改为用c#写 ASP.NET,不可否认,ASP.NET由于结构的关系,确实容易比ASP做得更安全,
但是,在ASP中几乎所有潜在的安全危险,在ASP.NET中几乎都存在,好处是ASP.NET源代码不开放,因此,黑客不太容易琢磨你
这个系统的代码后,作很有针对性的攻击。
实际上,我认为,不管ASP,ASP.NET,PHP,JSP,甚至是C/S结构的程序,都可能面临两个主要的共同的安全威胁:
1. 注入SQL。
2. 上传木马。
而对网站程序,或是所有B/S结构的程序的开发者而言,他们要作的,主要就是防这两项,其它的都是小问题了,这两个搞定,
网站一般就不那么容易被黑了。
1. 注入SQL,我们先看看什么是SQL注入,就是想办法提交一个特殊的字符串,改变你的SQL语句,让其变成其它的意思,
达到黑客的目的,我举个非常简单例子, 比如,我要验证一个用户的用户名和密码,如果找到了这个用户,就让他登录,很多
入门的人,会写这么一个SQL语句:
SELECT * FROM USERS WHERE UserName='ADMIN' and PassWord ='123456'
这个语句看起来没问题,从用户输入的文本框中,得到用户名和密码,然后用他们来组装SQL语句,如果找到这个记录,说明用户
名和密码正确,让他登录,如果找不到,说明错误,不让他登录,这看起来很完美,但实际上,这个语句完全没有安全性,如果
用户在密码那里, 输入一个 ' or 1=1 ,这样一样,我们看这个语句成了什么呢?
SELECT * FROM USERS WHERE UserName='ADMIN' and PassWord ='' or 1=1
好了, 这样他就能以ADMINA的身份登录了,我们再想一下,如果这个黑客,他多花点心思,就可以写入一些修改数据库,罗
列数据,破坏数据的语句,这就是SQL注入。
那怎么注入SQL语句呢?
方法很多,最简单的, 比如我们看很多网站,都有这样的地址,比如: 这
样的地址。这里我们要用 menuid 这个参数,往SQL语句中传值,于是这成了一个注入的入口,这是最简单的。
还有一种,很多网页上,都要填写表单,比如作站内搜索,我们知道这个文本框提交之后,也会用来组装SQL语句,这也
成了注入的切入点。
第三种,用COOKIES,很多用站点,他会用一些COOKIES来保存一些用户数据,比如让用户不掉线,过了SESSION的有效期
后,用COOKIES中的数据登录一次,用户看起来就不会掉线了。但这个COOKIES是可能被有的软件改写的,于是成了SQL注入的来
源。
如何防止SQL注入?
从上面,我们看到,凡是SQL注入,黑客必然会想办法提交一些特殊的字符串给我们的程序,组装出一个异常的SQL字符串,
那么,实际上要仿SQL注入,本质上,就是要对客户端提交的数据小心在意,我们可以用下面的办法让黑客的招数失效。
第一, 过滤,所以要用来组装SQL语句,并且这数据的来源是是从客户端的来字符串,我们都对它进行过滤,把一些危
险可能用来注入SQL但实际上并不常用字符串过滤掉,比如单引号,大于号,小于号,等于号,空格之类,把这些过滤之后,黑
客就没法组装出正确的SQL语句,程序执行到那里就会出错。 它就不能得逞了。
第二,严谨规范的语句,这主要是写 Request 时要小心。很多人,不管读COOKIES, GET提交的数据,POST 提交的数
据, 统统用一个 Request 来解决, 这个是很危险的。这是怎么回事呢?有一次,我发现我写的程序,被人注入了,因为每
个语句去写过滤的代码太累了,所以我就在程序的前面,写了一个遍历所有GET,POST提交的数据的程序,只要发现这里面有非法
字符,就过滤掉,按理说应该很安全呀,结果后来,我发现我的程序,所有获取数据时,都是写的Request[“A”],这样的代码
,没有区别,结果黑客就自己假造了一个COOKIES,利用COOKIES比较优先,从而绕过了我的过滤,成功的注入SQL, 从此之后,
我就认真的成: Request.Form;Request.QueryString;Request.Cookies;
第三,用存储过程,有时,我们会碰到一些不能过滤,但又要用来作查询条件的东西,这时怎么办呢?用存储过程,把这
些本来要用来组装SQL语句的字符串,变成存储过程的参数,在存储过程中查询,这样,就避免了组装SQL语句,不给黑客机会。
但也要注意,有一次,我看到一个程序员作的程序,他说他用了存储过程,还是被黑了,怎么回事呢?我看看, 发现这人,好
家伙,他把参数传进去,在存储过程中过程中组装成一个 SQL字符串,再 EXEC 执行他, 晕呀。
我前面写过一些我的经验,有朋友说要源代码,其实,我觉得了解方法是最重要的,道理懂了,那几个代码,还不是很容
易的事?你不懂道理,拿到代码又有何用?所以,我注重于介绍初学者一些方法,一些思路,而不是给一堆代码了事。
今天 先写这些,其它的安全方面的问题,我有时间接着写,如果有兴趣的朋友, 可以到
耐思尼克和我交流,我是耐思尼克虚拟主机SQL数据库这个CMS系统的作者,还需要大家多支持。http://www.iisp.com/vhost/ahosting.php?s=lily