月度归档:2012年06月

php写的端口扫描函数

运用php中的socket函数,可以简单的写出一个端口扫描工具,性能不怎么好,不过玩玩儿,够了。

运用fsockopen函数,探测过程中,可能会出现警告信息,加上@就可以了,该函数成功返回句柄,失败返回false。

函数原型如下:

resource fsockopen ( string $hostname [, int $port = -1 [, int &$errno [, string &$errstr [, float $timeout = ini_get(“default_socket_timeout”) ]]]] )
参数分别为,主机名,端口号,错误号,错误信息,检测的超时时间。

扫描函数如下:


function scan($ip){
	$error_no = $error_str = "";
	for ($p = 0; $p < 65535; $p++) {
		if(@fsockopen($ip,$p,&$error_no,&$error_str,1)){
			echo "$p opened! <p>";
		}
	}

}

可以检测一下本机的端口,如果是lamp结构的话,那么80端口应该是打开的,标准的web服务端口。3306应该也是打开的,是mysql的端口。

检测本地主机,速度还是可以的,不过加上远程主机就有点儿麻烦了,超时时间1秒钟,运行完整个程序估计要几个小时吧!建议用cli方式运行,或者用ini_set来调整运行的时间,否则,以网页方式会因为超过请求的限定时间而终止程序。

一个简单的daemon程序

daemon程序称之为系统的服务程序,apache,mysql等都是这类的程序,在后台运行,旨在提供一种服务。这种进程已经拜托掉普通进程那种前端的控制运行在后端。
实现的基本思路如下:首先启动一个外壳进程,他存在的意义,只是提供一个起飞的地方,然后fork出来一个子进程,在子进程代码中,调用setsid拜托父进程的控制,
然后更改一些基本属性,关闭一些打开的文件,然后启动一个死循环,来执行真正要执行的任务。简单的一个代码如下,简单期间,任务函数run中,没有任何代码。

/* daemon.c */
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/stat.h>
#define MAXFILE 65535

void run();

int main()
{
	pid_t pid;
	int i;
        pid=fork();
	if(pid<0){
		printf("error in fork\n");
		exit(1);
	}else if(pid>0) 
		exit(0); 
        setsid();
        chdir("/");
	umask(0);
	for(i=0;i<MAXFILE;i++)
		close(i);
	for(;;){
	   run();
  	   sleep(1);
        }
}

void run() {

}

两个PHP函数–全局变量封装和http验证

_G将所有的全局变量封闭到一个变量内部,便于控制和处理。将设置和取值融合到一个函数中。

/**
 * 全局变量的封存
 */
if(!function_exists('_G')) {
	
	function _G($name,$value = NULL){
		
		if(!isset($GLOBALS['SOCKET_G'])) {
			$GLOBALS['SOCKET_G'] = array();
		} 
		
		static 	$G ;
		$G = $GLOBALS['SOCKET_G'];
		
		if ($value == NULL) { 
			return isset($G[$name]) ? $G[$name] : NULL;
		} else {
			$G[$name] = $value;
			$GLOBALS['SOCKET_G'] = $G;
		}
	}
	
}

http验证,简单的输入用户名密码,可以灵活的修改,只需要修改传递到函数的参数就可以了!

/**
 * 简单的http验证
 * @param string $msg 提示信息
 * @param string $u 验证用的用户名
 * @param string $pwd 验证用的密码
 */
function httpauthen($msg,$u = "admin",$pwd="admin"){

	if(!isset($_SERVER['PHP_AUTH_USER'])) {
		header('WWW-Authenticate: Basic realm="'.$msg.'"');
		header('HTTP/1.0 401 Unauthorized');
		exit();
	} else {
		if($_SERVER['PHP_AUTH_USER'] == $u && $_SERVER['PHP_AUTH_PW'] == $pwd ) {
			return ;
		}else {
			header('WWW-Authenticate: Basic realm="'.$msg.'"');
			header('HTTP/1.0 401 Unauthorized');
			exit();
		}
	}

}