欢迎来到学术参考网

基于PHP环境开发安全Web程序

发布时间:2016-06-30 14:17

  Web程序安全备受世人关注,但安全性涉及到程序的开发设计、运营等各方面。论文利用PHP语言,从SQL注入、客户端脚本注入和Session安全等方面,深入探讨了在程序设计方面如何有针对性地增强计算机网络安全防护能力。

 

  1 引言

 

  安全性在网络环境中一直备受人们重视,但这个世界矛和盾的竞争始终没有停止过,入侵与反入侵每天也在上演。那么如何才能避免自己的Web程序免遭、或者少遭受一些攻击从而把潜在的损失降到最低,是摆在每个Web程序设计人员面前的一道不得不面对的课题。

 

  2 开发安全的Web程序

 

  2.1 过滤输入的数据

 

  2.1.1防范攻击类型:脚本注入和SQL注入攻击

 

  在设计网页时,程序开发者应考虑到用户在网页表单中可能会输入任意形式的字符串,更有甚者,黑客可能会提交恶意代码,从而造成恶劣后果。例如在Web网页留言板中,会让用户填写留言信息并提交,此时如果输入以下代码而没有进行敏感字符相应过滤,则当浏览这条消息后页面会马上跳转:

 

  开个小玩笑

 

  假如跳转后的页面加载了病毒或者木马,那么使用者很可能会遭受攻击。

 

  动态网站都采用数据库技术,如果没有对SQL语句进行仔细检查和处理,黑客很可能利用在客户端网页中输入数据的功能。如在会员登录页面中输入某些关键字和字符串,组合成能够操纵数据库的语句,从而对网站造成破坏或者入侵。

 

  2.1.2防范方法:过滤输入数据

 

  (1)数字数据的过滤。在Web程序中,使用GETPOSTCookie传递参数,最后一定是字符串的形式,若这些参数是整数但使用字符串来传递,不但没有效率而且非常危险。如果可以确定输入的数据一定是数字,则可以使用数据类型转换的方式将输入的数据强制转换成数字格式,从而堵塞恶意代码的提交和执行。

 基于PHP环境开发安全Web程序

  方法一:用数据类型进行强制转换。

 

  if(!empty($_GET["id"]) )

 

  { $id = (int) $_GET["id"]; // $id = (float) $_GET["id"];}

 

  方法二:使用intvalfloatval函数转换。

 

  $id = intval($_GET["id"]); 或者 $id = floatval($_GET["id"])

 

  (2)字符串数据的过滤。字符串在程序中非常常见,所以对其处理也就更加重要。PHP提供了以ctype_开头的一系列函数来验证字符串内容,如ctype_alnum用来检查是否包含字母或者数字、ctype_alpha用来检查是否只包含字母、ctype_digit用来检查是否只包含数字等,可以灵活运用这些函数验证字符串是否合法。

 

  示例代码如下:

 

  if(!ctype_alnum($_GET["username"]) ) //检查用户名是否为数字和字母组成。

 

  2.2 HTMLPHP标签的过滤

 

  2.2.1防范攻击类型:客户端脚本植入攻击

 

  (1)客户端脚本攻击(Script Insertion)是指将可以执行的脚本插入到表单、图片、动画、超链接文字等对象中,当用户打开这些对象后,植入的脚本就会被执行。可以用作脚本植入攻击的HTML标签主要有几个。

 

  会弹出一个令人莫名其妙的对话框,那么在脚本中植入

 

  可能就不仅仅是一个小玩笑了,它会让运行这句代码的人的计算机不断的打开新网页窗口,直到耗尽计算机内存,此时只有重启计算机才能制止新网页的不断打开。如果黑客要进行更严重的攻击,可能会使用的方式,使页面自动跳转到黑客指定的可能有病毒的网站。

 

  2.2.2防范方法:输出到页面的数据过滤

 

  防范客户端脚本植入攻击在PHP环境中有两种方法。

 

  (1)使用strip_tags函数删除字符串中的HTMLPHP标签。strip_tags函数会返回过滤HTMLPHP标签后的字符串,将从数据库中读取出来的记录首先用strip_tags进行过滤后再输出到网页,代码如下:

 

  echo "留 言:" .strip_tags($_POST["question"]). "

 

  "

 

  如此,从$_POST["question"]传来的数据就会被处理成字符串,而不再是Javascript代码了。

 

  (2)使用htmlspecialchars函数将特殊字符转换成HTML编码。strip_tags函数有一定缺陷,会在没有HTMLPHP标签的情况下失效,例如将aa” onmouseover=”alert(‘又来了!’);”提交给标签,则在客户端会生成

 

  如此当鼠标指针经过该文本框区域时,就会出现一个对话框,由此可见strip_tags函数并不能完全过滤有危险的程序代码。htmlspecialchars函数便成了删除插入脚本的最佳方法,因为该函数可以将英文的单引号、双引号、大于号、小于号等字符转变成HTML字符串,从而避免这些特殊符号对程序的影响。例如,将上述语句改为:

 

  “" />

 

  如果$_POST["question"]的值依然为aa” onmouseover=”alert(‘又来了!’);,则其中的英文双引号被替换为“";”,单引号被替换成”';”,那么文本框中的value属性值为:

 

  ,如此,双引号与单引号都被替换成普通字符串,从而避免了从客户端的植入攻击。

 

  2.3 Session的安全

 

  2.3.1防范攻击类型:会话劫持攻击

 

  服务器与客户端之间是通过Session来连接沟通的,当客户端的浏览器连接到服务器后,服务器会建立一个独立的、属于该用户的Session并由服务器维护。每个用户的Session是一个独特的字符串,称为Session ID。当用户从浏览器向服务器发送请求时,所发送的HTTP表头内就包含Session ID的值,服务器由此来识别是哪一个用户发出的请求。

 

  由于Session中保存的是每个用户个人的数据(如会员登录时输入的账号、密码),同时Session具有一定的生命周期,所以会被黑客利用各种手段获取得目标用户的Session ID,从而给用户带来损失。黑客获取目标用户Session ID的方法一般有三种:一是暴力破解,黑客会尝试许多不同的session id值,直到破解为止;二是计算,如果session id值是使用非随机的产生方式,那么就可能被计算出来;三是窃取,使用网络截获、病毒、木马、XSS攻击等方法获得。

 

  2.3.2 防范方法:加强Session安全性

 

  如果Session会被黑客利用,那么防范方法就是加大非法使用用户Session的难度。防范会话劫持攻击一般有几种方法。

 

  (1) 定期更改Session ID。使用PHP机制中session_regenerate_id函数,在网页每次加载时都会自动产生一个新的Session ID

 

  (2) 更改Session的名称。Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果黑客能够获得目标用户的Cookie,就能够分析出目标用户的Session ID,如果使用语句:“session_name(“mysessionid”); ”,黑客就不那么容易猜到Session ID是哪一个,可以阻挡部分攻击。

 

  (3)关闭透明化Session ID。透明化Session ID指当客户端浏览器的http请求没有使用Cookies来指定Session ID时,服务器在所有链接中放入Session ID,便会造成Session的泄露。防范方法:打开,设置_trans_sid = 0从而避免这种情况发生。代码如下:int_set(“_trans_sid”0);session_start()

 

  (4)只从Cookie检查Session ID。存放Session ID最好的地方就是Cookie,所以必须将_cookies设置为 1,表示使用Cookies存放Session ID;同时将_only_cookies 设置为 1,表示只使用cookies存放Session ID,这可以避免黑客从别的计算机来指定Session固定攻击。

 

  (5)使用URL传递隐藏参数.使用以下语句:

 

  session_start();

 

  $myvar = md5(uniqid(rand())TRUE));

 

  $_SESSION[“myvar”] = $myvar

 

  黑客虽然能获取Session数据,但是无法得知$myvar的值,只要检查myvar的值,就可以确认当前页面是否是Web程序自己调用的。

 

  (6)检查浏览器是否改变。通过对比浏览同一个网站的浏览器也可以发现是否有黑客攻击,如果使用同样的Session ID值登录同一个网站,但使用不同的浏览器,那么可能表示有人进行Session劫持攻击。

 

  $_SERVER[“HTTP_USER_AGENT”]变量会保存当前使用的浏览器的种类和版本,用变量$_SESSION[“HTTP_USER_AGENT”]将其保存,通常情况下,$_SESSION[“HTTP_USER_AGENT”]$_SERVER[“HTTP_USER_AGENT”]中的值应该是相同的。

 

  3 结束语

 

  网站安全是一个复杂的问题,没有人能做到网站的绝对安全,只能尽力在设计、运营等方面提高网站的相对安全。本文利用PHP语言,从过滤输入数据、过滤输出HTML数据、提高Session等方面,探讨了提高Web程序的安全性的具体防范措施,提高了开发人员在设计过程中对安全问题的针对性。

 

  作者简介:

 

  徐文亭(1977-),男,山东济南人,山东大学,本科,工程师;主要研究方向和关注领域:C#、 系统安全、计算机管理。

 

  肖强(1975-),男,山东泰安人,青岛大学,本科,工程师:主要研究方向和关注领域:信息资源、网络管理、情报研究。

上一篇:基于按需云服务的计算机工程教育虚拟实验室建

下一篇:高职计算机网络技术教学的提升研究