首 页   · 站长博客 · 用户注册 · 会员登陆  · 会员排行  ·最新主题  ·最近回复  精华区  版权声明  ·论坛管理
  当前登录身份:游客,请先登录。  笔名: 口令: 验证码:   
楼 主  index »  PHP与模板与代码加密/优化 » ★再提PHP安全话题,望大家重视  


  作者:一起PHP
  注册时间:2004-02-27
  主题/回复:247/1521
  积分:4649
  等级:★★★★★☆(十一级)
  称号:论坛圣人

  nqp@nqp.me
  4304410
  www.nqp.me

 

 发表:2005-04-15 00:25:18 阅读 2295 次 回复 5 次 得分5  |   字号 字色
★再提PHP安全话题,望大家重视
    写PHP代码好几年了,都一直没有再其安全性方面做太多考虑,一个是自己的代码都自己用,没有公开发布过,基本上不会遇到什么攻击。再一个是一直感觉安全性是黑客去考虑的东西,自己的任务就是写出可行的代码,没有做刻意的安全性修饰。
    今天没事,去了几个网络安全站点看了一些文章,看得身上直冒冷汗,原来自己写的许多Php代码实际上不堪一击。非常容易被黑客利用造成破坏,在这里例举几个今天学到的知识,希望大家也引以为戒。

    1、对于用户向服务器提交的任何信息,不管是get方法还是post方法,都要做好判断和检查,不能遗漏任何一个。(自己编写一个检查函数,并不难),否则很容易被人通过提交一些恶意字符或者恶意命令而造成严重的后果。
    2、严防SQL注入漏洞。asp中这个漏洞曾非常流行,现在也有些人研究出来了PHP+MYSQL环境的sql语句注入漏洞。解决的办法就是除了上面的对用户提交的任何信息都作详细的检查以外,在做比如用户登录验证之类的程序的时候,一定要注意查询语句的写法,如select * from user where username=$username and password=$password这样的语句据就非常容易被利用,通过输入一些非法语句破坏掉你的sql语句从而轻松绕过验证。写这类语句,最好是首先查询$username,然后再比对$password,而不是用and一起查询。
    3、严格控制mysql用户的权限。一台主机上的PHP站点可能不止一个,这些站点最好不要使用同一个mysql帐号登陆。强烈建议每个站点分配一个账户,而且,每个帐户权限都锁定在具体的数据库上,并且最大限度的限制其权限,防止通过sql注入漏洞来轻松获得其他数据库的信息,尤其是保存用户信息的数据库。
    4、对于用户向服务器提交信息并要将提交的数据进行保存的情况,最好全部设置间隔时间限制。比如发表新文章、发表回复、发送短消息、用户注册等等场合,都涉及到往数据写入数据,如果不加间隔时间限制,虽然不能带来什么破坏性攻击,但是足以让恶意的人通过不断刷屏或借助一定的工具来不断发送垃圾信息达到消耗服务器资源的目的。所以,最好设置一个时间限制,比如发帖时间要求间隔1分钟。
    5、PHP.INI一定要设置好,不要图省事而开放一些危险的权限。比如register_globals推荐为off,还有magic_quotes_gpc一定要设置为on,这样可以在一定程度上避免许多导致严重后果的攻击。
    6、养成写完整代码的习惯。比如接受变量推荐一律使用$_POST[]和$_GET[],sql语句中的变量尽量使用''单引号包裹起来。否则就给攻击者留下可乘之机。
    7、写代码要注意逻辑严密,否则有些验证可能形同虚设。一定不要用比较简单的变量来记录一些信息,比如表示用户是否已经登陆,用一个if($log=1)那么攻击者在浏览器中输入一个..php?log=1就可以绕过验证。当然如果你做到了第5条,这种方法就失效了。
    8、确保web服务器的安全。有时候使得黑客攻击你网站的可能不是你代码的漏洞,而是你的web服务器的漏洞,比如强烈推荐使用NTFS文件系统,并且设置好各个目录的权限,不需要开放的权限一定不能开放。经常升级服务器,及时打好补丁。
    9、MYSQL数据库最好和web服务器分离,不要放在同一台主机上,因为很多入侵都是通过MYSQL来获得服务器的一些信息,如果mysql数据库服务器和web服务器不在同一机器上,可以避免不少安全问题。还有就是如无特别必要,关掉所有mysql中host为%的帐号。也就是说所有帐号必须在本机(或者指定的Ip)上登陆。%表示任意主机都可以登录。
    10、尽量使用session来记录一些信息,非特别必要不建议使用cookie。虽然现今99%的论坛都采用cookie(剩下的1%就是我这个论坛,这个全部用的session),但是cookie的不安全性有目共睹,很多对论坛用户帐号的盗取或者冒充都是通过修改cookie再配合一些其他方法。所以,cookie虽然还得用,但是必须保证绝对安全的前提下来使用。
    11、经常关注网络安全方面的动态,及时作好防范。

 以上是我今天下午学习的体会,希望对大家有所帮助。
 还有,我这个论坛早就打算改版,所以说有一些漏洞虽然知道,但是我也没有去做修补。所以希望大家不要拿我这个论坛来做为攻击试验的对象^_^。
 
 1#楼  
 
  回复人:cykk
  注册时间:2004-12-30
  主题/回复:41/99
  积分:688
  等级:★★★(六级)
  称号:声名鹊起

   
 1#楼 发表于2005-04-15 04:22:52  评分:1 

  好哦,现在正在努力学习PHP,希望有一天能成为17PHP论坛的版主!
 2#楼  
 
  回复人:haihe
  注册时间:2005-04-02
  主题/回复:0/1
  积分:401
  等级:★★☆(五级)
  称号:略有小成

   
 2#楼 发表于2005-04-19 19:14:49  评分:1 

不错!受益匪浅!
 3#楼  
 
  回复人:qinga1b2
  注册时间:2005-04-20
  主题/回复:13/17
  积分:482
  等级:★★☆(五级)
  称号:略有小成

   
 3#楼 发表于2005-04-25 21:28:40  评分:2 

版主,你说的这个是什么意思哦?
select * from user where username=$username and password=$password这样的语句据就非常容易被利用,通过输入一些非法语句破坏掉你的sql语句从而轻松绕过验证。写这类语句,最好是首先查询$username,然后再比对$password,而不是用and一起查询。
是不是先确定有这个用户名和密码呀
 4#楼  
 
  回复人:一起PHP
  注册时间:2004-02-27
  主题/回复:247/1521
  积分:4649
  等级:★★★★★☆(十一级)
  称号:论坛圣人

   
 4#楼 发表于2005-04-25 22:58:05  评分:× 

由于sql注入漏洞就主要是通过提交非法的数据库查询实现的,所以我提了这一条,意思是:

首先查询用户名  select * from user where username='$username'
执行之后,如果找到了用户名,并且数据库中用户的密码为:$pass
然后再判断密码是否正确
if($pass==$userpass){...}

否则,如果在查询数据库的时候同时查询用户名和密码,那么如果你的站点存在sql注入漏洞,那么攻击者通过在用户名中输入一个非法的字符串,这个字符串本身就是sql查询语句的一部分,这样的话,你原来的查询语句就被篡改了,查询结果可能就错误,被攻击者利用来绕过身份验证。
 5#楼  
 
  回复人:zhangjun434
  注册时间:2005-03-29
  主题/回复:14/22
  积分:492
  等级:★★☆(五级)
  称号:略有小成

   
 5#楼 发表于2005-05-12 17:46:29  评分:1 

斑竹说的的确是重要,看来现在养成的许多习惯的确是有问题的,在以后的学习中还真的要注意,代码的书写问题啊,养成一个好的习惯终究是一件好事,受益匪浅啊,
  页数1/1首页 « 1 » 末页
  发表回复:您还没有登陆,无法发表回复。请先[登陆]

一起PHP技术联盟 主办:一起PHP 联系方式:站长QQ:4304410 QQ群:8423742 20159565 站长博客 E-mail: nqp@nqp.me 执行时间:0.012sec
SimsmaBBS 2008 (v6.0) Developed by 17php.com,Copyright(C)2003-2010 All rights reserved. 副本授权:一起PHP官方专用版