基于PHP的信息系统数据安全性分析与探讨

发布时间:2022-03-20 10:28:23   来源:作文大全    点击:   
字号:

摘要:随着信息化技术的推动和发展,信息系统安全日益重要,本文从信息系统数据合法性、MySQLi扩展的预处理机制、混淆式的密码算法等方面对信息系统数据安全性建设进行了分析及探讨。

Abstract: With the advancement and development of information technology, the security of information system is becoming more and more important. This paper analyzes the data security of information system from the aspects of information system data legitimacy, MySQLi extended preprocessing mechanism and confusing cryptographic algorithm.

关键词:PHP;数据安全;密码算法

Key words: PHP;data security;cryptographic algorithm

中图分类号:TP309.2 文献标识码:A 文章编号:1006-4311(2017)35-0153-02

0 引言

对于互联网企业,信息系统中承载着大量的数据,尤其是在线购物、网络银行等系统,对于安全性的要求非常严格。一旦出现安全漏洞,在严重情况下会导致数据泄露、篡改、窃取,造成系统瘫痪等问题,将会给企业带来不可估量的损失,所以说系统数据安全至关重要。接下来,本文将从以下几方面分析与探讨系统数据的安全性建设问题。

1 预防非法表单提交并验证数据合法性

任何软件通过HTTP协议都可以向Web服务器提交数据,可以更换表单中的控件,伪造另一个表单。假设域名为“http://”的服务器中有一个edit.php文件用于接收表单信息。原表单中有一组单选按钮,只能选择C#或PHP。如果编造一个HTML页面,把单选按钮替换为文本框,内容随意编写,并将表单提交给http:///edit.php,而服务器无法分辨真伪表单。要预防非法表单提交,比较好的方式是根据一个惟一的字符串或時间戳生成一个令牌,并将这个令牌放在会话变量和表单隐藏域中。提交表单之后,检查两个令牌是否匹配。如果不匹配,就知道有人伪造表单向Web服务器发送数据。简略代码如下。

$token = md5(uniqid(rand(), true));$_SESSION["token"]=$token;

再者Web表单利用浏览器限制了提交的内容,但无法限制服务器接收什么样的内容。因此,对于用户输入的内容,一定要验证数据的合法性。在对用户提交内容进行验证时,可以利用正则表达式实现复杂的验证规则。比如验证18位身份证号。在PHP中,可以使用preg_match()函数进行正则匹配,该函数的第1个参数表示正则表达式,第2个参数表示带匹配的字符串,返回值为匹配的次数。具体代码如下。

$id = $_POST["id"]; //接收身份证号

if(!preg_match("^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$", $id)){ echo "身份证号格式不符合要求";} //验证身份证号是否合法

通过preg_match()函数对身份证号进行验证,当函数返回的匹配次数为0时,表示输入的字符串不符合规则。

2 防御SQL注入

SQL注入是开发人员未对用户输入的数据进行过滤就拼接到SQL语句中执行,导致用户输入的一些特殊字符破坏了原有SQL语句的逻辑,造成数据被泄露、篡改、删除等危险的后果。比如下列代码就存在SQL注入问题。该代码将来自外部的name数据直接拼接到SQL语句中,如果用户输入了单引号,则会将原有SQL语句中的单引号闭合,然后用户就可以将自己输入的内容当成SQL执行。

$name = $_POST["name"];

$result=mysqli_query($link, "SELECT * FROM `admin` WHERE `name`="$name"");

假设用户输入“"or 1="1”,SQL语句将变为SELECT * FROM `admin` WHERE `name`="" or 1="1"。此时就会通过or条件查询出admin表中所有的记录,造成了数据的泄露。接下来改进上述代码,操作数据库使用了MySQLi扩展的预处理机制,将SQL语句和数据分离,从本质上避免了SQL注入问题的发生,同时也更加高效,简略代码如下。

$name = $_POST["name"]; //接收变量

$stmt = mysqli_prepare($link, "SELECT * FROM `admin` WHERE `name`=?");//创建 SQL 语句模板,预留的变量$name值使用参数 "?" 标记。

mysqli_stmt_bind_param($stmt, "s",$name);//将邦定的变量$name值传递给参数("?" 标记),s表明$name数据类型。

mysqli_stmt_execute($stmt);//执行预处理语句,应用可以多次执行语句,如果参数的值不一样。

$result = mysqli_stmt_get_result($stmt);//从预处理语句中获取结果集。

3 防御XSS攻击

XSS(Cross Site Scripting,跨站脚本攻击)产生的原因是将来自用户输入的数据未经过滤就拼接到HTML页面中,造成攻击者可以输入JavaScript代码来盗取系统用户的Cookie、破坏页面结构、重定向到其它网站等。由于Cookie在系统中承载着保存用户登录信息的作用,一旦Cookie被盗取,攻击者就得到了受害用户登录后的权限,造成一系列危险的后果。

在防御XSS攻击时,对于普通的文本数据,使用htmlspecialchars()是最好的方法。该函数可以转义字符串中的双引号、尖括号等特殊字符,但是默认情况下,单引号不会被转义。例如,以下代码存在XSS漏洞。

$name = htmlspecialchars($_POST["name"]);//接收来自用户输入的数据

echo "";//拼接到HTML中

上述代码中,由于用户可以输入单引号,因此可以通过单引号闭合原有的value属性,然后在后面可以添加事件属性如onclick,通过这种方式来注入JavaScript代码,如下所示。

假设用户输入“" onclick="alert(document.cookie)”,输出结果为:

上述代码被浏览器执行后,攻击者注入的JavaScript代码就会运行,这将威胁信息系统和用户的安全。由于XSS攻击的主要目的是盗取Cookie,因此可以为系统中最关键的PHPSESSID这个Cookie设置HttpOnly属性。通过该属性可以阻止JavaScript访问该Cookie。

4 数据安全存储

4.1 混淆密码算法

当信息系统因漏洞导致数据被泄漏时,管理人员往往无法在第一时间知道,一旦用户的密码遭到窃取,将造成难以挽回的损失。因此,在信息系统开发时,要加强密码存储的安全性,此时通常用到单项散列函数,比如md5,sha等。函数对密码进行摘要运算,用于校验两个数据是否相同。如md5函数运算后得到一个由32个字符组成的信息摘要,不同的数据产生的md5信息摘要不同。理论上,通过md5生成的字符串无法逆向获得原始数据。sha-1算法的安全性逐年降低,已被由安全强度更高的sha-2替代,sha-2系列包括sha-224、sha-256、sha-384和sha-512。其中,sha-256和sha-512分别生成256和512比特长度的hash字符串,都是比较常见的安全领域的hash应用。而sha-256比md5等更具安全性,也是sha系列算法最快的。

但隨着密码学研究的不断深入和计算机技术的快速发展,许多密码破解机构使用了彩虹表等技术运算并存储了海量字符串的md5运行结果,导致对密码直接进行MD5运行已经无法满足安全需求,此时可以采用混淆式的密码算法以提高破解难度。混淆式一是对密码进行加密存储时,首先对密码进行md5运算,对密码的运算结果再连接salt即盐值进行第二次或多次md5运算。另外,对密码进行存储时,通常会为不同的用户加不同的salt,从而进一步加强密码破解的难度。函数md5(CONCAT(md5(密码),盐值))两次运算结果连同佐料可以使INSERT INTO语句存储到数据库中。混淆式二是先启用混淆式一进行加密。接下来使用函数str_split()将密文按照字符分隔成数组,函数array_map(‘ord’,数组)将密文的每个字符转换成ASCII码值,然后使用函数hash("sha256",ASCII码值)对ASCII码值一一加密,最终生产2048个字符的密文。在登录时取出数据库中保存的密码和salt,然后对用户输入的密码按照salt调用如下的password()函数进行运算或再进行Hash函数运算,如果运算结果与数据库中保存的结果相同,则成功登录。混淆加密方式比较多,再比如如基于md5与base64的混合加密算法,以上这些加密算法都能增强采用彩虹表技术逆向破解的难度。

function password($password, $salt)

{return md5(md5($password).$salt);}

4.2 加密扩展库

md5()的功能方面存在一定的限制,PHP加密扩展库Mcrypt、OpenSSL和Mhash则提供了更加全面的加密与解密方法。其中,Mcrypt扩展库提供了类型、算法及模式繁多的加解密功能。Mcrypt支持的数据加密模式MCRYPT_MODE_ECB适用于短小随机数据的加密,可以用这种模式来加密其它密钥。如要加密安全等级较高的重要文件,可选择MCRYPT_MODE_CBC加密模式。而MCRYPT_MODE_CFB模式对于每个单独的字节都进行加密,所以非常适用于针对字节流的加密。MCRYPT_MODE_NOFB由于采用了块操作算法,安全性更高。为了提高安全性,可以对密钥进行加密,如$key= hash("sha256", "thisis a secret key", true),这样生成256比特的密钥。此时再用Mcrypt的加密函数去加密数据。在解密时解密函数用到的算法、密钥以及加密模式等参数必须和加密函数一致,否则数据不会被还原,所以说mcrypt常用在对称加密中。openssl扩展使用openssl加密扩展包,封装了多个用于加密解密相关的PHP函数,极大地方便了对数据的加密解密,OpenSSL常用在非对称加密中。非对称加密的核心思想是使用一对相对的密钥,分为公钥和私钥,私钥自己安全保存,而将公钥公开。如果用公钥对数据进行加密,只有用对应的私钥才能解密。如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。非对称加密克服了对称加密中密钥的保管问题,因为对称加密中消息发送方和接收方任意一方的密钥丢失,都会导致信息传输变得不安全。Mhash是基于离散数学原理的不可逆向的php加密方式扩展库,支持MD5、SHA、CRC32等多种散列算法,可以通过mhash()函数、mhash_keygen_s2k()函数创建信息摘要和校验值。

5 结束语

信息系统建设面临着不少的安全隐患,其安全性建设是一个全方位长期不断完善的过程,本文从非法表单提交的角度出发,对系统数据的安全性进行分析与探讨,以期能给用户提供一些便利。

参考文献:

[1]巩明.基于PHP实现数据安全性的方法及比较[J].通讯世界,2015(05).

[2]刘家栋.PHP网站常见安全漏洞及防范措施[J].计算机与网络,2016(Z1).

[3]焦显伟,闫品.基于PHP招生管理信息系统[J].价值工程,2016(29).