开发网站,常见的网站安全问题有下面这些。
一、SQL注入。
它利用网站的漏洞,使用一些特别的SQL语句,执行具有破坏性的SQL语句。例如:
SELECT COUNT(*) FROM user WHERE username='cg' AND password='123456' OR 1=1'; (1-1)
当用户在登录页面填写username为cg,密码输入框填写123456' OR 1=1时,就产生了(1-1)中的SQL语句。它虽然提供的是错误的用户信息,却能够登录网站。
在PHP中,要防止SQL注入,使用mysql_real_escape_string($string)转义用于SQL语句中的字符串即可。mysql_escape_string($string)具有同样的作用,区别在于mysql_real_escape_string接受的是一个连接句柄、并且根据当前字符集转义字符串。
如果使用的是PDO之类的与mysql交互的方法,使用绑定参数即可避免SQL注入。
这些方法的实质,是将SQL语句中的特殊字符转义,避免它们破坏SQL语句构建新的具有破坏性的SQL语句。这些特殊字符主要是指单双引号。
二、XSS
XSS,中文名叫跨站脚本攻击。通过在网页中嵌入一段恶意JS脚本来实现攻击目的。
<form action="server.php" method="post">
<input type="text" name="content" />
<input type="submit" value="Submit" />
</form>
(2-1)
恶意用户在表单中输入下面内容:
<script type='text/javascript'>
alert('Hello,world!');
</script>
(2-2)
若处理表单提交的服务端代码server.php对用户输入原样接收,(2-2)代码会以合法的能执行的JS代码存储起来。当包含(2-2)代码的页面被打开的时候,这段JS代码就会执行。
这段JS代码无破坏性,仅仅演示了发起XSS攻击的最基本方法。
防范XSS攻击,只需对尖括号(<、>)、单双引号转义。
三、伪造脚本攻击
它也是利用JS进行攻击。举一个简单的例子。在伪造脚本攻击中,存在三个因素:恶意站点A,安全站点B,用户C。用户C访问安全站点B,并且登录。在没有退出登录的情况下,用户C访问了站点A。站点A提供了一链接
http://siteB.com?giveMoneyTo=1234567&money=10000 (3-1)
giveMoneyTo=1234567&money=10000表示向帐号123456转账10000。(3-1)可能会以被模糊处理后以正常URL出现。一旦用户C点击该链接,站点B会认为是用户C发出的合法转账请求,执行转账操作。
防范这种伪造攻击,在浏览器设置httponly,在站点需使用更安全的请求验证。
三、DDos
DDos,中文名叫分布式拒绝服务攻击。DDos,通过向目标网站发送大量的访问请求,远远超过目标网站能够承受的访问请求,导致目标网站瘫痪或拒绝服务。
发起攻击使用的流量,可以来自攻击者捕获的大量肉鸡(被害电脑),也可以来自大量的代理IP。
由于硬件技术的高度发展,旧的单纯依靠大流量拖垮目标网站的攻击方法已经难以凑效。目前流行的攻击方式分为三种。
(A)利用TCP/IP发起攻击。
这种攻击利用了TCP/IP协议,客户端和服务器三次握手的原理。
第一次握手:客户端向服务器发送请求。
第二次握手:服务器回应客户端请求,告诉客户端它已经接受请求、准备发送数据。
第三次握手:客户端向服务器发送数据,告知服务器它已经做好接收数据的准备。
在第三次握手中,攻击者控制客户端不回应服务器,服务器不断向这些未回应的客户端发送数据。随着不回应服务器的客户端越来越多,超出了服务器能够提供服务的客户端数目,新的正常的客户端请求不会得到回应。
(B)利用DNS解析发起攻击。
使用大量并不存在的域名向目标网站发起请求,DNS服务器会试图解析这些虚假域名,层层上报,直达全球那几台根DNS解析服务器。
(C)伪装正常用户干扰目标网站正常流程迫使目标网站误杀真正的正常用户发起攻击。
攻击者在电商网站下许多单后,迟迟不付款;超过订单锁定时间后,又下许多订单。这将会使网站的大量订单被锁定,正常用户无法下单。