存档

文章标签 ‘php’

php获取客户端IP地址的方法

2011年1月25日 没有评论

php获取客户端IP地址的方法

方法11 //php获取ip的算法
2 $iipp=$_SERVER["REMOTE_ADDR"];
3 echo $iipp;
方法2
01 //php获取ip的算法
02 $user_IP = ($_SERVER["HTTP_VIA"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] : $_SERVER["REMOTE_ADDR"];
03 $user_IP = ($user_IP) ? $user_IP : $_SERVER["REMOTE_ADDR"];
04 echo $user_IP;
05
06 function get_real_ip(){
07 $ip=false;
08 if(!empty($_SERVER["HTTP_CLIENT_IP"])){
09 $ip = $_SERVER["HTTP_CLIENT_IP"];
10 }
11 if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
12 $ips = explode (“, “, $_SERVER['HTTP_X_FORWARDED_FOR']);
13 if ($ip) {
14 array_unshift($ips, $ip); $ip = FALSE;
15 }
16 for ($i = 0; $i < count($ips); $i++) {
17 if (!eregi (“^(10│172.16│192.168).”, $ips[$i])) {
18 $ip = $ips[$i];
19 break;
20 }
21 }
22 }
23 return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
24 }
25 echo get_real_ip();

方法3
01 //php获取ip的算法
02 if ($HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"]){
03 $ip = $HTTP_SERVER_VARS["HTTP_X_FORWARDED_FOR"];
04 }elseif ($HTTP_SERVER_VARS["HTTP_CLIENT_IP"]) {
05 $ip = $HTTP_SERVER_VARS["HTTP_CLIENT_IP"];
06 }elseif ($HTTP_SERVER_VARS["REMOTE_ADDR"]) {
07 $ip = $HTTP_SERVER_VARS["REMOTE_ADDR"];
08 }elseif (getenv(“HTTP_X_FORWARDED_FOR”)){
09 $ip = getenv(“HTTP_X_FORWARDED_FOR”);
10 }elseif (getenv(“HTTP_CLIENT_IP”)){
11 $ip = getenv(“HTTP_CLIENT_IP”);
12 }elseif (getenv(“REMOTE_ADDR”)){
13 $ip = getenv(“REMOTE_ADDR”);
14 }else{
15 $ip = “Unknown”;
16 }
17 echo “你的IP:”.$ip ;

方法4
01 //php获取ip的算法
02 if(getenv(‘HTTP_CLIENT_IP’)) {
03 $onlineip = getenv(‘HTTP_CLIENT_IP’);
04 } elseif(getenv(‘HTTP_X_FORWARDED_FOR’)) {
05 $onlineip = getenv(‘HTTP_X_FORWARDED_FOR’);
06 } elseif(getenv(‘REMOTE_ADDR’)) {
07 $onlineip = getenv(‘REMOTE_ADDR’);
08 } else {
09 $onlineip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
10 }
11 echo $onlineip;

分类: 网站建设经验 标签: ,

如何安全使用Register Globals

2011年1月25日 1 条评论

如何安全使用Register Globals呢?PHP从4.2版开始后配置文件中register_globals的默认值从 on 改为 off 了。下面会解释用这个指令如何写出不安全的代码,但要知道这个指令本身没有不安全的地方,误用才会。当 register_globals 打开以后,各种变量都被注入代码,例如来自 HTML表单的请求变量。再加上 PHP 在使用变量之前是无需进行初始化的,这就使得更容易写出不安全的代码。这是个很艰难的抉择,但PHP 社区还是决定默认关闭此选项。当打开时,人们使用变量时确实不知道变量是哪里来的,只能想当然。但是
register_globals 的关闭改变了这种代码内部变量和客户端发送的变量混杂在一起的糟糕情况。下面举一个错误使用 register_globals 的例子:

Example #9 错误使用 register_globals = on 的例子


<?php
// 当用户合法的时候,赋值 $authorized = true
if (authenticated_user()) {
$authorized = true;
}
// 由于并没有事先把 $authorized 初始化为 false,
// 当 register_globals 打开时,可能通过GET auth.php?authorized=1 来定义该变量值
// 所以任何人都可以绕过身份验证
if ($authorized) {
include
"/highly/sensitive/data.php";
}
?>

当 register_globals = on 的时候,上面的代码就会有危险了。如果是
off,$authorized 就不能通过如 URL
请求等方式来改变,这样就好多了,尽管初始化变量是一个良好的编程习惯。比如说,如果在上面的代码执行之前加入
$authorized = false 的话,无论 register_globals 是 on 还是
off 都可以,因为用户状态被初始化为未经认证。

另一个例子是关于会话的。当 register_globals = on
的时候,$username 也可以用在下面的代码中,但要意识到
$username 也可能会从其它途径进来,比如说通过 URL 的 GET。

Example #10 使用会话时同时兼容 register_globals on 和 off 的例子


<?php
// 我们不知道 $username 的来源,但很清楚 $_SESSION 是
// 来源于会话数据
if (isset($_SESSION['username'])) {echo} else { 

;

“Hello <b>{$_SESSION[‘username’]}</b>”

echo

“Hello <b>Guest</b><br />”;
echo
“Would you like to login?”

;}
?>

采取相应的预防措施以便在伪造变量输入的时候给予警告是完全有可能的。如果事先确切知道变量是哪里来的,就可以检查所提交的数据是否是从不正当的表单提交而来。不过这不能保证变量未被伪造,这需要攻击者去猜测应该怎样去伪造。如果不在乎请求数据来源的话,可以使用$_REQUEST 数组,它包括了 GET、POST 和 COOKIE的所有数据。详情可参见php手册的来自 PHP 之外的变量

Example #11 探测有害变量


<?php
if (isset($_COOKIE['MAGIC_COOKIE'])) {
// MAGIC_COOKIE 来自 cookie
// 这样做是确保是来自 cookie 的数据
} elseif (isset($_GET['MAGIC_COOKIE']) || isset($_POST['MAGIC_COOKIE'])) {
mail("admin@example.com", "Possible breakin attempt", $_SERVER['REMOTE_ADDR']);
echo
"Security violation, admin has been alerted.";
exit;} else {

// 这一次请求中并没有设置 MAGIC_COOKIE 变量 }
?>

当然,单纯地关闭 register_globals
并不代表所有的代码都安全了。对于每一段提交上来的数据,都要对其进行具体的检查。永远要验证用户数据和对变量进行初始化!把
error_reporting() 设为
E_NOTICE 级别可以检查未初始化的变量。

php的来源,成长以及优势所在

2010年8月5日 没有评论

1. 历史
 Rasmus Lerdorf为了创建他的在线简历而创造了”个人主页工具”(Personal Home Page Tools)。这是一种非常简单的语言。后来越来越多的人注意到这种语言并对其扩展提出各种建议。在许多人的无私奉献下以及这种语言本身的源代码自由性质,它演变成了一种特点丰富的语言,而且现在还在成长中。
PHP虽然很容易学习,但是速度上比mod_perl(植入web服务器的perl模块)慢。现在有了可以与mod_perl速度相媲美的被称作Zend的新引擎,而PHP4就可以充分利用这个引擎。PHP4还处在BETA测试阶段。Andy Gutmans和Zeev Suraki是Zend的主要作者。可以去Zend站点(http://www.zend.com)了解更多。
PHP的应用在个人性质的web工程中增长显著。根据Netcraft在1999年10月的报告,有931122个域和321128个IP地址利用PHP技术。
 2. PHP的优点
 应用PHP有许多好处。当然已知的不利之处在于PHP由于是开放源码项目,没有商业支持,并且由此带来的执行速度缓慢(直到PHP4之前)。但是PHP的邮件列表很有用而且除非你正在运行像Yahoo!或者Amazon.com这样极受欢迎的站点,你不会感觉出PHP的速度与其他的有什么不同。最起码我就没有感觉出来!好了,让我们来看看PHP有那些优点:
- 学习过程
与Java和Perl不同,你不用把头埋进100多页的文档中努力学习才可以写出一个象样的程序。只要了解一些基本的语法和语言特色,你就可以开始你的PHP编码之旅了。之后你在编码过程中如果遇到什么麻烦,还可以再去翻阅相关文档。
PHP的语法与C,Perl,ASP或者JSP相似。对于那些对上述之一的语言较熟悉的人来说,PHP太简单了。相反的,如果你对PHP了解较多,那么你对于其他几种语言的学习都很简单了。
你只需要30分钟就可以将PHP的核心语言特点全部掌握,你可能已经非常了解HTML,甚至你已经知道怎样用编辑设计软件或者手工来制作好看的WEB站点。由于PHP代码能够无障碍的添加进你的站点,在你设计和维护站点的同时,你可以很轻松的加入PHP使得你的站点更加具有动态特性。
- 数据库连接
PHP可以编译成具有与许多数据库相连接的函数。PHP与MySQL是当前绝佳的组合。你还可以自己编写外围的函数去间接存取数据库。通过这样的途径当你更换使用的数据库时,可以轻松的更改编码以适应这样的变化。PHPLIB就是最常用的可以提供一般事务需要的一系列基库。
- 可扩展性
就像前面说的那样,PHP已经进入了一个高速发展的时期。对于一个非程序员来说为PHP扩展附加功能可能会比较难,但是对于一个PHP程序员来说并不困难。
- 面向对象编程
PHP提供了类和对象。基于web的编程工作非常需要面向对象编程能力。PHP支持构造器、提取类等。
- 可伸缩性
传统上网页的交互作用是通过CGI来实现的。CGI程序的伸缩性不很理想,因为它为每一个正在运行的CGI程序开一个独立进程。解决方法就是将经常用来编写CGI程序的语言的解释器编译进你的web服务器(比如mod_perl,JSP)。PHP就可以以这种方式安装,虽然很少有人愿意这样以CGI方式安装它。内嵌的PHP可以具有更高的可伸缩性。
- 更多特点
PHP的开发者们为了更适合web编程,开发了许多外围的流行基库,这些库包含了更易用的层。你可以利用PHP连接包括Oracle,MS-Access,Mysql在内的大部分数据库。你可以在网页上画图,编写程序下载或者显示e-mail。你甚至可以完成网络相关的功能。最好的是,你可以选择你的PHP安装版本需要哪些功能。引用Nissan的Xterra的话来说就是PHP可以做到你想让它做到的一切而且无所不能!
 3. 竞争对手:ASP,mod_perl,JSP
 我当然不清楚ASP/JSP能做些什么。不过明确的是编写那样的代码有多简单,购买它们会有多昂贵以及它们需要多么昂贵和强大的硬件。如果你有什么中立的观点(比如说没有被SUN和Microsoft的百万美金所影响),请顺便通知我。
据我所知,JSP基于Java,因此Java程序员可以轻松开始编码。ASP只是一个一般的引擎,具有支持多种语言的能力,不过默认的并且是最常用的还是VBScript。
mod_perl与Perl一样强大,只是更快一些。

PHP没前途—谬论

2010年8月5日 没有评论

  在编程领域有不少堪称经典著作,其中包括《Thinking In C++》和《Thinking In Java》,它们的作者是著名的计算机科学作家Bruce Eckel。近日这个编程大师联系编程语言Java、Perl和Python,分析了老牌经典编程语言PHP的优缺点,下面让我们一睹为快。

  PHP的魅力所在

  提起老牌经典脚本语言PHP,我们会不禁联想到它的一个令人印象深刻的特点,就是上手快,你无需对这个语言进行深入广泛的了解就可以使用它开始编程。在我们所知道的语言中,没有几个语言能把这种特点体现的淋漓尽致。与之相对应的另一个极端是Java,即使你写一个简单的hello world程序也需要掌握不少Java知识,运行一个Web应用同样不简单。而这一切在PHP中是一件举手之劳的简单事情。

  在编程能力方面,PHP只是比Perl表现好一点。Perl是一种古老的脚本语言。最初的Web应用大多是用Perl编写的,Perl很像C语言,使用非常灵活,对于文件操作和处理具有和C语言一样的方便快捷。

  不过,由于Perl的灵活性和“过度”的冗余语法,也因此导致许多Perl程序的代码令人难以阅读和维护,记得在Web刚刚兴起的时候,当听到有人说将使用Perl编写大型应用的时候,我就知道他们面临的将是失败。

  Perl的哲学思想是同一件事,总有不止一种方法去解决,结果造成了大量难读难懂的程序。对于规模较大的系统来说,Perl编写的维护成本相对更高,另外Perl对于CPU的消耗较高,效率似乎有一些不足。
  计算机科学作家Bruce Eckel

  相比来说,PHP已经创建了一些更大型的应用,例如大名鼎鼎的开源CMS系统Drupal。我的朋友Nancy Nicolaisen表示她希望搭建一个旅游网站,我建议她看一下Drupal。她听取了我的建议并最终选择了它,只进行了轻微的改动就使她的网站上线了,用她的话来说,这个用户社区吸引她的地方是它的强大和易用。

  而且PHP允许初学者可以直接针对他们感兴趣的功能进行编程,而无需花费大量的时间来学习编程理论和实践。你只需要编写代码并通过网页来查看效果就可以了。