关于Web开发安全是Web开发最基础的也是最容易忽略的。一旦忽视就很容造成很大的损失。
常见的Web安全方面主要是:
1. SQL Injection
2. XXS (cross-site scripting)
3. CSRF (cross-site request forgeries)
这是最常见的三种攻击手段。
SQL Injection
SQL攻击(英语:SQL injection),简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。 维基百科
避免方法
- 在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计数据库访问功能
- 在组合SQL字符串时,先针对传入的参数做字符取代(将单引号字符取代为连续两个单引号字符)。
- 其他,使用其他更加安全的方式连接数据库。
- 使用SQL防注入系统
额外说明
什么是参数化查询
参数化查询(Parameterized Query 或 Paramterized Statement) 是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数来给值,这个方法目前已被视为最有效可预防SQL注入攻击手法的防御方式。
除了安全因素外,相比拼接字符串的SQL语句,参数化的查询往往有性能优势。因为参数化的查询能让不同的数据通过参数到达数据库,从而公用同一条SQL语句。大多数数据库会缓存解析SQL语句产生的字节码而节省下重复解析的开销。如果采取凭借字符串的SQL语句,则会由于操作数据是SQL语句的一部分而非参数的一部分,而反复大量解释SQL语句产生不必要的开销。
原理
在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令编译后,才套用参数运行,因为就算参数中具有破坏性的指令,也不会被数据库所运行。
Mysql SQL指令撰写方法
set @c1 := xxx;
set @c2 := xxx;
set @c3 := xxx;
set @c4 := xxx;
UPDATE myTable SET c1 =@c2, c2= @c2, c3=@c3 WHERE c4=@c4
PHP中的写法
<?php
//PDO 参数化查询
// 实例化数据库抽象层对象
$db = new PDO('pgsql:host=127.0.0.1;port=5432;dbname=testdb');
// 对SQL语句执行prepare, 得到PDOStatement对象
$conn = $db->prepare('SELECT * FROM "myTable" WHERE "id" =:id AND "id_valid"= :is_valid ');
// 绑定参数
$conn->bindValue(':id',$id);
$conn->bindValue(':is_valid',true);
// 查询
$conn->execute();
// 获取数据
foreach($conn as $row){
var_dump($row);
}
<?php
//MySQL 特定驱动
$db = new mysqli("locahost","user",'password','database');
$conn = $db->prepare("SELECT priv FROM MyTabel WHERE username=? AND password=?");
$conn->bind_param("ss",$user,$pass);
$stmt->execute();
XXS
XSS 是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页的时候就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
常见的XSS的攻击手段和目的有:
1. 盗用cookie,获取敏感信息
2. 利用植入Flash,通过Crossdomain权限设置进一步获取更高权限;
3. 利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作。
4. 利用可被攻击的域受到其他域信任的特点,以受信任来源请求一些平时不允许的操作,如进行不当的投票活动。
5. 在访问量极大的一些页面上的XSS可以攻击一些小型网站,实现DDos攻击的效果。
漏洞的防御和利用
过滤特殊字符
避免XSS的方法之一主要就是将用户所提交的内容进行过滤,许多语言都有提供对HTML过滤 :
- PHP的htmlentities或是htmlspecialchars()
- Python 的cgi.escape()
- Java的xssprotec
- Node.js 的 node-validator
备注: php中htmlentities和htmlspecialchars()的用法
htmlentities是将html需要转义的部分全部进行转义(包括中文等,因因此如果不指定编码格式,容易出现乱码),而htmlspecialchars只会针对预定义的特殊字符。
为什么使用htmlentities和htmlspecialchars对html进行转义,能够阻止xss攻击呢?
因为这两个函数对常见的标签中的特殊字符串进行了转义。这样浏览器解析html页面的时候,是不会识别经过转义的html标签的,只会当成字符串输出结果。从而有效的阻止了xss攻击。
CSRF
跨站请求伪造(Cross-Site Request Forgery,也被称为 one-click-attack或者session riding),通常缩写为CSRF或者XSRF,是一种挟持用户在当前已登录Web应用程序上执行非本意的操作的攻击方法。和XSS相比,XSS利用的是用户对网页的信任,而CSRF利用的是网站对用户网页浏览器的信任。
攻击细节
跨站请求攻击,是攻击者通过一些技术手段欺骗用户的浏览器去访问一个自己曾经认证过的网站并执行一些操作(比如发邮件,发消息,甚至财产操作比如转账和购买商品),由于浏览器曾经认证过,所以被访问的网站会认为是真正的用户操作而去执行。这利用web中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的
列子
假如一家银行用以执行转账操作的URL地址如下: http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
那么,一个恶意攻击者可以在另一个网站上放置如下代码:
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">如果有账户名为Alice的用户访问了恶意站点,而她之前刚访问过银行不久,登录信息尚未过期,那么她就会损失1000资金。
这种恶意的网址可以有很多种形式,藏身于网页中的许多地方。此外,攻击者也不需要控制放置恶意网址的网站。例如他可以将这种地址藏在论坛,博客等任何用户生成内容的网站中。这意味着如果服务器端没有合适的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。
透过例子能够看出,攻击者并不能通过CSRF攻击来直接获取用户的账户控制权,也不能直接窃取用户的任何信息。他们能做到的,是欺骗用户浏览器,让其以用户的名义执行操作。
防御措施
检查Referer字段
HTTP头中有一个Referer字段,这个字段用以标明请求来源于哪个网址。在处理敏感数据请求时,通常来说,Referer字段应和请求的地址位于同一域名下。如果时CSRF攻击传过来的请求,Referer字段会包含恶意网址请求。这种方法简单易行,工作量低,仅需要在关键访问处添加一步效检。但是也有其局限性。因为这种办法完全依赖浏览器发送正确的Referer字段。虽然HTTP协议对此字段有明确的规定,但是并无法保证来访的浏览器的具体实现,亦没有保证浏览器没有安全漏洞影响到此字段。
添加token效检
由于CSRF的本质在于欺骗用户去访问自己设置的地址,所以在要求敏感数据请求时,要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为效检,那攻击者就无法再执行csrf攻击。这种数据通常时表单的一个数据项。服务器将其生成并附加在表单中,其内容时一个伪乱数。当客户端通过表单提交请求时,这个伪乱数也一并提交上去以供效检。正常访问时,客户端浏览器能够正确得到并传回这个伪乱数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪乱数的值,服务器端就因为效检token的值为空或者错误,拒绝这个可疑请求。
以上就是常见的一些web安全基础知识。
本文介绍了Web开发中的三大常见安全威胁:SQL Injection、XXS和CSRF。SQL Injection防范方法包括使用参数化查询和过滤特殊字符。XXS攻击可以通过过滤特殊字符来防御。对于CSRF,可以通过检查Referer字段或添加token效检来防止攻击。了解这些基础知识对于确保Web应用安全至关重要。

588

被折叠的 条评论
为什么被折叠?



