admin

PHP安全:保障内容安全

admin 安全防护 2022-11-24 400浏览 0

PHP安全:保障内容安全

除了Web系统本身不要出现漏洞而被攻击者利用外,还需要将内容数据安全地送达给用户,并且用户安全地接收内容数据。防止在传输过程中内容被篡改,防止用户提交非法内容,确保接收的内容是系统可接收的。

1、不安全的HTTP传输

HTTP传输的数据都是未加密的,也就是明文,因此在传输过程中,随时可能被截获,客户端与服务器之间没有任何身份确认的过程,数据全部明文传输,所以很容易遭到攻击,因此使用HTTP传输隐私信息非常不安全。

图1是普通HTTP的传输,HTTP传输面临以下风险。

(1)窃听风险:攻击者可以获取所有通信内容。

(2)篡改风险:攻击者可以修改所有通信内容。

(3)冒充风险:攻击者以冒充他人身份参与通信。

PHP安全:保障内容安全

图1 HTTP被拦截

为了防止上述现象的发生,研发人员对传输的信息进行对称加密。如图2中所展示的,即使攻击者截获传输的信息,也无法破解。

PHP安全:保障内容安全

图2 对称加密

使用对称加密,双方拥有相同的密钥,信息得到安全传输,但此种方式有以下缺点。

(1)不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高。

(2)因每个客户端、服务器的安全级别不同,所以密钥极易泄露。

为了防止对称加密中的密钥泄露,如图3所示,使用非对称加密客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然。但这个过程也存在缺点,公钥是公开的(也就是攻击者也会有公钥),所以服务端私钥加密的信息,如果被恶意攻击者截获,攻击者可以使用公钥行解密,获取其中的内容。

PHP安全:保障内容安全

图3 非对称加密

为了兼顾性能和安全问题,人们将对称加密、非对称加密两者结合起来,发挥两者各自的优势。图4展示的是混合加密。

PHP安全:保障内容安全

图4 混合加密

客户端使用公钥加密对称密钥,服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,后续两者之间信息的传输便可使用对称加密的方式。

但是还存在以下问题。

(1)客户端获得的公钥无法确定是真实的还是攻击者伪造的。

(2)无法确认服务器是真实的而不是攻击者的。

因此传输过程还是存在被劫持可能性,如图5所示。

PHP安全:保障内容安全

图5 加密传输被劫持

2、HTTPS传输更安全

为了保证这些隐私数据能加密传输,Netscape(网景)公司设计了安全套接层(Secure Sockets Layer,SSL)协议用于对HTTP传输的数据进行加密,从而诞生了HTTPS。

HTTPS能够加密信息,可防止数据信息在传输过程中被第三方窃取、修改,确保数据的完整性,所以很多银行网站或电子邮箱等安全级别较高的服务采用了HTTPS。随着安全意识的提高,目前主流网站陆续在使用HTTPS。

图6展示了HTTPS的请求过程,客户端在接收到服务端发来的SSL证书时,会对证书的真伪进行校验。下面以浏览器为例进行说明。

PHP安全:保障内容安全

图6 HTTPS请求过程

(1)浏览器读取证书中的证书所有者、有效期等信息并进行一一校验。

(2)浏览器开始查找操作系统中已内置的受信任的证书发布机构CA,与服务器发来的证书中的颁发者CA比对,用于校验证书是否为合法机构颁发。

(3)如果找不到,浏览器就会报错,说明服务器发来的证书是不可信任的。

(4)如果找到,浏览器就会从操作系统中取出颁发者CA的公钥,然后对服务器发来的证书里的签名进行解密。

(5)浏览器使用相同的散列算法计算出服务器发来的证书的散列值,将这个计算的散列值与证书中签名进行对比。

(6)如果对比结果一致,则证明服务器发来的证书合法,没有被冒充。

(7)此时浏览器就可以读取证书中的公钥,用于后续加密。

通过发送SSL证书的形式,既解决了公钥获取问题,又解决了攻击者冒充问题,所以相比HTTP,HTTPS传输更加安全。

(1)所有信息都是加密传播的,攻击者无法窃听。

(2)具有校验机制,一旦被篡改,通信双方都会立刻发现。

(3)配备身份证书,防止身份被冒充。

相比HTTP,HTTPS增加了很多握手、加密解密等流程,虽然过程很复杂,但可以保证数据传输的安全。在这个互联网膨胀的时代,其中隐藏着各种看不见的危机,为了保证数据的安全,维护网络定,建议使用HTTPS。

3、防止盗链

盗链是指网站拥有者自己不对资源进行存储,而是通过技术手段盗取其他网站服务商的内容资源直接在自己的网站上进行展示,骗取最终用户的浏览和点击。盗取的内容主要是图片、视频以及其他资源下载文件。网站盗链会大量消耗被盗链网站的带宽和系统资源,从而增加服务器的负担,损害企业的利益,同时给企业形象造成负面影响。

为了防止服务器资源被盗取,通常可以检测访问源的Referer来进行过滤,如在Nginx中配置Referer检查,检查Referer是否是在指定的域名来源中,如www.ptpress.com.cn、ptpress.com.cn,防止jpg|gif|png|swf|flv|wma|wmv|mp3|zip|rar这些静态资源被第三方引用。如果没有通过检测,则直接返回“404资源无法找到”。

location~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|mp3|zip|rar)${
valid_referersnoneblockedwww.ptpress.com.cnptpress.com.cn;
if($invalid_referer){
return404;
break;
}
access_logoff;
}

如果是使用Apache作为Web服务器,可以直接在.htaccess中进行配置,设置方式如下。

RewriteEngineon
RewriteCond%{HTTP_REFERER}!^$[NC]
RewriteCond%{HTTP_REFERER}!ptpress.com.cn[NC]
RewriteCond%{HTTP_REFERER}!www.ptpress.com.cn[NC]
RewriteRule.*\.(jpg|gif|png|swf|flv|wma|wmv|mp3|zip|rar)$http://www.ptpress.com.cn/[R,NC,L]

如果是一些动态资源,则可以使用PHP检查Referer白名单的方式以防止盗链。

<?php
$whiteList=array("www.ptpress.com.cn","ptpress.com.cn");
$referer=$_SERVER['HTTP_REFERER'];
$parseResult=parse_url($referer);//解析URL
$host=$parseResult['host'];//获取referer中的域名
if(!in_array($host,$whiteList));{
die('防止非法盗链');
}

4、敏感词

每一个系统都应该保证接收和传输到用户端的内容是合法健康的,所以需要建立有效的过滤或安全限制机制。其中,涉及“政治”“毒品”“色情”“武器”“暴力”“恐怖”“广告”“业务违规”等内容的,一定要进行过滤并禁止传输或接收,以防止被攻击者和不法分子用于广告宣传、言论攻击等。

通常的做法是建立敏感词词库,当用户提交内容后,对内容进行分词处理,将分词后的数据与敏感词库中的数据一一对比。一旦命中,就禁止用户提交。

图7展示了系统在检测到敏感词,拒绝用户提交数据的过程。

PHP安全:保障内容安全

图7 检测到敏感词

只有检测后的内容不包括敏感词,才允许对用户的内容进行保存。图8中展示了系统未检测到敏感词,用户可顺利提交数据的过程。

PHP安全:保障内容安全

图8 未检测到敏感词

继续浏览有关 安全 的文章
发表评论