不管是做什么网站,安全是首先要考虑的,而且应该是非常重视网站的安全。以前我自己鼓捣东西的时候,老是想着能把这个项目做出来就行了。可是现在想想是一个非常大的错误,对于一个非常脆弱的系统,对于一个容不得一点错误的系统,是完全没必要做出来的,做出来能有什么用。
一个网站首先应该宽容用户无意间产生的失误(或者说是错误),再有就是能够防止用户的恶意攻击,还有就是做好系统地错误处理,防止暴漏不必要的信息,再就是对于错误的URL地址的处理(本不存在的URL地址,URL中传递的参数不正确,访问权限不足)。下面就简要的列举一下网站会受到什么样的威胁,然后应该怎么去防范。
1. 跨站脚本(XSS):向浏览器发送未经检查的用户提供的数据的结构。用户提供的数据的问题是它完全超出了你的控制,而且它非常容易伪造HTTP referrer的值和隐藏表单字段中的值。
所以,在处理表单时,仔细验证数据并使用“拒绝所有,允许少量”策略,也就是所谓的“黑名单”、“白名单”问题。黑名单就是把一些认为是危险的字符禁止,然后允许剩下的所有字符;白名单就是只接受我承认的字符,其他的一概拒绝。
相对来说,白名单比黑明白更好,因为我们在考虑黑名单时,总会或多或少的漏掉一些东西,而且我们并不能够会想象出恶意用户会采用什么样的方法来攻击系统;而对于白名单而言,比如注册用户名,我只允许用户名为英文字符和数字,其他的一概拒绝,这样就能防止一些恶意的用户名了。 还有就是发表博客,或者论坛的帖子时,如果允许HTML标签,可能就会破坏整个页面的布局。
2. 注入攻击:SQL注入可能是我们谈论的最多的网站攻击了。防御的方法很简单,就是将从用户处接收到的数据全部转义。
3. 恶意文件执行:允许执行没有驻留在服务器删的任何脚本将使攻击者执行服务器上的任意代码成为可能。这一攻击的后果包括未被察觉的从应用程序中的数据提取或者服务器的全部泄密。恶意文件执行攻击适用于带有文件名(全部或者部分)或者带有来自于用户的文件的任何系统。
4. 不安全的直接对象引用:一种形式就是修改URL地址中参数的值,想要获取其他本不属于自己的或本不存在的信息;还有就是利用在脚本内引用文件的形式来实现。第二种情况是什么意思呢,就是说我们通过传过来的URL参数来包含相应的文件,可是如果传递的参数是恶意的,就会包含意外的文件而受到攻击。
因此,我们在使用URL地址传递过来的参数时,也应当进行相应的检查。
记住——用户提交的信息并不仅限于URL和表单参数!应当检查以确保未经检查的cookie值、HTTP请求头和HTTP内容值也没有用在脚本中。
5. 跨站请求伪造(CSRF):此种类型的攻击未经许可强迫受害者在另一个站点执行一些行为。 为了保护表单的自动提交,可创建一个在每次浏览表单时都重新生成的随机令牌,它被放置于会话变量中并位于表单中的一个隐藏字段中。
提交表单时,脚本检查令牌和会话变量中的值的匹配情况,仅当表单从真实站点载入有效——如果请求来自于其他地方,页面将失效。
6. 信息泄露和错误处理不当:当脚本中有错误发生时,对攻击者游泳的信息可能会在错误信息中泄露。例如:
Warning:mysql_connect():Access denied for user '[email protected]'(usering password:YES)in var/www/index.php on line 12,此信息给潜在的攻击者提供了数据库服务器的名称、数据库名和用户名;类似的,输出不正确的SQL语句的错误信息给攻击者提供了一个小小的观察你数据库结构的机会。
所以,我们在网站正式上线后,应当禁止错误输出到浏览器而将错误信息记录到日志文件中。
7. 认证和会话挂历不完善:认证和会话管理不完善这个脆弱这处和对账户与会话数据保护的不充分紧密相关。如果在用户登录前劫持了会话,攻击者只需要等待用户登录就可以获取个人账户的全部控制权。
PHP提供了session_regenerate_id函数,它应在有特权级的任何改动之前使用。改动会话ID时,本质上它在维护会话数据。
因此在用户登录后,哪个人救火去了一个新的会话ID,被攻击者劫持的前面的任何会话都变得无效。还应坚持PHP自己的会阿虎和cookie管理函数——不要编写自己的脚本或者使用第三方的脚本。还可采取的措施包括确保站点退出登录功能完全销毁了会话数据,并在用户不活动一段时间后自动将用户退出登录。还建议不要以明文方式在email中发送口令,或者在屏幕上显示口令。
8. 不安全的密码存储:首先,就加密技术而言,不要改变自己的代码;第二。记住吐过正在使用一种打算要译码的算法加密数据,那么其他人也能够对其进行解密。
严格来说,MD5和SHA并不是加密算法(也就是说,不能解密一个MD5字符串来获取它的原始数据);它们是信息摘要算法。但是如果不需要界面一个值,使用SHA-256,它在PHP5.1.2中的hash函数中可用。如果此项不可选,可以选择稍低安全级别的MD5,可通过md5函数使用它。
9. 不安全的通信:使用明文发送敏感信息类型的数据部仅仅是坏习惯,它还是不可原谅的。例如,如果正在询问用户登录或者提供信用卡详细信息,或者应用程序导致您的服务器要和其他服务器会话,就应该使用SSL来确保通信的安全。
10. 限制URL访问失败:大多数应用程序会基于用户的特权级别来限制他们可用的链接。然而,很多应用程序的用户授权系统在那一点停止工作了,访问权限就会混乱。
要确保你的用户仅能看到他们能够使用的链接,但是也要确保在允许用户继续使用之前每个页面都要检查用户的特权级别。
其实,网站受到的攻击类型还有很多,上面仅仅是总结了常见的几种类型。 |