在enom注册的域名查询WHOIS的时候,会看到这三项

Registration Service Provided By:
Contact:
Visit:

意思分别是:

提供服务的组织
联系(信箱)
访问地址

要修改这三个的信息,需要在www.enom.com登陆,然后点击myinfo,进入后找到

Organization Name

Email Address (WhoIs)
(will be displayed in your public WhoIs Information)


Website URL
(http://www.enom.com) ~

就是分别对应上面的三个项目了,修改后WHOIS的信息基本在一个小时内就更新了

这三个项目的信息是不能单独对某个域名作修改的,修改后这个ID下所有的域名的信息都会统一更新,任何人都会通过WHOIS查询得到,对于敏感的信息的玉米,第一个只能乱写了,第二个最好留国外的信箱,第三个最好留空
[ 2005/12/14 23:05 | by 网络毛毛虫 ]


需要在计数器目录下设置count.txt并修改属性为777
[ 2005/12/14 19:28 | by 网络毛毛虫 ]

            冲突域     广播域       工作在osi模型中的层次   
hub            1               1                            1
交换机    多个           1                            2 (mac)
路由器    多个          多个                       3  (ip)


HUB    :只是比较方便了网络的布线,采用共享带宽的工作方式,它对接受到的信息采用广播的方式进行转发,既对该hub上面所有的端口转发该信息.

交换机:工作在osi模型中数据链路层的,对于要求转发的信息,它会首先识别出信息中的目的机器的mac地址,然后和自己机器缓存中的相比较(交换机中存在着一个mac地址--端口的对应表在缓存中),如果找到的话就转发到相应的交换机端口,没找到的话,它就会利用arp协议在网络上寻找该mac地址的机器,找到后便把该条记录写入到自己的缓存中.

路由器:工作在网络层的网络设备.用于连接不同的网段并且找到网络中数据传输最合适的路径,通过识别信息中的ip地址的方式,进行信息的转发.它能有效的隔绝广播域,防止广播风暴的发生.

[ 2005/12/09 08:37 | by 网络毛毛虫 ]
在1024*768分辨率下正常显示,在800*600的分辨率下可以自动隐藏,以免遮住页面影响访问者浏览内容,下面文本框中就是实现效果所需代码:

  var delta=0.015
  var collection;
  function floaters() {
    this.items  = [];
    this.addItem  = function(id,x,y,content)
         {
          document.write('<DIV id='+id+' style="Z-INDEX: 0; POSITION: absolute; width:80px; height:60px;left:'+(typeof(x)=='string'?eval(x):x)+';top:'+(typeof(y)=='string'?eval(y):y)+'">'+content+'</DIV>');
          
          var newItem        = {};
          newItem.object      = document.getElementById(id);
          newItem.x        = x;
          newItem.y        = y;

          this.items[this.items.length]    = newItem;
         }
    this.play  = function()
         {
          collection        = this.items
          setInterval('play()',10);
         }
    }
    function play()
    {
      if(screen.width<=800)
      {
        for(var i=0;i<collection.length;i++)
        {
          collection[i].object.style.display  = 'none';
        }
        return;
      }
      for(var i=0;i<collection.length;i++)
      {
        var followObj    = collection[i].object;
        var followObj_x    = (typeof(collection[i].x)=='string'?eval(collection[i].x):collection[i].x);
        var followObj_y    = (typeof(collection[i].y)=='string'?eval(collection[i].y):collection[i].y);

        if(followObj.offsetLeft!=(document.body.scrollLeft+followObj_x)) {
          var dx=(document.body.scrollLeft+followObj_x-followObj.offsetLeft)*delta;
          dx=(dx>0?1:-1)*Math.ceil(Math.abs(dx));
          followObj.style.left=followObj.offsetLeft+dx;
          }

        if(followObj.offsetTop!=(document.body.scrollTop+followObj_y)) {
          var dy=(document.body.scrollTop+followObj_y-followObj.offsetTop)*delta;
          dy=(dy>0?1:-1)*Math.ceil(Math.abs(dy));
          followObj.style.top=followObj.offsetTop+dy;
          }
        followObj.style.display  = '';
      }
    }  
    
  var theFloaters    = new floaters();
  theFloaters.addItem('followDiv1','document.body.clientWidth-100',0,'</a><br><a href=广告链接地址 target=_blank><img src=广告图片地址 width=100 height=400 border=0></a>');
  theFloaters.addItem('followDiv2',0,0,'<br><a href=广告链接地址 target=_blank><img src=广告图片地址 width=100 height=400 border=0></a>');
  theFloaters.play(); 

把上面的代码另存为一个JS文件,然后在想实现此效果的页面用<script type="text/javascript" language="javascript1.2" src="*.js"></SCRIPT>调用即可,*代表你另存的文件名!注意修改广告图片地址和连接地址!

     
[ 2005/12/09 08:31 | by 网络毛毛虫 ]
PHP是一门高效的网络编程语言,由于它具有编写灵活、运行快速等优点,迅速成为Web程序员的首选语言。前不久的一份权威调查表明,现在已经有31.6%的网站使用PHP作为主要的服务器端编程语言。
但是,要成为一名PHP编程高手却并不容易。并不像很多人想象的那样,只要能够飞快地编写几条简单的代码去解决一个复杂的问题就是PHP编程高手了,真正的PHP高手还需要考虑更多的其它问题。以下三条准则是一名成熟的PHP程序员在编程中应该首先遵循的准则。
1.懒惰是金
2.编写漂亮的代码
3.追求程序的速度,而不是编程的速度
一、懒惰是金
做一个懒惰的程序员吗?这个想法太奇怪了!因为这个世界上最忙碌的人可能就是计算机程序员了。但正是因为程序员太忙了,所以才应该在编程时学会偷懒。
对于一个程序员来说,懒惰的方法有两种:其一,大胆使用现成的别人的程序代码,把这些代码融入到你自己的程序或者项目中去。其二是编写一些有用的代码建立一个函数库,在将来编写程序时可以顺手拈来,省去了许多重复的劳动,自然就可以懒惰一点了。
这两种偷懒的方法都非常适合PHP程序员了。
首先,PHP是在自由开放的环境中诞生和成长的一门语言。在世界各地,有成千上万的程序员,他们一直在为PHP的完美而不断奋斗,他们也愿意和别人分享自己的聪明才智和自己编写的代码。你每天都可以从一些PHP网站、邮件列表、新闻组发现大量的优秀的程序代码。这样说,我并不是鼓励你整天等着让别人为你编写代码,但是你可以“站在伟人的肩膀上”,充分发扬“拿来主义”,聪明地应用别人的程序代码可以节省你大量时间。其次,在PHP中,你可以方便地建立自己的函数库,这样可以在你以后编写程序时省去很多麻烦。
下面笔者为大家介绍几个通用的函数,这些函数有的来自网上的一些开放源代码的项目,有的精选自邮件列表。如果你能把它们加入到你自己的函数库中,迟早你将会发现自己受益无穷。
1.通用数据库处理函数
和其它的CGI函数相比,PHP的优点之一是具有很强大的数据库处理能力。但是,在PHP中,对于不同的数据库都使用一些特定的函数来专门处理,缺少通用的数据库处理函数。这大大降低了程序代码的可移植性,这也为初学编程的朋友带来了很多不便。
在网上,许多程序员都通过封装类解决了这个问题。他们编写了统一的函数用来处理任何流行的数据库——不管是在Linux世界深受欢迎的Mysql还是在Windows平台上广泛流行的SqlServer。就笔者个人来说,非常喜欢使用这些函数,因为可以直接使用一些简单的诸如"query"、"next_record"之类的函数,而不需要考虑数据库的连接、数据库句柄这些复杂的东西,更不需要考虑使用的是何种数据库。
如果你需要这些函数,你可以通过访问以下的几个网址而得到:
http://phplib.netuse.de/
http://phpclasses.UpperDesign.com/browse.html/package/20
http://phpdb.linuxbox.com/
2.变量调试函数
PHP程序的调试一直是一件让人头疼的事,它既不像VB等高级语言那样有集成的编译调试环境,也不想Perl那样可以在Linux或者DOS环境下直接运行。其实,我们完全可以通过灵活地使用echo语句来完成对PHP的调试工作。
下面的几个函数可以让你随时查看程序中任何变量的类型及其值。
function ss_array_as_string (&$array, $column = 0) {
$str = "Array(
n";
while(list($var, $val) = each($array)){
for ($i = 0; $i < $column+1; $i++){
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
}
$str .= $var. ==> ;
$str .= ss_as_string($val, $column+1)."
n";
}
for ($i = 0; $i < $column; $i++){
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
}
return $str.);
}
function ss_object_as_string (&$object, $column = 0) {
if (empty($object->classname)) {
return "$object";
}
else {
$str = $object->classname."(
n";
while (list(,$var) = each($object->persistent_slots)) {
for ($i = 0; $i < $column; $i++){
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
}
global $$var;
$str .= $var. ==> ;
$str .= ss_as_string($$var, column+1)."
n";
}
for ($i = 0; $i < $column; $i++){
$str .= "&nbsp;&nbsp;&nbsp;&nbsp;";
}
return $str.);
}
}
function ss_as_string (&$thing, $column = 0) {
if (is_object($thing)) {
return ss_object_as_string($thing, $column);
}
elseif (is_array($thing)) {
return ss_array_as_string($thing, $column);
}
elseif (is_double($thing)) {
return "Double(".$thing.")";
}
elseif (is_long($thing)) {
return "Long(".$thing.")";
}
elseif (is_string($thing)) {
return "String(".$thing.")";
}
else {
return "Unknown(".$thing.")";
}
}
需要的时候,在程序中简单地加入下面的一条代码即可查看程序中的所使用的变量(包括数组和对象)的类型和值:
echo ss_as_string($my_variable);
使用下面的语句,我们可以直接查看程序中所有的变量的值:
echo ss_as_string($GLOBALS);
3. 控制Log信息的函数
调试PHP程序的另外一种重要的方法就是查看Log信息。如果能够方便地控制Log信息的级别以及Log信息的显示内容,将会给程序调试带来更多的便利。下面的几个函数可以方便地实现这个功能。
$ss_log_level = 0;
$ss_log_filename = /tmp/ss-log;
$ss_log_levels = array(
NONE => 0,
ERROR => 1,
INFO => 2,
DEBUG => 3);
function ss_log_set_level ($level = ERROR) {
global $ss_log_level;
$ss_log_level = $level;
}
function ss_log ($level, $message) {
global $ss_log_level, $ss-log-filename;
if ($ss_log_levels[$ss_log_level] < $ss_log_levels[$level]) {
// 不显示Log信息
return false;
}
$fd = fopen($ss_log_filename, "a+");
fputs($fd, $level. - [.ss_timestamp_pretty().] - .$message."n");
fclose($fd);
return true;
}
function ss_log_reset () {
global $ss_log_filename;
@unlink($ss_log_filename);
}
在上面的函数中,有四个Log级别变量。运行PHP程序时,只有当Log的级别低于预设的级别值时,Log信息才可以被记录和显示出来。例如,在程序中加入如下的一条语句:
ss_log_set_level(INFO);
那么,运行PHP程序时,只有ERROR和INFO级别的LOG信息才能被记录和显示出来,DEBUG级的信息则被忽略了。除此之外,我们还可以设定显示的信息内容,其语句如下:
ss_log(ERROR, "testing level ERROR");
ss_log(INFO, "testing level INFO");
ss_log(DEBUG, "testing level DEBUG");
你也可以随时使用下面的语句清空LOG信息:
ss_log_reset();
4.速度测试函数

为了优化代码,我们需要一种可以测试代码运行时间的方法,从而来选择最优的代码。下面的函数可以测试运行代码所需的时间:
function ss_timing_start ($name = default) {
global $ss_timing_start_times;
$ss_timing_start_times[$name] = explode( , microtime());
}
function ss_timing_stop ($name = default) {
global $ss_timing_stop_times;
$ss_timing_stop_times[$name] = explode(, microtime());
}
function ss_timing_current ($name = default) {
global $ss_timing_start_times, $ss_timing_stop_times;
if (!isset($ss_timing_start_times[$name])) {
return 0;
}
if (!isset($ss_timing_stop_times[$name])) {
$stop_time = explode(, microtime());
}
else {
$stop_time = $ss_timing_stop_times[$name];
}
$current = $stop_time[1] - $ss_timing_start_times[$name][1];
$current += $stop_time[0] - $ss_timing_start_times[$name][0];
return $current;
}
现在可以轻松地检查任何一段代码的执行时间了,甚至我们可以同时使用多个计时器,只需在使用上述的几个函数时设定不同的参数作为计时器的名称就可以了。
5.调试和优化数据库的操作
对于数据库来说,运行速度是至关重要的。尽管很多书籍和文章都讲授了一些快速运行数据库的方法,但是所有的方法都必须经过实践的检验。下面我们将把PHPLib函数库中的query()函数和上面介绍的几个函数综合起来编写成新的query()函数,和原先的函数相比,这个函数增加了运行时间的监测功能。
function query($Query_String, $halt_on_error = 1) {
$this->connect();
ss_timing_start();
$this->Query_ID = @mysql_query($Query_String,$this->Link_ID);
ss_timing_stop();
ss_log(INFO, ss_timing_current(). Secs - .$Query_String);
$this->Row = 0;
$this->Errno = mysql_errno();
$this->Error = mysql_error();
if ($halt_on_error && !$this->Query_ID) {
$this->halt("Invalid SQL: ".$Query_String);
}
return $this->Query_ID;
}


二、编写漂亮的代码
1.将后台程序与前端程序分开
在编写PHP程序时,有些代码是用来处理一些事务,例如操作数据库、进行数学运算等,而另外的一些代码则只是事务处理的结果显示出来,例如一些使用echo语句将结果以HTML的格式显示在Web浏览器上的PHP代码以及那些直接嵌入PHP程序的HTML代码。首先我们应该清晰地区分这两种代码,把前者称为后台程序,把后者称为前端程序。
因为PHP是一种嵌入式编程语言,也就是说,所有的PHP代码都可以嵌入到HTML代码之中,这为程序的编写带来了许多便利之处。但是,“物极必反”,如果在一段较长的程序中将PHP代码和HTML代码混合编写,这将使程序杂乱无章,不利于程序的维护和阅读。所以我们需要尽可能地将这些程序中混杂于HTML代码中的PHP代码移植出来,在专门的文件中将这些代码封装成函数,然后在HTML代码中使用include语句来包含这些文件,在适当的位置调用这些函数即可。
这种做法一方面使HTML代码和PHP代码都简单易读,另一方面因为HTML代码需要不断更新,而这种分离的方法可以确保后台程序不会被破坏。
同前端程序不同,后台程序更多追求的是稳定、结构化,极少更改,所以应该认真地设计和管理。其实,在设计台程序时,投入大量时间是值得的,“现在栽树,以后乘凉”,在以后的设计工作中将可以轻松地使用现在编写的后台程序。
2.灵活使用包含文件
正如前面所说的那样,后台程序应当安排在一系列的包含文件中。包含文件可以通过include语句在需要时动态装入,也可以在php.ini文件中通过使用auto_prepend_file指令预先自动装入。
如果使用后一种方法的话,虽然取得了一劳永逸的好处,但是也有一些缺点值得我们注意。下面的一段代码向我们展示了解析一个庞大的包含文件需要一定的时间:
require(timing.inc);
ss_timing_start();
include(test.inc);
ss_timing_stop();
echo
.ss_timing_current().
;
?>
在上面的代码中,test.inc是一个1000行的包含文件,运行的结果显示,解析这个包含文件花费了0.6秒钟,对于一个大型网站来说,这个速度并不是可以忽略不记的。
使用包含文件的另外一个缺点是:如果一个文件中的一个语句发生错误,将会使整个网站的PHP程序都无法运行。所以使用起来也及其小心。
其实,对包含文件稍做处理,即可以使包含文件只在需要时进行解析。下面的代码使abc.inc文件只在程序需要时才作解析:
if ( defined( __LIBA_INC) ) return;
define( __LIBA_INC, 1 );
/*
* 代码...
*/
?>
3.使用面向对象的编程方法
PHP也是一种面向对象的语言,面向对象的编程方法是优秀的程序员们非常推崇的一种软件设计方法,在PHP编程中可以充分发挥面向对象语言的优势,对编程中的对象进行封装。在前面的代码中,我们使用了面向对象的方法,例如在管理数据库时,我们将query()函数封装进数据库类中,这极大地方便了代码的管理,增加了程序的可读性。
三、追求程序速度,而不是编程的速度
在网站建设中,程序运行速度和网页下载速度都是关系成败的重要因素。作为一名Web程序员,应该更加注意代码的运行速度。下面介绍的几种方法都在不同程度上提高了代码的运行速度。
1.使用内嵌的HTML代码,而不是PHP的echo语句。
因为PHP是一门嵌入式Web编程语言,可以将HTML代码和PHP代码相互嵌入。但是很多程序员担心在HTML代码中过多的使用""嵌入PHP代码会多次调用PHP解释器,从而降低了PHP代码的运行速度,所以宁愿使用PHP的echo语句来输出HTML代码,而不直接使用HTML代码。但事实却恰恰相反。每一个PHP页面只调用一次PHP解释器来解释所有的PHP代码,所以,只在需要时才嵌入PHP代码,而大多数的时候直接使用HTML代码输入结果,不但不会降低程序的运行速度,而且因为减少了对echo语句的解析,往往可以提高代码的运行速度。
下面的一段代码证明了我们的结论。在这段代码中,我们使用了前面介绍的时间测试函数。


使用str-replace而不是ereg-replace
习惯使用Perl进行编程的程序员更加愿意使用ereg_replace完成字符串替换工作,因为在PHP中ereg_replace的用法和Perl中模式匹配的用法相近。但是,下面的这段代码证明,使用str_replace 代替 ereg_replace将可以大大提高代码的运行速度。

测试str_replace和ereg_replace的运行速度

//这段代码测试str_replace的运行速度


emphasis; ?>

for ($i=0; $i<1000; $i++) {
str_replace(i>, b>, $string).
;
}
?>

//这段代码测试ereg_replace的运行速度




for ($i=0; $i<1000; $i++) {
ereg_replace(<([/]*)i>, <\\1b>, $string).
;
}
?>






//打印结果


结论

使用str_replace的时间 -


使用ereg_pattern的时间 -
运行上面的代码,得到的结果是:
使用str_replace的时间 - 0.089757
使用ereg_pattern的时间 - 0.248881
从运行的结果我们可以看出使用str_replace替代ereg_replace作为字符串替换函数,极大地提高了代码的运行速度。
3.注意字符串的引用
PHP和其它很多编程语言一样,可以使用双引号(\"\")来引用字符串,也可以使用单引号()。但是在PHP中,如果使用双引号来引用字符串,那么PHP解析器将首先分析字符串中有没有对变量的引用,有变量的话,将对变量进行替换。如果是单引号,则没有如此复杂——直接将单引号包含起来的所有字符串直接显示出来。显然,在PHP编程中,如果使用单引号引用字符串变量要比使用双引号快速一些。
4.在数据库中避免使用联合操作
比起其它的Web编程语言来说,PHP的数据库功能十分强大。但是在PHP中数据库的运行仍然是一件十分费时费力的事情,所以,作为一个Web程序员,要尽量减少数据库的查询操作,同时应该为数据库建立适当的索引。另一件值得注意的事情是在用PHP操作数据库时,尽可能不使用多个数据表的联合操作,尽管联合操作可以增强数据库的查询功能,但是却大大增加了服务器的负担。
为了说明这个问题,我们可以看看下面的这个简单的例子。
我们在数据库中创建了两个数据表foo和big_foo。在数据表foo中,只有一个字段,包含了从1-1000之间的所有自然数。数据表big_foo同样只有一个字段,但包含了从1-1,000,000之间的全部自然数。所以,从大小上说,big_foo等于foo与它自身进行了联合操作。
$db->query(\"select * from foo\");
0.032273 secs
$db->next_record();
0.00048999999999999 secs
$db->query(\"insert into foo values (NULL)\");
0.019506 secs
$db->query(\"select * from foo as a, foo as b\");
17.280596 secs
$db->query(\"select * from foo as a, foo as b where a.id > b.id\");
14.645251 secs
$db->query(\"select * from foo as a, foo as b where a.id = b.id\");
0.041269 secs
$db->query(\"select * from big_foo\");
25.393672 secs
从上面操作结果我们可以发现,对于两个有1000条记录的数据表进行联合,其速度并不比对一个1000000条纪录的大型数据表单独进行操作快多少。
5.注意include与require的区别
在PHP变成中,include()与require()的功能相同,但在用法上却有一些不同,include()是有条件包含函数,而require()则是无条件包含函数。例如在下面的一个例子中,如果变量$somgthing为真,则将包含文件somefile:
if($something){
include(\"somefile\");
}
但不管$something取何值,下面的代码将把文件somefile包含进文件里:
if($something){
require(\"somefile\");
}
下面的这个有趣的例子充分说明了这两个函数之间的不同。
$i = 1;
while ($i < 3) {
require(\"somefile.$i\");
$i++;
}
在这段代码中,每一次循环的时候,程序都将把同一个文件包含进去。很显然这不是程序员的初衷,从代码中我们可以看出这段代码希望在每次循环时,将不同的文件包含进来。如果要完成这个功能,必须求助函数include():
$i = 1;
while ($i < 3) {
include(\"somefile.$i\");
$i++;
}
6.注意echo和print的区别
PHP中echo和print的功能也基本相同,但是两者之间也有细微差别。在PHP代码中可以把print作为一个普通函数来使用,例如执行下面的代码后变量$res的值将为1。
$ret = print \"Hello World\";
这意味着print可用在一些复杂的表达式中,而echo则不行。同样,在代码中echo语句的运行速度要略微快于print语句,因为echo语句不要求返回任何数值.

http://www.utspeed.com/htmldata/1/2005_10/article_3_1.html
http://bbs.utspeed.com/index.php ... eply13786reply13786
网站推广软件《登录奇兵》数据添加器1.1发布 - 2005-10-29 23:21:43 pm - niuboy
说明:
进一步了解《登录奇兵》中数据的特殊性,完善了引擎网站所添加数据与《登录奇兵》的结合,使得数据添加的能用性提高。
用户数据添加操作中,数据如果不符合条件,会给出提示,避免提交无效数据。
下载:http://proxy123.com.ru/download/addurlhack1.10.rar

网站推广软件《登录奇兵》数据添加器1.0发布
--------------------------------------------------------------------------------
落伍首度发布简介:给网站推广软件《登录奇兵》添加引擎登录数据。
里面附上动画教程。
只支持不需要验证和登陆的网站。
比如,访客留言板、blog博客、引擎登陆等。
适用于《登录奇兵》3.x
作者:niuboy
作者网站:http://www.utspeed.com
下载:网站推广软件《登录奇兵》数据添加器1.0发布如果不能够运行,请下载下面的运行支持库
http://proxy123.com.ru/download/library_proxygo.rar

使用简要说明:
数据添加部分,按照我的教程做。然后运行登录奇兵(我在帖子里面给了下载地址了)。需要先安装登录奇兵,把软件放在同一目录内.
特别注意:addurlhack.dbf 和《登陆奇兵》默认数据库不能够用本软件打开,请按照动画教程的操作去做。

http://www.utspeed.com/message.php?action=view&commentid=5
登录奇兵v3.01注册版 (附正版数据库,已经过校验这一个 - 2005-10-27 13:56:48 pm - niuboy
http://soft.vv66.com/li1/2292.zip

     
[ 2005/12/04 01:36 | by 网络毛毛虫 ]

启动 Windows 资源管理器。
浏览到 C:\Program Files\Common Files\System\MSADC
右键单击文件夹,然后在快捷菜单中单击属性。
在属性对话框中,单击安全性选项卡,然后检查 Everyone 组是否具有完全控制权限。
如果 Everyone 组没有完全控制权限,则执行下列步骤:
单击添加,然后在“选择用户、计算机或组”对话框的底部键入 Everyone。
单击确定。
确保选中了允许列的完全控制对话框。
启用父目录

echo send_mail('test@test.com','发信标题','发信内容');


function send_mail($to, $subject = 'No subject', $body) {
$loc_host = "#"; //发信计算机名,可随意
$smtp_acc = "#"; //Smtp认证的用户名,
$smtp_pass="password"; //Smtp认证的密码,一般等同pop3密码
$smtp_host="#"; //SMTP服务器地址,类似 smtp.tom.com
$from="#"; //发信人Email地址,你的发信信箱地址
$headers = "Content-Type: text/plain; charset=\"gb2312\"\r\nContent-Transfer-Encoding: base64";
$lb="\r\n"; //linebreak

$hdr = explode($lb,$headers); //解析后的hdr
if($body) {$bdy = preg_replace("/^\./","..",explode($lb,$body));}//解析后的Body

$smtp = array(
//1、EHLO,期待返回220或者250
array("EHLO ".$loc_host.$lb,"220,250","HELO error: "),
//2、发送Auth Login,期待返回334
array("AUTH LOGIN".$lb,"334","AUTH error:"),
//3、发送经过Base64编码的用户名,期待返回334
array(base64_encode($smtp_acc).$lb,"334","AUTHENTIFICATION error : "),
//4、发送经过Base64编码的密码,期待返回235
array(base64_encode($smtp_pass).$lb,"235","AUTHENTIFICATION error : "));
//5、发送Mail From,期待返回250
$smtp[] = array("MAIL FROM: <".$from.">".$lb,"250","MAIL FROM error: ");
//6、发送Rcpt To。期待返回250
$smtp[] = array("RCPT TO: <".$to.">".$lb,"250","RCPT TO error: ");
//7、发送DATA,期待返回354
$smtp[] = array("DATA".$lb,"354","DATA error: ");
//8.0、发送From
$smtp[] = array("From: ".$from.$lb,"","");
//8.2、发送To
$smtp[] = array("To: ".$to.$lb,"","");
//8.1、发送标题
$smtp[] = array("Subject: ".$subject.$lb,"","");
//8.3、发送其他Header内容
foreach($hdr as $h) {$smtp[] = array($h.$lb,"","");}
//8.4、发送一个空行,结束Header发送
$smtp[] = array($lb,"","");
//8.5、发送信件主体
if($bdy) {foreach($bdy as $b) {$smtp[] = array(base64_encode($b.$lb).$lb,"","");}}
//9、发送“.”表示信件结束,期待返回250
$smtp[] = array(".".$lb,"250","DATA(end)error: ");
//10、发送Quit,退出,期待返回221
$smtp[] = array("QUIT".$lb,"221","QUIT error: ");

//打开smtp服务器端口
$fp = @fsockopen($smtp_host, 25);
if (!$fp) echo "<b>Error:</b> Cannot conect to ".$smtp_host."<br>";
while($result = @fgets($fp, 1024)){if(substr($result,3,1) == " ") { break; }}

$result_str="";
//发送smtp数组中的命令/数据
foreach($smtp as $req){
//发送信息
@fputs($fp, $req[0]);
//如果需要接收服务器返回信息,则
if($req[1]){
//接收信息
while($result = @fgets($fp, 1024)){
if(substr($result,3,1) == " ") { break; }
};
if (!strstr($req[1],substr($result,0,3))){
$result_str.=$req[2].$result."<br>";
}
}
}
//关闭连接
@fclose($fp);
return $result_str;
}
?>

SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。


要明白这种攻击的基本原理,还是要从TCP连接建立的过程开始说起:

大家都知道,TCP与UDP不同,它是基于连接的,也就是说:为了在服务端和客户端之间传送TCP数据,必须先建立一个虚拟电路,也就是TCP连接,建立TCP连接的标准过程是这样的:

首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;

第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。

第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。

以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)。


问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。



从防御角度来说,有几种简单的解决方法,第一种是缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度 xSYN Timeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间,例如设置为20秒以下(过低的SYN Timeout设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。

 第二种方法是设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续受到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃。

 可是上述的两种方法只能对付比较原始的SYN Flood攻击,缩短SYN Timeout时间仅在对方攻击频度不高的情况下生效,SYN Cookie更依赖于对方使用真实的IP地址,如果攻击者以数万/秒的速度发送SYN报文,同时利用SOCK_RAW随机改写IP报文中的源地址,以上的方法将毫无用武之地。
一、概述

  本文针对园区网尤其是校园网存在的RPOXY代理问题,进行了详细的技术说明,并针对不同的应用情况提出了多种解决方案。

  其实,PROXY问题存在于两个方面: 一是利用PROXY发表反动言论,二是利用PROXY逃避计费。利用PROXY发表反动言论是一个应用层的问题,可以采用对于FTTP、FTP、URL等内容过滤的方式实现对非法言论的控制和追踪,对于目前的应用,该问题可以得到有效解决。而利用PROXY逃避计费的方式是一个相当复杂的技术问题,需要从用户认证、访问控制、过滤、安全扫描、计费、防黑客、日志追踪分析等多个方面全面考虑。业界也有厂家如华为等有系列相关产品提供防PROXY代理的解决方案。

  此外,安全问题不仅仅是一个技术问题,更多的是一个管理和制度约束问题,这涉及到计算机和网络信息安全,甚至是黑客攻击、机密泄漏、非法信息发布等问题,这在世界各国包括国内已经有若干法规制度进行约束。

  对于采用PROXY进行的网络活动,一些制度也明文规定:通过PROXY进行的一切网络活动,都应该由PROXY的拥有者担负责任,甚至是连带责任——这也是Internet上比较通行的一个原则:即通过跳板发起的攻击,是由跳板的拥有者,而不是攻击者负责任。以前国内相当多的免费SMTP服务器被国外服务器所攻占利用作为再次攻击的跳板,就是按照这一原则行事的;现在WEB上也有很多私人代理服务器只对信任用户开放,也是基于对安全责任的考虑。

  二、采用PROXY应用技术原理

  采用PROXY应用的技术主要有以下三种方式,包括采用实体物理双网卡的形式和虚拟双网卡的方式,当然采用拨号上网+物理网卡PROXY的形式也属于虚拟双网卡。

  ●双网卡方式的PROXY,即:

  |Web Server|------|Router|----Card A----|PROXY server|----Card B------|client|

  |-------外网---------- -- -- -- ----|------------内网--------- --|

  内网完全可以做到对外网的隐藏的,外网的所有设备只能看得到PROXY server是一个标准的、只有一块Card A的PC机。因为PROXY完全是一个应用层的中继,在外网的表现和普通web server客户端没有任何区别。

  ●双网卡方式的NAT,即:

  |Web Server|------|Router|----Card A----|NAT|----Card B------|client|

  |-------外网--------------------------|-------- -内网-----|

  外网可以通过对流的监控检测出NAT行为来,因为通过NAT转换的报文中,往往还会带有内网的IP地址,通过对内网地址的统计性分析,可以找到NAT服务器。

   对一般用户来说,建NAT比建PROXY技术要求要高,所以学生群体等不一定会用这种方式进行内外网互连。

  ●如果采用的是单网卡方式的Porxy,即

  |Web Server|------|Router|----Card A----|PROXY server|

  |client| 

  这种情况下,PROXY server开放的代理端口就必须会暴露到外网上,可以通过扫描工具很容易的从外网进行PROXY的扫描从而发现;我们可以把这种扫描工具集成到网管系统上,每天定时启动、工作、报表即可。但是如果存在有意提供网络共享的用户,一般不会采取这种对他自己非常不利的方法;而且,用户可以通过终端PC防火墙的方式对抗扫描。
   单网卡NAT和代理理论上可以做到,但一般的学生达不到这样的技术水平,况且对于一些有意提供网络共享的用户也不会采用,所以可以不考虑该种方式。

  三、技术上的多种解决途径

  1. 认证的方式

  (1)采用802.1X认证客户端的扩展版

  采用802.1X认证客户端的扩展版,该版本软件不仅可以实现对客户端用户的认证,而且客户端程序可以获取客户端的一些网络信息、服务信息,如双网卡的配置,同时客户端软件可以与服务器进行实时通信实现心跳检测和监控(包括认证过程和上网过程两个阶段),上级接入设备一旦发现用户端采用了PROXY等方式上网,将发出警告信息并终止对用户提供的接入服务。

  处理流程:

  (a)交换机上通过命令行指定哪些端口或VLAN启动该特性;

  (b)用户安装客户端软件,交换机间隔一定时间来询问是否配置了双网卡PROXY方式;
  (c)如果没有应答或是应答为双网卡方式,则下线;对于正常合法用户不受影响。

  这种方式的主要考虑是校园网的绝大多数用户为学生,作为校园网的受益者是可以接受安装一个客户端软件的代价的,而教师网段可以不受此限制。

  优点:

  (a)可以通过客户端和上级设备的扩展较容易实现PROXY检测和控制;

  (b)对于PROXY等的检测准确无误;

  (c)在政府、军事部门对用户管理要求高的地方需求还是很大的,不但是双网卡的问题,对用户同时通过网卡和电话线上网也可实现检测。

  缺点:

  (a)客户端需要适应不同的操作系统,需要有多个版本,如Windows 98、Windows XP、Unix等等;

  (b)最终用户可能会在使用上有情绪意见;

  (c)对于正常使用代理的服务,可能会误检测控制,这需要设备端管理一个合法用户表项,发现PROXY后先判断是否为合法用户使用;

  (d)认证终端可能会被最终用户所CRACK或HACK,丧失正常的检测能力,但是这需要相当高的黑客水平,一般学生无法实现,这也是该问题为何从技术上无法彻底解决的问题,解决方法只可能对大多数普通用户有效,一些真正的高水平黑客可能会破解,所谓道高一尺、魔高一丈;
  (e)需要由运营商或学校出面确认,是客户需要所提供的监控程序。

  (2)采用WEB认证方式

   采用WEB认证的方式,在用户上网认证时,服务器向用户端推出一个认证界面,该界面实现认证的同时可以通过下载的JAVA APP或者ACTIVX程序中内嵌检测程序(该检测程序用户不可见),检测用户硬件配置,并上报, 当然即使在完成认证之后还可对用户端进行实时检测,进行对主机的心跳检测,获得客户端的网络信息和服务信息等,如802.1X的原理。

  优点:

  (a)可以通过客户端和上级设备的扩展容易的实现PROXY检测和控制;

  (b)对于PROXY等的检测准确无误;

  (c)由于认证界面为主机推送到本地,本地不需要安装任何客户端;

  (d)在政府、军事部门对用户管理要求高的地方需求还是很大的,不但是双网卡的问题,对用户同时通过网卡和电话线上网也可实现检测。

  缺点:

  (a)客户端需要适应不同的操作系统,需要有多个版本,如Windows 98、Windows XP、Unix等等;

  (b)对于正常使用代理的服务,可能会误控制,这需要设备端管理一个合法用户表项,发现PROXY后先判断是否为合法使用;

  (c)可能会被最终用户所CRACK或HACK(如Java Applet等方式),丧失正常的检测能力,但是这需要相当高的黑客水平,一般学生无法实现;
  (d)需要由运营商或学校出面确认,是客户需要所提供的监控程序。

  2. 网络异常扫描的方式

  (1)公网地址之间的转换

  采用PROXY代理的两端都采用公网地址的形式,非私网地址到公网的NAT转换,这时通过网管或者专用的扫描软件可以实现对内外网的客户端进行扫描,获得真实组网情况,并进行控制。

  优点:

  (a)实现容易,仅需要网管或专用的网络扫描软件;

  (b)对于采用公网地址之间的PROXY转换可以实现准确检测。

  缺点:

  (a)扫描速度比较慢,如果网络主机比较多的话达到几千台,每进行一个深度扫描循环可能会消耗一天左右的时间;

  (b)只能扫描网管可达的主机,对于采用公私网地址之间转换的代理可能无法实现准确扫描,除非该PROXY打开转发选项开关。

  (2)公私网地址之间的转换

  如果安装了双网卡的机器保护不是特别得好(如PROXY主机没有安装防火墙等程序),而且又打开了转发选项的话,有可能从外网网管站通过SNMP获知到该情况;但PROXY用户可以自主屏蔽这个漏洞。

  优点:

  (a)实现容易,仅需要网管或专用的网络扫描软件;

  (b)对于采用公网地址之间的PROXY转换、以及打开转发开关的PROXY可以实现准确检测。

  缺点:

  (a)扫描速度比较慢,如果网络主机比较多的话达到几千台,每进行一个深度扫描循环可能会消耗一天左右的时间;

  (b)对于采用公私网地址之间转换的代理可能无法实现准确扫描,除非PROXY打开转发选项开关。如宿舍中一台PC作PROXY,通过hub接多台PC,虽然PROXY server安装双网卡,但是对扫描软件来说,内部网卡不可见。

   理论上是不可能从网络侧对这样的终端行为进行监控的。当然,从网络侧对第二种形式的组网进行双网卡检测更是相当困难的。
  3. 用户带宽流量限制的方式

  (1)限制用户带宽

  可对接入设备进行配置控制,采用两元组(源IP/目的IP)的方式对每用户带宽进行限制,造成PROXY用户共享带宽时速度缓慢感到不方便;
   优点:

  (a)实现容易,仅需要对现有设备配置管理就可实现;

  (b)避免升级软件或客户端,避免引起纠纷,可避免程序被CRACK;

  (c)倡导用户服务质量为中心的整体思路;

  (d)采用两元组的方式对流量进行控制,可以准确的保证点到点之间的预约流量,对于PROXY代理的控制尤其合适,避免采用五元组的方式造成“只见树木,不见森林”,因为采用五元组只能对一些具体的TCP或UDP等连接进行流量控制,而不可能确切的知道到底有多少条什么样的连接,分别对每条连接应该如何限制。此外控制复杂也是五元组流量限制的弊端。

  缺点:

  无法彻底避免代理,对于愿意使用服务质量差的PROXY用户无法彻底禁止。

  (2)限制用户连接数

  通过对接入设备进行配置,限制接入用户TCP连接数目,如一个用户分配10个连接,这样PROXY代理将会造成最终用户的不方便而无法正常使用。

  优点:

  (a)实现容易,仅需要现有设备配置管理;

  (b)避免升级软件或客户端,避免引起纠纷,可避免程序被CRACK;

  (c)倡导用户服务质量为中心的整体思路;

  (d)这也是两元组控制所独特的优势。

  缺点:

  无法彻底避免代理,对于愿意使用服务质量差的PROXY用户无法彻底禁止。

  4. 流量计费的方式

  如果是因为PROXY接入的流量影响了运营商的整体收入,可以考虑采用流量计费的方式。

  可以对用户的流量进行限制、采用流量计费的方法,具体实现可以采用单独的流量计费、或时长+流量计费、或流量包月+流量计费等多种方式(超过一定限度的流量进行额外收费)。

  优点:

  (a)依靠设备可以实现;

  (b)倡导用户服务质量为中心的整体思路、可采取按流量计费的合理消费观念(消费多付帐多、消费少付帐少)。

  缺点:

  在运营管理方面要比以往计费方式如包月、跳档制复杂,但这也是新业务开展的新需要。

  5. 内容扫描过滤的方式

  通过对出口流量进行监控,例如采用基于内容或状态的防火墙,或是通过端口镜像分析报文内容,可以定位带有非法内容、非法字段的报文,从而采取相应的措施,如断掉相应的TCP连接或是禁止相应的站点等,这是根治非法言论、非法信息这一问题的最好办法。当然也可以防止通过校外的PROXY发布相应的信息。

  实现方式:

  (1)NE80等路由器及接入交换机上支持端口镜像,可与入侵检测系统、内容过滤防火墙等配合实现内容过滤;

  (2)在校园网出口处添加应用层过滤软件或防火墙,对特定字段模式进行过滤--校园的出口流量可以这样进行监控;

  (3)在BBS等服务器上添加关键词过滤模块,这个已经在绝大多数BBS/WEB 论坛上实现了;校内的论坛也可以这样进行监控;

  (4)对出口记录、言论信息、NAT转换等做日志存档,并进行分析审计,做到有案可查、有据可依,保证问题可追踪,确定责任人。

  优点:

  (a)可充分利用路由器、防火墙设备的报文过滤、状态检测等特性;可利用路由器、交换机、防火墙等设备的日志审计、分析特性,以及网管、认证计费系统等的安全管理特性;

  (b)倡导安全解决方案思路,提出网络业务与安全融合的整体解决方案

  缺点:需要增加防火墙、入侵检测或日志服务器等设备。

  四、总结

  总之,从技术上来看,对于这一问题,根本没有完美的解决方案。PROXY问题现在是业界的难题。这关系到整个网络业务与安全融合的整体解决方案,仅仅依靠单一的技术手段是无法杜绝这一问题的,这需要从用户认证、访问控制、过滤、安全扫描、计费、防黑客、日志追踪分析等多个安全方面全面考虑,推荐使用以下方式配合使用:

  (1)采用路由器报文过滤、防火墙监控、日志追踪分析等方式对非法字段、言论、非法URL进行过滤检测;

  (2)采用网络扫描程序+安全网管对整个网络实时监控,做到用户管理心中有数;

  (3)根据具体用户情况使用802.1X认证客户端或WEB认证的方式;

  (4)充分利用交换机和路由器的用户管理、流量控制、ACL等特性;

  (5)流量计费是用户可管理可运营发展的合理方式,必将逐步取代目前的计费方式。

  当然最好的解决方案就是多种手段综合应用,既要采用多种技术手段配合防护,也要从管理制度的角度出发进行一些规范管制,全面的防范这一问题的发生,使其所造成的危害降到最低。对于采用PROXY进行的网络活动,应该有一些制度规定:通过PROXY进行的一切网络活动,都应该由PROXY的拥有者担负责任或连带责任;对于侵害信息安全的网络用户通过追踪定位,一经查处,将担负刑事责任。

  所谓道高一尺、魔高一丈,尽管通过全面的手段也只能逐步完善解决方案,需要监控、防范、响应、完善等多个阶段周而复始地渐渐提高整个网络设备和业务的安全性。这一安全问题类似于病毒对计算机网络信息的危害一样,只能不断的检测发现、捕捉特征、完善病毒库、再次检测完善等等。

  此外,在实施安全方案考虑的时候,从成本方面也要进行一些分析对比,与客户进行成本分析,对于安全问题的防范所付出的成本代价是否合理。
 
分页: 6/15 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表