网络安全基础知识!

SQL注入

一种代码注入技术,通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串。

  • 最终达到欺骗服务器执行恶意的SQL命令。

SQL注入攻击者通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,传入后端的SQL服务器执行。

  • 结果是可以执行恶意攻击者设计的任意SQL命令。

例如,Web应用程序具有以下登录页面:

1
2
User Name: admin
Password: 1234

攻击者在密码框中输入:

1
'1234 ' or '1'='1

之后构造的SQL查询为:

1
SELECT * FROM users WHERE name='admin' AND password='1234 ' or '1'='1';

由于’或’1’=’1 总是为真,所以可以绕过密码验证登录系统。

如何防止SQL注入:

SQL注入可以通过多种方式进行防范,如使用参数化的SQL语句、输入验证和过滤等方法。

PreparedStatement防止SQL注入:

PreparedStatement会先将SQL语句发送到数据库进行预编译,之后再将参数值单独传递,从而避免了SQL语句拼接的过程。

Mybatis中#{}防止SQL注入:

在MyBatis中,可以使用#{}来防止SQL注入。

  • #{}是MyBatis提供的PreparedStatement的参数占位符。

  • MyBatis会自动将#{}替换为? ,并且对用户传入的参数自动进行Escape处理,以防止SQL注入。

对请求参数的敏感词汇进行过滤:

对用户请求参数中的敏感词汇进行过滤,可以防止多种注入攻击,包括SQL注入、XSS等。

Nginx反向代理防止SQL注入:

可以使用nginx的ngx_http_rewrite_module模块,在server区域加入过滤规则,对请求参数中敏感字符进行过滤或拦截。

WAF功能

  • 启用nginx的Web应用防火墙功能,对疑似SQL注入的请求进行拦截,如检测特殊字符,语句规则等。

访问控制:

  • 通过nginx的access模,禁止某些IP地址或子网段访问,限制请求频率,以防止滥用。

隐藏数据库结构信息

  • 基于请求中的User-Agent等信息,显示不同的错误页面,避免泄露数据库元信息。

连接数据库的用户权限控制

  • 只允许访问应用需要的最小权限集。
1
2
3
if ($args ~* "select|insert|update|delete|drop|exec") {
return 403;
}

XSS

Cross-Site Scripting(跨站脚本攻击),简称XSS,是一种代码注入攻击。

攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。

利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全。

防御XSS攻击的方法:

输入过滤:

  • 一般是用于对于输入格式的检查,例如:邮箱,电话号码,用户名,密码……等,按照规定的格式输入。

转义HTML:

  • 如果拼接 HTML 是必要的,就需要对于引号,尖括号,斜杠进行转义。

CSRF

CSRF(跨站请求伪造),是一种挟持用户在当前已登陆的Web应用程序上执行非本意的操作的攻击方法。

CSRF攻击流程:

攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。

利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

这样攻击者盗用了用户的身份,以用户的名义发送恶意请求,对服务器来说这个请求是完全合法的。

但是却完成了攻击者所期望的一个操作。

比如以用户的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。

防御CSRF的方法:

验证码:

  • 强制用户必须与应用进行交互,才能完成最终请求。

请求来源限制(Referer);

  • 不能保证 100% 有效,服务器并不是什么时候都能取到 Referer,而且低版本的浏览器存在伪造 Referer 的风险。

Token验证:

  • CSRF防御机制最合适的方案。

DOS

DOS(拒绝服务),一切能引起DOS行为的攻击都被称为DOS攻击。

该攻击的效果是使得计算机或网络无法提供正常的服务。

DOS攻击的原理:

首先攻击者向被攻击的服务器发送大量的虚假IP请求,被攻击者在收到请求后返回确认信息,等待攻击者进行确认。

由于攻击者发送的请求信息是虚假的,所以服务器接收不到返回的确认信息。

在一段时间内服务器会处与等待状态,而分配给这次请求的资源却被有被释放。

当被攻击者等待一定的时间后,会因连接超时而断开,这时攻击者在次发送新的虚假信息请求。

这样最终服务器资源被耗尽,直到瘫痪。

DDOS

分布式拒绝服务攻击,指的是攻击者控制多台主机同时向同一主机或网络发起DOS攻击。

DDOS究竟如何攻击?

目前最流行也是最好用的攻击方法就是使用SYN-Flood进行攻击,SYN-Flood也就是SYN洪水攻击。

SYN-Flood不会完成TCP三次握手的第三步,也就是不发送确认连接的信息给服务器。

  • 这样,服务器无法完成第三次握手,但服务器不会立即放弃。

  • 服务器会不停的重试并等待一定的时间后放弃这个未完成的连接(SYN Timeout),这段时间大约30秒-2分钟左右。

  • 一个服务器若是处理这些大量的半连接信息而消耗大量的系统资源和网络带宽。

    • 这样服务器就不会再有空余处理普通用户的正常请求。

减少DDOS的攻击方法:

限制同时打开的SYN半连接数目。

缩短SYN半连接的Time Out时间。

正确设置防火墙。

禁止对主机的非开放服务的访问。

限制特定IP地址的访问。

启用防火墙的防DDOS的属性。

严格限制对外开放的服务器的向外访问。

运行端口映射程序祸端口扫描程序,要认真检查特权端口和非特权端口。

数字签名

用户认证,用来验证用户身份,用来确保信息发布人的身份和信息的完整性。

数字签名过程:

  • 将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。
  • 将该报文摘要值用发送者的私人密钥加密即称数字签名,然后连同原报文和数字证书(包含公钥)一起发送给接收者。
  • 接收方收到数字签名后,用同样的HASH算法对报文计算摘要值,然后将数字签名用发送者的公钥进行解签。
  • 并与报文摘要值相比较,如相等则说明报文确实来自所称的发送者。

为了防止公钥在传输过程中被调包,需要证书中心(简称CA)为公钥做认证。

证书中心用自己的私钥,对公钥和一些相关信息一起加密,生成数字证书。

客户端用CA的公钥解开数字证书,从而确定公钥的真实性。