做‘访问来源统计’是发现的一个小问题

我想用<script src = ‘a.php’></script> 放到每页的头部,来通过a.php来统计每页的来源,结果用$_SERVER[‘HTTP_REFERER’];记录的都是本页的url,原来我不是直接访问的a.php,而是通过script标签的src属性,script标签是本页的,读取a.php时,将本页的url作为referer提交给了服务器,所以不能用这个方法来统计页面的访问来源。

isset() 和PHP数组

PHP中原来有人使用empty函数时就没有考虑到数字0也是empty的,单凭简单的“认为”就难免会出一些意想不到的bug,于是我就倾向于使用isset函数,没想到isset函数也有我想不到的情况,举个例子:

<?php

$arr[‘a’] = "A";
$arr[‘a’][‘b’] = "B"; //这时 $arr[‘a’] = "A"; 已经被覆盖了,
echo isset($arr[‘a’][‘c’]);

?>

输出为:
1

怎么回事呢?
测试发现,不但isset($arr[‘a’][‘c’]) 为真,如果echo $arr[‘a’][‘c’]; 的话,结果还是B呢!
因为在php这种弱类型语言中,key ‘c’ 不存在时,试图转换为数字索引了,转换后就是索引0了,而key ‘b’ 对应的数字索引就是0,所以$arr[‘a’][‘c’] 就成 $arr[‘a’][‘b’] 了,但是如果用is_array()测试,我们将发现$arr 是数组,而$arr[‘a’] 不是数组,所以用array_key_exists() 来查找$arr[‘a’] 中的key ‘b
‘ 是否存在的话讲返回false;

再看看这个:

    

        

            

        

    

            

echo 'when $arr like array';
            echo "\n";
            $arr['a'] = "A";
            $arr['a']['b'] = "B";
            
            echo '$arr is array ? '.is_array($arr);
            echo "\n";
            echo '$arr["a"] is array ? '.is_array($arr['a']);
            echo "\n";
            
            echo isset($arr['a']['c']);
            echo "\n";
            echo $arr['a'];
            echo "\n";
            echo $arr['a']['c'];
            echo "\n";
            
            echo 'when $a is string';
            echo "\n";
            $a = 'abcde';
            echo 'isset($a["c"]):'.isset($a['c']);
            echo "\n";
            echo $a['c'];
            echo "\n";
            
            echo 'when $a is array';
            echo "\n";
            $a = array('a' =>'A');
            echo 'isset($a["c"]):'.isset($a['c']);
            echo "\n";
            echo $a['c'];
            
            
            
            exit;

            

 

输出:

———-PHP代码调试 ———-
when $a like array
$arr is array ? 1
$arr["a"] is array ?
1
B
B
when $a is string
isset($a["c"]):1
a
when $a is array
isset($a["c"]):

输出完成 (耗时 0 秒) – 正常终止

其实: 上面混淆的字符串数组
对于 $arr = array(‘a’=>’A’);
1. $arr 是数组,isset($arr[‘b’]); 为假,用array_key_exists测试key ‘b’ 也是不存在的
2. $arr[‘a’] 是字符串,isset($arr[‘a’][‘b’]); 则’b’视为字符串的下标(不是数组的下标),一定要转成数字,于是转成了0,于是$arr[‘a’][‘b’]就是存在的了,不妨测试一下,如果$arr[‘a’] 为”,则isset($arr[‘a’][‘b’]); 就为假了。而且因为$arr[‘a’]根本就不是数组,所以用array_key_exists测试key ‘b’  肯听返回false了。

结论:所以isset没有问题,array_key_exists 也没有问题,问题就在于把字符串数组 混淆了

不管$arr 原来是什么,只要$arr和一个下标一个被赋值了(如:$arr[‘a’] = ‘A’;)那么$arr 就是数组;

但是,如果因为$arr 可以和一个下标一起使用,就说明$arr 是数组,就打错特错了

我就是不想让别人ping到我

这样才能让别人ping不到我?

1. 首先,ping使用的是什么协议?

ping 使用的是ICMP协议,ICMP的详细解释,请参见:中国协议分析网:http://www.cnpaf.net/

2. 怎样在Windows下让别人ping不到我?

网络连接 > 更改防火墙设置 > 高级
ICMP > 设置
取消 “允许传入回显请求”

3. 怎样在Linux下让别人ping不到我?

还不知道呢?看看iptables就知道了

4. 各种类型的ICMP报文

不同类型由报文中的类型字段和代码字段来共同决定。
因为对ICMP差错报文有时需要作特殊处理,因此我们需要对它们进行区分。例如,在对ICMP差错报文进行响应时,永远不会生成另一份ICM
P差错报文(如果没有这个限制规则,可能会遇到一个差错产生另一个差错的情况,而差错再产生差错,这样会无休止地循环下去)。
当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来。6.5节将举例来说明一点。下面各种情况都不会导致产生ICMP差错报文:
1)ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)。
2)目的地址是广播地址或多播地址
5)的IP数据报。3)作为链路层广播的数据报。
4)不是IP分片的第一片。
5)源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。这些规则是为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴。

 

提示:不要对底层协议限制太多,否则正常的网络活动都进行不了了

 

Host 'host_name' is blocked

Mysql 服务器在客户端连续产生过多的connect错误时(错误个数超过max_connect_errors),那么该客户端就被列入黑名单,用比较专业的话来说就是"被block了",该客户端将永远不能再连接,直到服务器 flush hosts;  如果错误连接没有达到max_connect_errors时又可以正常连接了,那么计数器清零。
链接是官方的说法:
http://dev.mysql.com/doc/refman/5.0/en/blocked-host.html

产生这种连接错误的可能原因:
http://dev.mysql.com/doc/refman/5.0/en/communication-errors.html

被block的主机再连接服务器时会出现的现象:
服务器端会产生一个警告,这就需要日志的记录级别为警告时才能在错误日志中看到,默认为Error

参考资料:

mysql 的系统 变量:
http://dev.mysql.com/doc/refman/5.0/en/communication-errors.html

mysql 的错误解释:
http://x.discuz.net/405464/viewspace-89361.html

 

遗留的问题:

1. 服务器端如何查看被block的主机

时间服务器安装实践

曾经两次安装 时间服务器:

第一次遇到的问题是:
1. NTP服务器启动之后需要等待几分钟才能使用,否则错误为:no server suitable for synchronization found

2. ntp.conf 需要配置,内容大致为:

——————————–ntp.conf——————————————

# NTP Network Time Protocol
# ATTENTION: *You have to restart the NTP service when you change this file to activate the changes*# Configuration File created by Windows Binary Distribution Installer Rev.: 1.23  mbg
# please check http://www.ntp.org for additional documentation and background information
# Use drift file
driftfile "C:\Program Files\NTP\etc\ntp.drift"

# your local system clock, could be used as a backup
# (this is only useful if you need to distribute time no matter how good or bad it is)
server 127.127.1.0    
# but it should operate at a high stratum level to let the clients know and force them to
# use any other timesource they may have.
#fudge 127.127.1.0 stratum 12

# End of generated ntp.conf — Please edit this to suite your needs

 

—————————————————————————————

注意:红字那行原本是注释掉的,需要打开,否则也是无法同步时间的,至于原因,需要读一下ntp协议了,我还没读呢

NTP概念简介

Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可以提供高精准度的时间校正(LAN上与标准间差小于1毫秒,WAN上几十毫秒),且可介由加密确认的方式来防止恶毒的协议攻击。

NTP如何工作

NTP提供准确时间,首先要有准确的时间来源,这一时间应该是国际标准时间UTC。 NTP获得UTC的时间来源可以是原子钟、天文台、卫星,也可以从Internet上获取。这样就有了准确而可靠的时间源。时间按NTP服务器的等级传播。按照离外部UTC 源的远近将所有服务器归入不同的Stratun(层)中。Stratum-1在顶层,有外部UTC接入,而Stratum-2则从Stratum-1获取时间,Stratum-3从Stratum-2获取时间,以此类推,但Stratum层的总数限制在15以内。所有这些服务器在逻辑上形成阶梯式的架构相互连接,而Stratum-1的时间服务器是整个系统的基础。

计算机主机一般同多个时间服务器连接, 利用统计学的算法过滤来自不同服务器的时间,以选择最佳的路径和来源来校正主机时间。即使主机在长时间无法与某一时间服务器相联系的情况下,NTP服务依然有效运转。

为防止对时间服务器的恶意破坏,NTP使用了识别(Authentication)机制,检查来对时的信息是否是真正来自所宣称的服务器并检查资料的返回路径,以提供对抗干扰的保护机制。

网络校时协议(NTP)的实现

时间服务器可以利用以下三种方式与其他服务器对时:

broadcast/multicast

client/server

symmetric

broadcast/multicast方式主要适用于局域网的环境,时间服务器周期性的以广播的方式,将时间信息传送给其他网路中的时间服务器,其时间仅会有少许的延迟,而且配置非常的简单。但是此方式的精确度并不高,对时间精确度要求不是很高的情况下可以采用。

symmetric的方式得一台服务器可以从远端时间服务器获取时钟,如果需要也可提供时间信息给远端的时间服务器。此一方式适用于配置冗余的时间服务器,可以提供更高的精确度给主机。

client/server方式与symmetric方式比较相似,只是不提供给其他时间服务器时间信息,此方式适用于一台时间服务器接收上层时间服务器的时间信息,并提供时间信息给下层的用户。

上述三种方式,时间信息的传输都使用UDP协议。每一个时间包内包含最近一次的事件的时间信息、包括上次事件的发送与接收时间、传递现在事件的当地时间、及此包的接收时间。在收到上述包后即可计算出时间的偏差量与传递资料的时间延迟。时间服务器利用一个过滤演算法,及先前八个校时资料计算出时间参考值,判断后续校时包的精确性,一个相对较高的离散程度,表示一个对时资料的可信度比较低。仅从一个时间服务器获得校时信息,不能校正通讯过程所造成的时间偏差,而同时与许多时间服务器通信校时,就可利用过滤算法找出相对较可靠的时间来源,然后采用它的时间来校时

协议结构
LI:跳跃指示器,警告在当月最后一天的最终时刻插入的迫近闺秒(闺秒)。

VN:版本号。

Mode:模式。该字段包括以下值:0-预留;1-对称行为;3-客户机;4-服务器;5-广播;6-NTP 控制信息

Stratum:对本地时钟级别的整体识别。

Poll:有符号整数表示连续信息间的最大间隔。

Precision:有符号整数表示本地时钟精确度。

Root Delay:有符号固定点序号表示主要参考源的总延迟,很短时间内的位15到16间的分段点。

Root Dispersion:无符号固定点序号表示相对于主要参考源的正常差错,很短时间内的位15到16间的分段点。

Reference Identifier:识别特殊参考源。

Originate Timestamp:这是向服务器请求分离客户机的时间,采用64位时标(Timestamp)格式。

Receive Timestamp:这是向服务器请求到达客户机的时间,采用64位时标(Timestamp)格式。

Transmit Timestamp:这是向客户机答复分离服务器的时间,采用64位时标(Timestamp)格式。

Authenticator(Optional):当实现了 NTP 认证模式,主要标识符和信息数字域就包括已定义的信息认证代码(MAC)信息。