分享一个上传头像的flash组件avatar

首先是这个组件的文档和下载地址:http://asv5.sinaapp.com/widget/avatar.php

当然也有纯js+css版的,可以剪切头像的组件,不过那个要用js计算偏移量和缩放,然后在php端进行图像裁剪处理,用起来太麻烦了,这个组件就不用这么麻烦了,传到php端的就是裁剪好的字节流。

有一个小地方需要注意一下,js里引用flash的文件名第一个字母A大写了,如果是在linux下,会找不到flash文件,因为实际文件名是小写。

另外需要注意的是php端接收数据,传过来的是字节流,不是files数组,所以要用php://input接收:

file_get_contents('php://input')

如果启用接收原图,会把原图和裁剪后的图片通过各自接口都传送到php端,而裁剪后的图片,原以为是多个,实际测试后,发现只传了一个,也许是配置参数没有设置正确?

继续处理2000万住房数据

本来想一步到位,直接从mssql导出到mysql,要么没法导出2000万条,要么要收费,只好退而求其次,先导出csv,然后再导入到mysql。

从mssql导出到csv,用sqlserver management studio就可以了,查询结果右键,就可以导出csv,但是2000万条实在太多,如果导成一个csv文件,导入也会成为问题,所以我分成十次,每次200万条,分批导出。

导出比较顺利,然后用ultraedit将文件编码转换成utf8,方便mysql导入,谁知导入的时候还是有很多麻烦,sqlserver导出的csv文件没加双引号,也没对字段里的回车换行以及逗号,这些特殊字符做处理,遇到含这些字符的行,就会导入失败,只好回头在sqlserver里将这些特殊字符替换掉,含有这些字符的字段有Name、Address,替换逗号比较简单:

update table set Name = replace(Name , ',' , ' ')

回车换行就有点麻烦了,不能用\r\n,必须要这样:

update table set Name = replace(Name , CHAR(13)+CHAR(10) , ' ')

 

捣鼓sqlserver,那注明的2000万某酒店房客

从百度网盘下了1个多G的数据,说是sqlserver的备份数据,很多年没捣鼓过sqlserver了,果断去下一个精简版,速度还挺快,装好后没法还原备份,原来版本不够,最少要sqlserver2008r2版本,只好再去下载2008r2,这里有微软的下载地址:http://download.microsoft.com/download/9/4/8/948966AB-52CA-40F1-8051-0216481065E6/SQLEXPR_x86_CHS.exe,100多M,安装或升级过程略。

因为是精简版,还缺少必要的工具,还要装一个sqlserver manager stadio express,这个忘了在哪下的了,微软官网应该有,也不大。

然后就是启动这个manager stadio,右击数据库菜单,选择“还原数据库(R)”,目标库就是本机装的这个sqlserver服务器了,建一个和备份文件同名的数据库,比如:linshi,数据源就是备份文件.bak了,还要注意选项里,把覆盖现有数据库选项勾上,然后就是漫长的没有任何进度条的导入等待。

大概导了5分钟吧,终于导完了,查看数据也用这个manager stadio,右击库名-》新建查询,直接写sql,然后点sql窗口左上的执行按钮。

怎样导出sql或者其他格式,比如cvs,待续

php运算符优先级的问题

近日从一位大牛的博客看到php运算符优先级的小试题,先来两段代码,看输出什么?

$i = 1;
echo $i + $i++;

 

$i = 1;
echo $i + $i + $i++;

很惊讶吧,竟然都输出3

第一段代码,也许还比较容易理解,++比+优先级高,所以这个表达式是先计算$i++,虽然返回的结果还是1,但在做下一步计算时$i + 1,这里的$i已经是2了,所以结果是3。

那么第二段代码为什么也输出3?据说是连+,按照从左到右顺序执行,最后一步执行$i++,虽然表达式运算完的时候$i是2了,在参与计算的时候还是1,不太容易理解,可以说是费解。

再来一段代码,输出是什么?

$i = 1;
echo ++$i + $i++;

如何解释呢?

上海出差记录,要好好学学英语

前几天去上海出差,对方是家跨国公司,交流的对象是英国和法国人,当然交流的语言还是用英语了,对方总部是在英国。

本人英语是比较差的,只有阅读还凑合,听和说,那就差劲了,同去的有英语很棒的同事,好到可以同声传译的地步,所以交流也没什么大问题。中午休息的时候,和英国人交流了几句,当时翻译不在场,听是听得懂的,就是回答用英语说出来,那就困难了,只能回答比较简单的:yes 或者no,很尴尬,幸好翻译很快就回来了。

日常的一些对话,能听懂,就是不知道怎么回答。正式商务的对话,听起来就吃力了,能听个大概的意思,明白对方在讲什么,但是非常吃力,只能抓一些关键的词,不过很快就跟不上节奏,大脑跟不上就开始神游了,这就是这次出差回来的感受。

要想办法补一下英语。

 

360web后门查杀插件分析

360搞了个网站安全检测的站长工具,地址如下:http://webscan.360.cn/webshell/

360就不去评价了,反正我只有恶评。

下了这个所谓的后门查杀插件,看了一下,其实就是遍历web目录,读取脚本文件,查找一些敏感函数和命令行,最重要的就是这个私有变量:

private $_regex ='(preg_replace.*\/e|`.*?\$.*?`|\bcreate_function\b|\bpassthru\b|\bshell_exec\b|\bexec\b|\bbase64_decode\b|\bedoced_46esab\b|\beval\b|\bsystem\b|\bproc_open\b|\bpopen\b|\bcurl_exec\b|\bcurl_multi_exec\b|\bparse_ini_file\b|\bshow_source\b|cmd\.exe|KAdot@ngs\.ru|小组专用大马|提权|木马|PHP\s?反弹|shell\s?加强版|WScript\.shell|PHP\s?Shell|Eval\sPHP\sCode|Udp1-fsockopen|xxddos|Send\sFlow|fsockopen\("(udp|tcp)|SYN\sFlood)';

一目了然,甚至还试图查找“木马”这样的关键词,真是无语。

完整代码如下:

<?php
define("WEBSCAN_KEY", "xxxx");
date_default_timezone_set('GMT');
ini_set('display_errors', '0');
class scan{
	private $directory = '.';
	private $extension = array('php');
	private $_files = array();
	private $filelimit = 5000;
	private $scan_hidden = true;
	private $_self = '';
	private $_regex ='(preg_replace.*\/e|`.*?\$.*?`|\bcreate_function\b|\bpassthru\b|\bshell_exec\b|\bexec\b|\bbase64_decode\b|\bedoced_46esab\b|\beval\b|\bsystem\b|\bproc_open\b|\bpopen\b|\bcurl_exec\b|\bcurl_multi_exec\b|\bparse_ini_file\b|\bshow_source\b|cmd\.exe|KAdot@ngs\.ru|小组专用大马|提权|木马|PHP\s?反弹|shell\s?加强版|WScript\.shell|PHP\s?Shell|Eval\sPHP\sCode|Udp1-fsockopen|xxddos|Send\sFlow|fsockopen\("(udp|tcp)|SYN\sFlood)';
	private $_shellcode='';
	private $_shellcode_line=array();
	private $_log_array= array();
	private $_log_count=0;
	private $webscan_url="http://safe.webscan.360.cn/webshell/upload";
	private $action='';
	private $taskid=0;
	private $_tmp='';

	function __construct(){
		if (isset($_POST['action'])&&isset($_POST['key'])&&$_POST['key']==WEBSCAN_KEY&&isset($_POST['task'])) {
			$this->action = $_POST['action'];
			$this->taskid = $_POST['task'];
		}
		if (is_writable('./')) {
			$this->_tmp='./';
		}
		elseif (is_writable(sys_get_temp_dir())) {
			$this->_tmp=substr(sys_get_temp_dir(), -1)=='/'||substr(sys_get_temp_dir(), -1)=='\\' ? sys_get_temp_dir() : sys_get_temp_dir().'/';
		}

	}

	private function is__writable($path) {

		if ($path{strlen($path)-1}=='/')
		return is__writable($path.uniqid(mt_rand()).'.tmp');

		if (file_exists($path)) {
			if (!($f = @fopen($path, 'r+')))
			return false;
			fclose($f);
			return true;
		}

		if (!($f = @fopen($path, 'w')))
		return false;
		fclose($f);
		@unlink($path);
		return true;
	}

	private  function json_encode_($arg, $force = true)
    {
        static $_force;
        if (is_null($_force))
        {
            $_force = $force;
        }

        if ($_force && function_exists('json_encode'))
        {
            return json_encode($arg);
        }

        $returnValue = '';
        $c           = '';
        $i           = '';
        $l           = '';
        $s           = '';
        $v           = '';
        $numeric     = true;

        switch (gettype($arg))
        {
            case 'array':
                foreach ($arg AS $i => $v)
                {
                    if (!is_numeric($i))
                    {
                        $numeric = false;
                        break;
                    }
                }

                if ($numeric)
                {
                    foreach ($arg AS $i => $v)
                    {
                        if (strlen($s) > 0)
                        {
                            $s .= ',';
                        }
                        $s .= $this->json_encode_($arg[$i]);
                    }

                    $returnValue = '[' . $s . ']';
                }
                else
                {
                    foreach ($arg AS $i => $v)
                    {
                        if (strlen($s) > 0)
                        {
                            $s .= ',';
                        }
                        $s .= $this->json_encode_($i) . ':' . $this->json_encode_($arg[$i]);
                    }

                    $returnValue = '{' . $s . '}';
                }
                break;

            case 'object':
                foreach (get_object_vars($arg) AS $i => $v)
                {
                    $v = $this->json_encode_($v);

                    if (strlen($s) > 0)
                    {
                        $s .= ',';
                    }
                    $s .= $this->json_encode_($i) . ':' . $v;
                }

                $returnValue = '{' . $s . '}';
                break;

            case 'integer':
            case 'double':
                $returnValue = is_numeric($arg) ? (string) $arg : 'null';
                break;

            case 'string':
                $returnValue = '"' . strtr($arg, array(
                    "\r"   => '\\r',    "\n"   => '\\n',    "\t"   => '\\t',     "\b"   => '\\b',
                    "\f"   => '\\f',    '\\'   => '\\\\',   '"'    => '\"',
                    "\x00" => '\u0000', "\x01" => '\u0001', "\x02" => '\u0002', "\x03" => '\u0003',
                    "\x04" => '\u0004', "\x05" => '\u0005', "\x06" => '\u0006', "\x07" => '\u0007',
                    "\x08" => '\b',     "\x0b" => '\u000b', "\x0c" => '\f',     "\x0e" => '\u000e',
                    "\x0f" => '\u000f', "\x10" => '\u0010', "\x11" => '\u0011', "\x12" => '\u0012',
                    "\x13" => '\u0013', "\x14" => '\u0014', "\x15" => '\u0015', "\x16" => '\u0016',
                    "\x17" => '\u0017', "\x18" => '\u0018', "\x19" => '\u0019', "\x1a" => '\u001a',
                    "\x1b" => '\u001b', "\x1c" => '\u001c', "\x1d" => '\u001d', "\x1e" => '\u001e',
                    "\x1f" => '\u001f'
                )) . '"';
                break;

            case 'boolean':
                $returnValue = $arg?'true':'false';
                break;

            default:
                $returnValue = 'null';
        }

        return $returnValue;
    }

	private function ck_state(){
		$a=fopen($this->_tmp.'scan_lock.tmp', 'w+');
		fwrite($a, "scannig");
		fclose($a);

	}

	public function del_state(){
		$a=fopen($this->_tmp.'scan_lock.tmp', 'w+');
		fwrite($a, '');
		fclose($a);
		@unlink($this->_tmp.'scan_lock.tmp');
		$this->post($this->webscan_url,array('state'=>'1','key'=>WEBSCAN_KEY,'task'=>$this->taskid));
	}

	private function is_utf8($word)
	{
		if (preg_match("/^([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}/",$word) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){1}$/",$word) == true || preg_match("/([".chr(228)."-".chr(233)."]{1}[".chr(128)."-".chr(191)."]{1}[".chr(128)."-".chr(191)."]{1}){2,}/",$word) == true)
		{
			return true;
		}
		else
		{

			return false;
		}
	}

	private	function check_environment()
	{

		$r = array("status"=>1,"allow_url_fopen"=>0,"writeable"=>0);

		if (ini_get('allow_url_fopen')||function_exists('curl_init')) {
			$r["allow_url_fopen"] = 1;
		}

		if ($this->is__writable($this->_tmp.'test.tmp'))
		{
			$r["writeable"] = 1;
		}

		if($r["allow_url_fopen"] && $r["writeable"])
		{
			$r["status"] = 1;
		}
		echo $this->json_encode_($r);
		exit;
	}

	private function webscan_curl($url , $postdata = array()){
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
		curl_setopt($ch, CURLOPT_TIMEOUT, 15);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
		$response = curl_exec($ch);
		$httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
		curl_close($ch);
		return array('httpcode'=>$httpcode,'response'=>$response);
	}

	private function post($url,$log=array()){
		if(! function_exists('curl_init')) {
	 	$postdata = http_build_query($log);
	 	$context = stream_context_create(array('http' => array('method' => 'POST', 'header' => "Content-type: application/x-www-form-urlencoded\r\n",'content' => $postdata)));
	 	$server_version = @file_get_contents($url, 0, $context);
		}
		else{
			$this->webscan_curl($url,$log);
		}

	}

	private function findstr($filepath,$shellstr){
		$a=false;
		$text=@file_get_contents($filepath);
		if(!$this->is_utf8($text)){
			$text=@iconv("GBK","UTF-8",$text);
		}
		$_content = explode("\n", $text);
		for ($line = 0; $line < count($_content); $line++)
		{
			$date = preg_match_all("/".$shellstr."/i", $_content[$line],$matches);
			if($date){
				$this->_shellcode[$line+1]=$_content[$line];
				$a=true;
			}
		}
		return $a;
	}
	private function upload_log($a = array()) {
		if($this->_log_count==50){
			$this->post($this->webscan_url,array('log' => $this->json_encode_($this->_log_array),'key'=>WEBSCAN_KEY,'task'=>$this->taskid));
			$this->_log_count=0;
			$this->_log_array=array();
		}
		else{
			$this->_log_array[]=$a;
			$this->_log_count++;
		}

	}
	private function listdir($dir) {
		$handle = @opendir($dir);
		if ($this->filelimit > 0) {
			if (count($this->_files) > $this->filelimit) {
				return true;
			}
		}
		while (($file = @readdir($handle)) !== false) {
			if ($file == '.' || $file == '..') {
				continue;
			}
			$filepath = $dir == '.' ? $file : $dir . '/' . $file;

			if (is_link($filepath)) {
				continue;
			}
			if (is_file($filepath)) {
				if (substr(basename($filepath), 0, 1) != "." || $this->scan_hidden) {
					$extension = pathinfo($filepath);
					if (is_string($this->extension) && $this->extension == '*') {
						if ($this->filelimit > 0) {
							$this->_files[] = $filepath;
						}
					} else {
						if (isset($extension['extension']) && in_array($extension['extension'], $this->extension)) {
							if ($this->_self != basename($filepath)) {
								if ($this->filelimit > 0) {
									$this->_files[] = $filepath;
								}
							}

						}
					}
				}
			} else if (is_dir($filepath)) {
				if (substr(basename($filepath), 0, 1) != "." || $this->scan_hidden) {
					if (is_readable($filepath)) {
						$this->listdir($filepath);
					}
				}
			}
		}
		closedir($handle);
	}

	private function anaylize() {
		foreach ($this->_files as $file) {
			if(!$this->is_utf8($file)){
				$filename=@iconv("GBK","UTF-8",$file);
			}
			if($this->findstr($file,$this->_regex))
			{

				self::upload_log(array($filename => array('Trojan' => 1,'time' => date("Y-m-d H:i:s",filemtime($file)),'md5'=>md5(file_get_contents($file)),'size'=>filesize($file),'shellcode'=>$this->_shellcode) ));
				$this->_shellcode=array();
			}
			/*	else{
				self::upload_log(array($filename => array('Trojan' => 0)));
				}
				*/
		}
		if ($this->_log_count>0) {
			$this->post($this->webscan_url,array('log' => $this->json_encode_($this->_log_array),'key'=>WEBSCAN_KEY,'task'=>$this->taskid));
		}
		sleep(5);
		$this->del_state();
	}

	private function sendfile()
	{
		$r = array("md5"=>"","info"=>"","content"=>"");
		if (isset($_POST['filename']))
		{
			$filename = $_SERVER['DOCUMENT_ROOT'].'/'.base64_decode($_POST['filename']);

			if (file_exists($filename))
			{
				$r["md5"] = md5(file_get_contents($filename));
				$r["content"]= base64_encode(file_get_contents($filename));
			}
			else {
				$r["info"] = "Cant find selected file";
			}
		}
		else {
			$r["info"] = "No file specified";

		}
		$this->post($this->webscan_url,array('state'=>2,'log' => $this->json_encode_($r),'key'=>WEBSCAN_KEY,'task'=>$this->taskid));
		exit;
	}

	public function start() {
		if($this->action=='del_state'){
			$this->del_state();
		}
		if($this->action=='sendfile'){
			$this->sendfile();
		}
		if (@file_get_contents(($this->_tmp.'scan_lock.tmp'))=='scannig')  {
			exit("scannig");
		}
		switch ($this->action) {
			case 'check_environment':
				$this->check_environment();
				break;
			case 'shell_scan':
				set_time_limit(0);
				ignore_user_abort();
				register_shutdown_function(array($this,"del_state"));
				$this->ck_state();
				$this->listdir($this->directory);
				$this->anaylize();
				$this->del_state();
				break;
			default:
				echo "360webscan v1.5";
				break;
		}
	}

}

$a=new scan();
$a->start();
?>

核心方法就是anaylize,其实里面就是循环调用findstr去匹配敏感词。