使用PHP进行HTTP认证

我们在登录某些安全性较高的网站时,有时候可能会遇到这种情况:直接在网页上 弹出一个windows窗口,要求输入认证的用户名和密码,只有认证登录成功才能看到内 容,否则的话则连该页面都无法打开,这是一种HTTP认证的的方式,它大大加强了系统 的保密性和安全性,那这是如何实现的呢,下面我就简要向大家介绍一下. 利用PHP来实现HTTP的强制认证是十分简单的,只需简单的几行代码就可以实现,下面 我们来看一个例子,然后结合这里例子我向大家详细介绍一下PHP实现HTTP认证. <?php if(!isset($_SERVER[‘PHP_AUTH_USER’])) { header(‘WWW-Authenticate: Basic realm=”系统名称”‘); header(‘HTTP/1.0 401 Unauthorized’); echo ‘未通过HTTP认证.’; exit; } else { echo ‘认证通过.’; echo ‘用户名: ‘.$_SERVER[‘PHP_AUTH_USER’].”/n”; echo ‘密码: ‘.$_SERVER[‘PHP_AUTH_PW’].”/n”; } ?> 1.实现说明 怎么样,看到上面的代码了吧,就这么几行添加到你的程序页面上就可以实现了. 它是通过利用header()函数向客户端浏览器发送”Authentication Required”信息,强制其弹出一个用户名/密码输入窗口,当用户输入用户名和密码后,包含有URL的PHP脚本将会加上预定义变量PHP_AUTH_USER, PHP_AUTH_PW和AUTH_TYPE然后再次调用,这三个变量分别表示用户名,密码和认证类型(从PHP5.0.1起开始支持”Basic”和”Digest”两种认证方式),它们被保存在$_SERVER(从HP>>4.1.0起有效)或$HTTP_SERVER_VARS(从PHP3起有效)数组中具体应用时,我们可以把验证的几行代码写成函数,只要判断到用户变量不存在或验证不正确就一直执行该函数并弹出窗口,而且还可以设置错误登录几次就不允许该用户访问,具体的使用大家使劲的发散思考吧. 2.注意事项: 我们在使用PHP实现HTTP认证机制时还有几点问题我们是需要注意的: 1.这段代码必须放到程序的开始,且在其开始执行之前不能有任何输出(若有输出则 需要使用输出缓冲函数才行). 2.PHP的HTTP认证机制仅在PHP以Apache模块方式运行时才有效,这个容易理解,它本身是HTTP强制认证,肯定是不适合于CGI版本,不能在命令行下执行的. 3.header发送标头代码时请小心.为了对所有的客户端保证兼容性,关键字”Basic”的第一个字母必须大写为”B”,分界字符串必须用双引号引用(不能是单引号);在HTTP/1.0和401之间必须有且仅有一个空格. 4.在上面列子中,仅输出了用户名和密码,而在实际系统中则可按照登录验证流程进行与数据库或其他方式进行判断和验证. 5.从PHP4.3.0起,为防止有人通过编写脚本来从页面上获取密码,当外部认证对特定页面有效,并且安全模式被开启时,PHP_AUTH变量将不会被设置.可以用REMOTE_USER来辨别外部认证的用户,用AuthType指令来判断外部认证机制是否有效. 6.要想让HTTP认证能够在IIS下工作,PHP配置选项cgi.rfc2616_headers必须设置为0(默认值). 本文允许转载,转载请保留源地址: http://huyanping.sinaapp.com/?p=85 原创文章,转载请注明: 转载自始终不够 本文链接地址: 使用PHP进行HTTP认证

C++经验(个人见解)

1.  定义变量的小习惯: 定义变量时要养成初始化的好习惯,尤其是对指针变量。初始化时尽量用变量后加括号的形式进行初始化。这与用“=”进行初始化有细微的区别。用“=”进行初始化时,系统默认调用的是拷贝构造函数,而在变量后面加上括号的形式进行初始化时,系统默认调用的构造函数。对于C++基本数据类型来说,这并无大的区别,然而对于对象来说却有可能达不到我们想要的效果。 例: int  x = 0;   拷贝式初始化 int  x(0);    构造式初始化 虽然这个细节对于编程来说无伤大雅,但对于一个优秀的程序员来说,养成一个良好的编程习惯是必须的。参考文献(C++primer)。 2.  多返回值情况: 个人总结出两种让函数有多返回值的方法。第一种即为函数返回值为数组或向量,或其他类似结构,都可实现多返回值。第二种则为设置引用参数,这点位本人个人观点,可能表达上有些错误,敬请见谅;详细的说就是利用引用参数而代替函数的返回值,当我们需要一个函数返回一个布尔类型的值并且需要函数对某些数据进行修改时,这种方法很有用处;或许这不能说是函数多返回值,只是个人觉得这样理解比较好懂。 3.  利用多个布尔类型以及整形的乘积的和判断事件发生情况: 打个比方,求一个数被3,5,7整除的情况,要求一次性输出结果。则可以判断是否能被3,5,7整除并将返回的布尔数与1,2,3相乘,再相加,每种不同的情况将有不同的结果,这时我们则可以采用SWITCH语句进行简单的判断即可达到一次性输出的目的。 4.  养成使用内联函数的习惯: 内联函数是C++对于C的宏定义的替代品,对于用inline生命的函数,编译器将尝试将函数编译到函数被调用的地方,从而省去了函数调用的麻烦。Inline函数要求不可以有复杂的控制结构,循环等都是不允许出现在内联函数中的。换一种说法就是,如果函数中有过于复杂的控制结构,编译器将放弃对其内联的尝试。关键字inline对于编译器来说只是一种建议,而编译器是可以不去执行的。在类中我们可以把一些常用到的数量不多的代码分离出来定义成内联函数,从而减轻我们编程的复杂度。 5.  指针的威胁: 有人说指针是安全隐患的罪魁或有,也有人说妙就秒在指针。对于这两种说法,我个人更偏向于后一种。指针是有着强大功能的数据类型,虽然因为它而产生了好多安全隐患,但作为程序员我们应该学会如何去避免这些问题的产生。 当我们定义一个指针变量时,我们应尽可能的将其进行初始化。这一点在第一点中已经强调。对于为初始化的指针我们成为野指针,野指针对于程序来说是相当危险的,如果我们尝试去使用一个野指针,或删除野指针所指向的内存空间时,都会发生严重的错误而导致程序停止运行或者其他严重的后果。 当我们释放掉一个动态申请的指针时,也应将指针值置为NULL(或为0),这样我们就无法对其进行操作了。 当我们用两个或多个指针指向同一块动态申请的内存空间时,应小心多次对同一片内存空间进行删除。从程序的用户的角度来讲,发生这种情况时计算机会产生蓝屏的现象并将出现错误的地址显示在屏幕上。避免这种情况有两种方法:第一,删除动态存储空间后将其他指针置空;第二,删除动态存储空间后将其他指针指向其他内存空间。 总之我们应该让指针的指向在我们的把握之中才是解决指针威胁的最终方法。 例: int *x=new int(); Int *y=new int(); Int *p=x; Delete x; P=NULL;        //或p=y;   有一些是个人总结出来的,可能有一些理解上的问题,敬请见谅。 本文允许转载,转载请保留源地址:http://huyanping.sinaapp.com/?p=89 原创文章,转载请注明: 转载自始终不够 本文链接地址: C++经验(个人见解)