1427 lines
38 KiB
PHP
Executable File
1427 lines
38 KiB
PHP
Executable File
<?php
|
||
|
||
if (!defined('IN_ECS'))
|
||
{
|
||
die('Hacking attempt');
|
||
}
|
||
|
||
/**
|
||
* 截取UTF-8编码下字符串的函数
|
||
*
|
||
* @param string $str 被截取的字符串
|
||
* @param int $length 截取的长度
|
||
* @param bool $append 是否附加省略号
|
||
*
|
||
* @return string
|
||
*/
|
||
function sub_str($str, $length = 0, $append = true)
|
||
{
|
||
$str = trim($str);
|
||
$strlength = strlen($str);
|
||
|
||
if ($length == 0 || $length >= $strlength)
|
||
{
|
||
return $str;
|
||
}
|
||
elseif ($length < 0)
|
||
{
|
||
$length = $strlength + $length;
|
||
if ($length < 0)
|
||
{
|
||
$length = $strlength;
|
||
}
|
||
}
|
||
|
||
if (function_exists('mb_substr'))
|
||
{
|
||
$newstr = mb_substr($str, 0, $length, EC_CHARSET);
|
||
}
|
||
elseif (function_exists('iconv_substr'))
|
||
{
|
||
$newstr = iconv_substr($str, 0, $length, EC_CHARSET);
|
||
}
|
||
else
|
||
{
|
||
//$newstr = trim_right(substr($str, 0, $length));
|
||
$newstr = substr($str, 0, $length);
|
||
}
|
||
|
||
if ($append && $str != $newstr)
|
||
{
|
||
$newstr .= '...';
|
||
}
|
||
|
||
return $newstr;
|
||
}
|
||
|
||
/**
|
||
* 获得用户的真实IP地址
|
||
*
|
||
* @access public
|
||
* @return string
|
||
*/
|
||
function real_ip()
|
||
{
|
||
static $realip = NULL;
|
||
|
||
if ($realip !== NULL)
|
||
{
|
||
return $realip;
|
||
}
|
||
|
||
if (isset($_SERVER))
|
||
{
|
||
if (isset($_SERVER['HTTP_CF_CONNECTING_IP']))
|
||
{
|
||
$realip=$_SERVER['HTTP_CF_CONNECTING_IP'];
|
||
}
|
||
elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
|
||
{
|
||
// $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
|
||
|
||
/* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
|
||
/*
|
||
foreach ($arr AS $ip)
|
||
{
|
||
$ip = trim($ip);
|
||
|
||
if ($ip != 'unknown')
|
||
{
|
||
$realip = $ip;
|
||
|
||
break;
|
||
}
|
||
}
|
||
*/
|
||
$realip=$_SERVER['HTTP_X_FORWARDED_FOR'];
|
||
}
|
||
elseif (isset($_SERVER['HTTP_CLIENT_IP']))
|
||
{
|
||
$realip = $_SERVER['HTTP_CLIENT_IP'];
|
||
}
|
||
else
|
||
{
|
||
if (isset($_SERVER['REMOTE_ADDR']))
|
||
{
|
||
$realip = $_SERVER['REMOTE_ADDR'];
|
||
}
|
||
else
|
||
{
|
||
$realip = '0.0.0.0';
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (getenv('HTTP_X_FORWARDED_FOR'))
|
||
{
|
||
$realip = getenv('HTTP_X_FORWARDED_FOR');
|
||
}
|
||
elseif (getenv('HTTP_CLIENT_IP'))
|
||
{
|
||
$realip = getenv('HTTP_CLIENT_IP');
|
||
}
|
||
else
|
||
{
|
||
$realip = getenv('REMOTE_ADDR');
|
||
}
|
||
}
|
||
|
||
// preg_match("/[\d\.]{7,15}/", $realip, $onlineip);
|
||
// $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';
|
||
|
||
return $realip;
|
||
}
|
||
|
||
/**
|
||
* 计算字符串的长度(汉字按照两个字符计算)
|
||
*
|
||
* @param string $str 字符串
|
||
*
|
||
* @return int
|
||
*/
|
||
function str_len($str)
|
||
{
|
||
$length = strlen(preg_replace('/[\x00-\x7F]/', '', $str));
|
||
|
||
if ($length)
|
||
{
|
||
return strlen($str) - $length + intval($length / 3) * 2;
|
||
}
|
||
else
|
||
{
|
||
return strlen($str);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获得用户操作系统的换行符
|
||
*
|
||
* @access public
|
||
* @return string
|
||
*/
|
||
function get_crlf()
|
||
{
|
||
/* LF (Line Feed, 0x0A, \N) 和 CR(Carriage Return, 0x0D, \R) */
|
||
if (stristr($_SERVER['HTTP_USER_AGENT'], 'Win'))
|
||
{
|
||
$the_crlf = '\r\n';
|
||
}
|
||
elseif (stristr($_SERVER['HTTP_USER_AGENT'], 'Mac'))
|
||
{
|
||
$the_crlf = '\r'; // for old MAC OS
|
||
}
|
||
else
|
||
{
|
||
$the_crlf = '\n';
|
||
}
|
||
|
||
return $the_crlf;
|
||
}
|
||
|
||
/**
|
||
* 邮件发送
|
||
*
|
||
* @param: $name[string] 接收人姓名
|
||
* @param: $email[string] 接收人邮件地址
|
||
* @param: $subject[string] 邮件标题
|
||
* @param: $content[string] 邮件内容
|
||
* @param: $type[int] 0 普通邮件, 1 HTML邮件
|
||
* @param: $notification[bool] true 要求回执, false 不用回执
|
||
*
|
||
* @return boolean
|
||
*/
|
||
function send_mail($name, $email, $subject, $content, $type = 0, $notification=false)
|
||
{
|
||
/* 如果邮件编码不是EC_CHARSET,创建字符集转换对象,转换编码 */
|
||
if ($GLOBALS['_CFG']['mail_charset'] != EC_CHARSET)
|
||
{
|
||
$name = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $name);
|
||
$subject = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $subject);
|
||
$content = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $content);
|
||
$shop_name = ecs_iconv(EC_CHARSET, $GLOBALS['_CFG']['mail_charset'], $GLOBALS['_CFG']['shop_name']);
|
||
}
|
||
$charset = $GLOBALS['_CFG']['mail_charset'];
|
||
/**
|
||
* 使用mail函数发送邮件
|
||
*/
|
||
if ($GLOBALS['_CFG']['mail_service'] == 0 && function_exists('mail'))
|
||
{
|
||
/* 邮件的头部信息 */
|
||
$content_type = ($type == 0) ? 'Content-Type: text/plain; charset=' . $charset : 'Content-Type: text/html; charset=' . $charset;
|
||
$headers = array();
|
||
$headers[] = 'From: "' . '=?' . $charset . '?B?' . base64_encode($shop_name) . '?='.'" <' . $GLOBALS['_CFG']['smtp_mail'] . '>';
|
||
$headers[] = $content_type . '; format=flowed';
|
||
if ($notification)
|
||
{
|
||
$headers[] = 'Disposition-Notification-To: ' . '=?' . $charset . '?B?' . base64_encode($shop_name) . '?='.'" <' . $GLOBALS['_CFG']['smtp_mail'] . '>';
|
||
}
|
||
|
||
$res = @mail($email, '=?' . $charset . '?B?' . base64_encode($subject) . '?=', $content, implode("\r\n", $headers));
|
||
|
||
if (!$res)
|
||
{
|
||
$GLOBALS['err'] ->add($GLOBALS['_LANG']['sendemail_false']);
|
||
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
return true;
|
||
}
|
||
}
|
||
/**
|
||
* 使用smtp服务发送邮件
|
||
*/
|
||
else
|
||
{
|
||
/* 邮件的头部信息 */
|
||
$content_type = ($type == 0) ?
|
||
'Content-Type: text/plain; charset=' . $charset : 'Content-Type: text/html; charset=' . $charset;
|
||
$content = base64_encode($content);
|
||
|
||
$headers = array();
|
||
$headers[] = 'Date: ' . gmdate('D, j M Y H:i:s') . ' +0000';
|
||
$headers[] = 'To: "' . '=?' . $charset . '?B?' . base64_encode($name) . '?=' . '" <' . $email. '>';
|
||
$headers[] = 'From: "' . '=?' . $charset . '?B?' . base64_encode($shop_name) . '?='.'" <' . $GLOBALS['_CFG']['smtp_mail'] . '>';
|
||
$headers[] = 'Subject: ' . '=?' . $charset . '?B?' . base64_encode($subject) . '?=';
|
||
$headers[] = $content_type . '; format=flowed';
|
||
$headers[] = 'Content-Transfer-Encoding: base64';
|
||
$headers[] = 'Content-Disposition: inline';
|
||
if ($notification)
|
||
{
|
||
$headers[] = 'Disposition-Notification-To: ' . '=?' . $charset . '?B?' . base64_encode($shop_name) . '?='.'" <' . $GLOBALS['_CFG']['smtp_mail'] . '>';
|
||
}
|
||
|
||
/* 获得邮件服务器的参数设置 */
|
||
$params['host'] = $GLOBALS['_CFG']['smtp_host'];
|
||
$params['port'] = $GLOBALS['_CFG']['smtp_port'];
|
||
$params['user'] = $GLOBALS['_CFG']['smtp_user'];
|
||
$params['pass'] = $GLOBALS['_CFG']['smtp_pass'];
|
||
|
||
if (empty($params['host']) || empty($params['port']))
|
||
{
|
||
// 如果没有设置主机和端口直接返回 false
|
||
$GLOBALS['err'] ->add($GLOBALS['_LANG']['smtp_setting_error']);
|
||
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
// 发送邮件
|
||
if (!function_exists('fsockopen'))
|
||
{
|
||
//如果fsockopen被禁用,直接返回
|
||
$GLOBALS['err']->add($GLOBALS['_LANG']['disabled_fsockopen']);
|
||
|
||
return false;
|
||
}
|
||
|
||
include_once(ROOT_PATH . 'includes/cls_smtp.php');
|
||
static $smtp;
|
||
|
||
$send_params['recipients'] = $email;
|
||
$send_params['headers'] = $headers;
|
||
$send_params['from'] = $GLOBALS['_CFG']['smtp_mail'];
|
||
$send_params['body'] = $content;
|
||
|
||
if (!isset($smtp))
|
||
{
|
||
$smtp = new smtp($params);
|
||
}
|
||
|
||
if ($smtp->connect() && $smtp->send($send_params))
|
||
{
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
$err_msg = $smtp->error_msg();
|
||
if (empty($err_msg))
|
||
{
|
||
$GLOBALS['err']->add('Unknown Error');
|
||
}
|
||
else
|
||
{
|
||
if (strpos($err_msg, 'Failed to connect to server') !== false)
|
||
{
|
||
$GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['smtp_connect_failure'], $params['host'] . ':' . $params['port']));
|
||
}
|
||
else if (strpos($err_msg, 'AUTH command failed') !== false)
|
||
{
|
||
$GLOBALS['err']->add($GLOBALS['_LANG']['smtp_login_failure']);
|
||
}
|
||
elseif (strpos($err_msg, 'bad sequence of commands') !== false)
|
||
{
|
||
$GLOBALS['err']->add($GLOBALS['_LANG']['smtp_refuse']);
|
||
}
|
||
else
|
||
{
|
||
$GLOBALS['err']->add($err_msg);
|
||
}
|
||
}
|
||
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获得服务器上的 GD 版本
|
||
*
|
||
* @access public
|
||
* @return int 可能的值为0,1,2
|
||
*/
|
||
function gd_version()
|
||
{
|
||
include_once(ROOT_PATH . 'includes/cls_image.php');
|
||
$cls_gile = new cls_image();
|
||
return $cls_gile->gd_version();
|
||
}
|
||
|
||
if (!function_exists('file_get_contents'))
|
||
{
|
||
/**
|
||
* 如果系统不存在file_get_contents函数则声明该函数
|
||
*
|
||
* @access public
|
||
* @param string $file
|
||
* @return mix
|
||
*/
|
||
function file_get_contents($file)
|
||
{
|
||
if (($fp = @fopen($file, 'rb')) === false)
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
$fsize = @filesize($file);
|
||
if ($fsize)
|
||
{
|
||
$contents = fread($fp, $fsize);
|
||
}
|
||
else
|
||
{
|
||
$contents = '';
|
||
}
|
||
fclose($fp);
|
||
|
||
return $contents;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!function_exists('file_put_contents'))
|
||
{
|
||
define('FILE_APPEND', 'FILE_APPEND');
|
||
|
||
/**
|
||
* 如果系统不存在file_put_contents函数则声明该函数
|
||
*
|
||
* @access public
|
||
* @param string $file
|
||
* @param mix $data
|
||
* @return int
|
||
*/
|
||
function file_put_contents($file, $data, $flags = '')
|
||
{
|
||
$contents = (is_array($data)) ? implode('', $data) : $data;
|
||
|
||
if ($flags == 'FILE_APPEND')
|
||
{
|
||
$mode = 'ab+';
|
||
}
|
||
else
|
||
{
|
||
$mode = 'wb';
|
||
}
|
||
|
||
if (($fp = @fopen($file, $mode)) === false)
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
$bytes = fwrite($fp, $contents);
|
||
fclose($fp);
|
||
|
||
return $bytes;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!function_exists('floatval'))
|
||
{
|
||
/**
|
||
* 如果系统不存在 floatval 函数则声明该函数
|
||
*
|
||
* @access public
|
||
* @param mix $n
|
||
* @return float
|
||
*/
|
||
function floatval($n)
|
||
{
|
||
return (float) $n;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 文件或目录权限检查函数
|
||
*
|
||
* @access public
|
||
* @param string $file_path 文件路径
|
||
* @param bool $rename_prv 是否在检查修改权限时检查执行rename()函数的权限
|
||
*
|
||
* @return int 返回值的取值范围为{0 <= x <= 15},每个值表示的含义可由四位二进制数组合推出。
|
||
* 返回值在二进制计数法中,四位由高到低分别代表
|
||
* 可执行rename()函数权限、可对文件追加内容权限、可写入文件权限、可读取文件权限。
|
||
*/
|
||
function file_mode_info($file_path)
|
||
{
|
||
/* 如果不存在,则不可读、不可写、不可改 */
|
||
if (!file_exists($file_path))
|
||
{
|
||
return false;
|
||
}
|
||
|
||
$mark = 0;
|
||
|
||
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
|
||
{
|
||
/* 测试文件 */
|
||
$test_file = $file_path . '/cf_test.txt';
|
||
|
||
/* 如果是目录 */
|
||
if (is_dir($file_path))
|
||
{
|
||
/* 检查目录是否可读 */
|
||
$dir = @opendir($file_path);
|
||
if ($dir === false)
|
||
{
|
||
return $mark; //如果目录打开失败,直接返回目录不可修改、不可写、不可读
|
||
}
|
||
if (@readdir($dir) !== false)
|
||
{
|
||
$mark ^= 1; //目录可读 001,目录不可读 000
|
||
}
|
||
@closedir($dir);
|
||
|
||
/* 检查目录是否可写 */
|
||
$fp = @fopen($test_file, 'wb');
|
||
if ($fp === false)
|
||
{
|
||
return $mark; //如果目录中的文件创建失败,返回不可写。
|
||
}
|
||
if (@fwrite($fp, 'directory access testing.') !== false)
|
||
{
|
||
$mark ^= 2; //目录可写可读011,目录可写不可读 010
|
||
}
|
||
@fclose($fp);
|
||
|
||
@unlink($test_file);
|
||
|
||
/* 检查目录是否可修改 */
|
||
$fp = @fopen($test_file, 'ab+');
|
||
if ($fp === false)
|
||
{
|
||
return $mark;
|
||
}
|
||
if (@fwrite($fp, "modify test.\r\n") !== false)
|
||
{
|
||
$mark ^= 4;
|
||
}
|
||
@fclose($fp);
|
||
|
||
/* 检查目录下是否有执行rename()函数的权限 */
|
||
if (@rename($test_file, $test_file) !== false)
|
||
{
|
||
$mark ^= 8;
|
||
}
|
||
@unlink($test_file);
|
||
}
|
||
/* 如果是文件 */
|
||
elseif (is_file($file_path))
|
||
{
|
||
/* 以读方式打开 */
|
||
$fp = @fopen($file_path, 'rb');
|
||
if ($fp)
|
||
{
|
||
$mark ^= 1; //可读 001
|
||
}
|
||
@fclose($fp);
|
||
|
||
/* 试着修改文件 */
|
||
$fp = @fopen($file_path, 'ab+');
|
||
if ($fp && @fwrite($fp, '') !== false)
|
||
{
|
||
$mark ^= 6; //可修改可写可读 111,不可修改可写可读011...
|
||
}
|
||
@fclose($fp);
|
||
|
||
/* 检查目录下是否有执行rename()函数的权限 */
|
||
if (@rename($test_file, $test_file) !== false)
|
||
{
|
||
$mark ^= 8;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (@is_readable($file_path))
|
||
{
|
||
$mark ^= 1;
|
||
}
|
||
|
||
if (@is_writable($file_path))
|
||
{
|
||
$mark ^= 14;
|
||
}
|
||
}
|
||
|
||
return $mark;
|
||
}
|
||
|
||
function log_write($arg, $file = '', $line = '')
|
||
{
|
||
if ((DEBUG_MODE & 4) != 4)
|
||
{
|
||
return;
|
||
}
|
||
|
||
$str = "\r\n-- ". date('Y-m-d H:i:s'). " --------------------------------------------------------------\r\n";
|
||
$str .= "FILE: $file\r\nLINE: $line\r\n";
|
||
|
||
if (is_array($arg))
|
||
{
|
||
$str .= '$arg = array(';
|
||
foreach ($arg AS $val)
|
||
{
|
||
foreach ($val AS $key => $list)
|
||
{
|
||
$str .= "'$key' => '$list'\r\n";
|
||
}
|
||
}
|
||
$str .= ")\r\n";
|
||
}
|
||
else
|
||
{
|
||
$str .= $arg;
|
||
}
|
||
|
||
file_put_contents(ROOT_PATH . DATA_DIR . '/log.txt', $str);
|
||
}
|
||
|
||
/**
|
||
* 检查目标文件夹是否存在,如果不存在则自动创建该目录
|
||
*
|
||
* @access public
|
||
* @param string folder 目录路径。不能使用相对于网站根目录的URL
|
||
*
|
||
* @return bool
|
||
*/
|
||
function make_dir($folder)
|
||
{
|
||
$reval = false;
|
||
|
||
if (!file_exists($folder))
|
||
{
|
||
/* 如果目录不存在则尝试创建该目录 */
|
||
@umask(0);
|
||
|
||
/* 将目录路径拆分成数组 */
|
||
preg_match_all('/([^\/]*)\/?/i', $folder, $atmp);
|
||
|
||
/* 如果第一个字符为/则当作物理路径处理 */
|
||
$base = ($atmp[0][0] == '/') ? '/' : '';
|
||
|
||
/* 遍历包含路径信息的数组 */
|
||
foreach ($atmp[1] AS $val)
|
||
{
|
||
if ('' != $val)
|
||
{
|
||
$base .= $val;
|
||
|
||
if ('..' == $val || '.' == $val)
|
||
{
|
||
/* 如果目录为.或者..则直接补/继续下一个循环 */
|
||
$base .= '/';
|
||
|
||
continue;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
continue;
|
||
}
|
||
|
||
$base .= '/';
|
||
|
||
if (!@file_exists($base))
|
||
{
|
||
/* 尝试创建目录,如果创建失败则继续循环 */
|
||
if (@mkdir(rtrim($base, '/'), 0777))
|
||
{
|
||
@chmod($base, 0777);
|
||
$reval = true;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
/* 路径已经存在。返回该路径是不是一个目录 */
|
||
$reval = is_dir($folder);
|
||
}
|
||
|
||
clearstatcache();
|
||
|
||
return $reval;
|
||
}
|
||
|
||
/**
|
||
* 获得系统是否启用了 gzip
|
||
*
|
||
* @access public
|
||
*
|
||
* @return boolean
|
||
*/
|
||
function gzip_enabled()
|
||
{
|
||
static $enabled_gzip = NULL;
|
||
|
||
if ($enabled_gzip === NULL)
|
||
{
|
||
$enabled_gzip = ($GLOBALS['_CFG']['enable_gzip'] && function_exists('ob_gzhandler'));
|
||
}
|
||
|
||
return $enabled_gzip;
|
||
}
|
||
|
||
/**
|
||
* 递归方式的对变量中的特殊字符进行转义
|
||
*
|
||
* @access public
|
||
* @param mix $value
|
||
*
|
||
* @return mix
|
||
*/
|
||
function addslashes_deep($value)
|
||
{
|
||
if (empty($value))
|
||
{
|
||
return $value;
|
||
}
|
||
else
|
||
{
|
||
return is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 将对象成员变量或者数组的特殊字符进行转义
|
||
*
|
||
* @access public
|
||
* @param mix $obj 对象或者数组
|
||
* @author Xuan Yan
|
||
*
|
||
* @return mix 对象或者数组
|
||
*/
|
||
function addslashes_deep_obj($obj)
|
||
{
|
||
if (is_object($obj) == true)
|
||
{
|
||
foreach ($obj AS $key => $val)
|
||
{
|
||
$obj->$key = addslashes_deep($val);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$obj = addslashes_deep($obj);
|
||
}
|
||
|
||
return $obj;
|
||
}
|
||
|
||
/**
|
||
* 递归方式的对变量中的特殊字符去除转义
|
||
*
|
||
* @access public
|
||
* @param mix $value
|
||
*
|
||
* @return mix
|
||
*/
|
||
function stripslashes_deep($value)
|
||
{
|
||
if (empty($value))
|
||
{
|
||
return $value;
|
||
}
|
||
else
|
||
{
|
||
return is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 将一个字串中含有全角的数字字符、字母、空格或'%+-()'字符转换为相应半角字符
|
||
*
|
||
* @access public
|
||
* @param string $str 待转换字串
|
||
*
|
||
* @return string $str 处理后字串
|
||
*/
|
||
function make_semiangle($str)
|
||
{
|
||
$arr = array('0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4',
|
||
'5' => '5', '6' => '6', '7' => '7', '8' => '8', '9' => '9',
|
||
'A' => 'A', 'B' => 'B', 'C' => 'C', 'D' => 'D', 'E' => 'E',
|
||
'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J',
|
||
'K' => 'K', 'L' => 'L', 'M' => 'M', 'N' => 'N', 'O' => 'O',
|
||
'P' => 'P', 'Q' => 'Q', 'R' => 'R', 'S' => 'S', 'T' => 'T',
|
||
'U' => 'U', 'V' => 'V', 'W' => 'W', 'X' => 'X', 'Y' => 'Y',
|
||
'Z' => 'Z', 'a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd',
|
||
'e' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i',
|
||
'j' => 'j', 'k' => 'k', 'l' => 'l', 'm' => 'm', 'n' => 'n',
|
||
'o' => 'o', 'p' => 'p', 'q' => 'q', 'r' => 'r', 's' => 's',
|
||
't' => 't', 'u' => 'u', 'v' => 'v', 'w' => 'w', 'x' => 'x',
|
||
'y' => 'y', 'z' => 'z',
|
||
'(' => '(', ')' => ')', '〔' => '[', '〕' => ']', '【' => '[',
|
||
'】' => ']', '〖' => '[', '〗' => ']', '“' => '[', '”' => ']',
|
||
'‘' => '[', '’' => ']', '{' => '{', '}' => '}', '《' => '<',
|
||
'》' => '>',
|
||
'%' => '%', '+' => '+', '—' => '-', '-' => '-', '~' => '-',
|
||
':' => ':', '。' => '.', '、' => ',', ',' => '.', '、' => '.',
|
||
';' => ',', '?' => '?', '!' => '!', '…' => '-', '‖' => '|',
|
||
'”' => '"', '’' => '`', '‘' => '`', '|' => '|', '〃' => '"',
|
||
' ' => ' ');
|
||
|
||
return strtr($str, $arr);
|
||
}
|
||
|
||
/**
|
||
* 过滤用户输入的基本数据,防止script攻击
|
||
*
|
||
* @access public
|
||
* @return string
|
||
*/
|
||
function compile_str($str)
|
||
{
|
||
$arr = array('<' => '<', '>' => '>','"'=>'”',"'"=>'’');
|
||
|
||
return strtr($str, $arr);
|
||
}
|
||
|
||
/**
|
||
* 检查文件类型
|
||
*
|
||
* @access public
|
||
* @param string filename 文件名
|
||
* @param string realname 真实文件名
|
||
* @param string limit_ext_types 允许的文件类型
|
||
* @return string
|
||
*/
|
||
function check_file_type($filename, $realname = '', $limit_ext_types = '')
|
||
{
|
||
if ($realname)
|
||
{
|
||
$extname = strtolower(substr($realname, strrpos($realname, '.') + 1));
|
||
}
|
||
else
|
||
{
|
||
$extname = strtolower(substr($filename, strrpos($filename, '.') + 1));
|
||
}
|
||
|
||
if ($limit_ext_types && stristr($limit_ext_types, '|' . $extname . '|') === false)
|
||
{
|
||
return '';
|
||
}
|
||
|
||
$str = $format = '';
|
||
|
||
$file = @fopen($filename, 'rb');
|
||
if ($file)
|
||
{
|
||
$str = @fread($file, 0x400); // 读取前 1024 个字节
|
||
@fclose($file);
|
||
}
|
||
else
|
||
{
|
||
if (stristr($filename, ROOT_PATH) === false)
|
||
{
|
||
if ($extname == 'jpg' || $extname == 'jpeg' || $extname == 'gif' || $extname == 'png' || $extname == 'doc' ||
|
||
$extname == 'xls' || $extname == 'txt' || $extname == 'zip' || $extname == 'rar' || $extname == 'ppt' ||
|
||
$extname == 'pdf' || $extname == 'rm' || $extname == 'mid' || $extname == 'wav' || $extname == 'bmp' ||
|
||
$extname == 'swf' || $extname == 'chm' || $extname == 'sql' || $extname == 'cert'|| $extname == 'pptx' ||
|
||
$extname == 'xlsx' || $extname == 'docx')
|
||
{
|
||
$format = $extname;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return '';
|
||
}
|
||
}
|
||
|
||
if ($format == '' && strlen($str) >= 2 )
|
||
{
|
||
if (substr($str, 0, 4) == 'MThd' && $extname != 'txt')
|
||
{
|
||
$format = 'mid';
|
||
}
|
||
elseif (substr($str, 0, 4) == 'RIFF' && $extname == 'wav')
|
||
{
|
||
$format = 'wav';
|
||
}
|
||
elseif (substr($str ,0, 3) == "\xFF\xD8\xFF")
|
||
{
|
||
$format = 'jpg';
|
||
}
|
||
elseif (substr($str ,0, 4) == 'GIF8' && $extname != 'txt')
|
||
{
|
||
$format = 'gif';
|
||
}
|
||
elseif (substr($str ,0, 8) == "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A")
|
||
{
|
||
$format = 'png';
|
||
}
|
||
elseif (substr($str ,0, 2) == 'BM' && $extname != 'txt')
|
||
{
|
||
$format = 'bmp';
|
||
}
|
||
elseif ((substr($str ,0, 3) == 'CWS' || substr($str ,0, 3) == 'FWS') && $extname != 'txt')
|
||
{
|
||
$format = 'swf';
|
||
}
|
||
elseif (substr($str ,0, 4) == "\xD0\xCF\x11\xE0")
|
||
{ // D0CF11E == DOCFILE == Microsoft Office Document
|
||
if (substr($str,0x200,4) == "\xEC\xA5\xC1\x00" || $extname == 'doc')
|
||
{
|
||
$format = 'doc';
|
||
}
|
||
elseif (substr($str,0x200,2) == "\x09\x08" || $extname == 'xls')
|
||
{
|
||
$format = 'xls';
|
||
} elseif (substr($str,0x200,4) == "\xFD\xFF\xFF\xFF" || $extname == 'ppt')
|
||
{
|
||
$format = 'ppt';
|
||
}
|
||
} elseif (substr($str ,0, 4) == "PK\x03\x04")
|
||
{
|
||
if (substr($str,0x200,4) == "\xEC\xA5\xC1\x00" || $extname == 'docx')
|
||
{
|
||
$format = 'docx';
|
||
}
|
||
elseif (substr($str,0x200,2) == "\x09\x08" || $extname == 'xlsx')
|
||
{
|
||
$format = 'xlsx';
|
||
} elseif (substr($str,0x200,4) == "\xFD\xFF\xFF\xFF" || $extname == 'pptx')
|
||
{
|
||
$format = 'pptx';
|
||
}else
|
||
{
|
||
$format = 'zip';
|
||
}
|
||
} elseif (substr($str ,0, 4) == 'Rar!' && $extname != 'txt')
|
||
{
|
||
$format = 'rar';
|
||
} elseif (substr($str ,0, 4) == "\x25PDF")
|
||
{
|
||
$format = 'pdf';
|
||
} elseif (substr($str ,0, 3) == "\x30\x82\x0A")
|
||
{
|
||
$format = 'cert';
|
||
} elseif (substr($str ,0, 4) == 'ITSF' && $extname != 'txt')
|
||
{
|
||
$format = 'chm';
|
||
} elseif (substr($str ,0, 4) == "\x2ERMF")
|
||
{
|
||
$format = 'rm';
|
||
} elseif ($extname == 'sql')
|
||
{
|
||
$format = 'sql';
|
||
} elseif ($extname == 'txt')
|
||
{
|
||
$format = 'txt';
|
||
}
|
||
}
|
||
|
||
if ($limit_ext_types && stristr($limit_ext_types, '|' . $format . '|') === false)
|
||
{
|
||
$format = '';
|
||
}
|
||
|
||
return $format;
|
||
}
|
||
|
||
/**
|
||
* 对 MYSQL LIKE 的内容进行转义
|
||
*
|
||
* @access public
|
||
* @param string string 内容
|
||
* @return string
|
||
*/
|
||
function mysql_like_quote($str)
|
||
{
|
||
return strtr($str, array("\\\\" => "\\\\\\\\", '_' => '\_', '%' => '\%', "\'" => "\\\\\'"));
|
||
}
|
||
|
||
/**
|
||
* 获取服务器的ip
|
||
*
|
||
* @access public
|
||
*
|
||
* @return string
|
||
**/
|
||
function real_server_ip()
|
||
{
|
||
static $serverip = NULL;
|
||
|
||
if ($serverip !== NULL)
|
||
{
|
||
return $serverip;
|
||
}
|
||
|
||
if (isset($_SERVER))
|
||
{
|
||
if (isset($_SERVER['SERVER_ADDR']))
|
||
{
|
||
$serverip = $_SERVER['SERVER_ADDR'];
|
||
}
|
||
else
|
||
{
|
||
$serverip = '0.0.0.0';
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$serverip = getenv('SERVER_ADDR');
|
||
}
|
||
|
||
return $serverip;
|
||
}
|
||
|
||
/**
|
||
* 自定义 header 函数,用于过滤可能出现的安全隐患
|
||
*
|
||
* @param string string 内容
|
||
*
|
||
* @return void
|
||
**/
|
||
function ecs_header($string, $replace = true, $http_response_code = 0)
|
||
{
|
||
if (strpos($string, '../upgrade/index.php') === 0)
|
||
{
|
||
echo '<script type="text/javascript">window.location.href="' . $string . '";</script>';
|
||
}
|
||
$string = str_replace(array("\r", "\n"), array('', ''), $string);
|
||
|
||
if (preg_match('/^\s*location:/is', $string))
|
||
{
|
||
@header($string . "\n", $replace);
|
||
|
||
exit();
|
||
}
|
||
|
||
if (empty($http_response_code) || PHP_VERSION < '4.3')
|
||
{
|
||
@header($string, $replace);
|
||
}
|
||
else
|
||
{
|
||
@header($string, $replace, $http_response_code);
|
||
}
|
||
}
|
||
|
||
function ecs_iconv($source_lang, $target_lang, $source_string = '')
|
||
{
|
||
static $chs = NULL;
|
||
|
||
/* 如果字符串为空或者字符串不需要转换,直接返回 */
|
||
if ($source_lang == $target_lang || $source_string == '' || preg_match("/[\x80-\xFF]+/", $source_string) == 0)
|
||
{
|
||
return $source_string;
|
||
}
|
||
|
||
if ($chs === NULL)
|
||
{
|
||
require_once(ROOT_PATH . 'includes/cls_iconv.php');
|
||
$chs = new Chinese(ROOT_PATH);
|
||
}
|
||
|
||
return $chs->Convert($source_lang, $target_lang, $source_string);
|
||
}
|
||
|
||
function ecs_geoip($ip)
|
||
{
|
||
$return = '';
|
||
if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip))
|
||
{
|
||
$iparray = explode('.', $ip);
|
||
|
||
if($iparray[0] == 10 || $iparray[0] == 127 || ($iparray[0] == 192 && $iparray[1] == 168) || ($iparray[0] == 172 && ($iparray[1] >= 16 && $iparray[1] <= 31)))
|
||
{
|
||
$return = 'LAN';
|
||
}
|
||
elseif($iparray[0] > 255 || $iparray[1] > 255 || $iparray[2] > 255 || $iparray[3] > 255)
|
||
{
|
||
$return = 'Invalid IP Address';
|
||
}
|
||
else
|
||
{
|
||
$tinyipfile = ROOT_PATH . 'includes/codetable/ipdata.dat'; //ipdata.dat-纯真网络IP库
|
||
$fullipfile = ROOT_PATH . 'includes/codetable/ipdata2.dat'; //ipdata.dat-纯真网络IP库
|
||
|
||
if(@file_exists($tinyipfile)||@file_exists($fullipfile))
|
||
{
|
||
$return = mb_convert_encoding(convertip_tiny($ip, $tinyipfile), "UTF-8");
|
||
// $return = convertip_full($ip, $fulipfile);
|
||
}
|
||
}
|
||
}
|
||
return $return;
|
||
}
|
||
|
||
|
||
function convertip_full($ip, $ipdatafile) {
|
||
|
||
if(!$fd = @fopen($ipdatafile, 'rb')) {
|
||
return '- Invalid IP data file';
|
||
}
|
||
|
||
$ip = explode('.', $ip);
|
||
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
|
||
|
||
if(!($DataBegin = fread($fd, 4)) || !($DataEnd = fread($fd, 4)) ) return;
|
||
@$ipbegin = implode('', unpack('L', $DataBegin));
|
||
if($ipbegin < 0) $ipbegin += pow(2, 32);
|
||
@$ipend = implode('', unpack('L', $DataEnd));
|
||
if($ipend < 0) $ipend += pow(2, 32);
|
||
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
|
||
|
||
$BeginNum = $ip2num = $ip1num = 0;
|
||
$ipAddr1 = $ipAddr2 = '';
|
||
$EndNum = $ipAllNum;
|
||
|
||
while($ip1num > $ipNum || $ip2num < $ipNum) {
|
||
$Middle= intval(($EndNum + $BeginNum) / 2);
|
||
|
||
fseek($fd, $ipbegin + 7 * $Middle);
|
||
$ipData1 = fread($fd, 4);
|
||
if(strlen($ipData1) < 4) {
|
||
fclose($fd);
|
||
return '- System Error';
|
||
}
|
||
$ip1num = implode('', unpack('L', $ipData1));
|
||
if($ip1num < 0) $ip1num += pow(2, 32);
|
||
|
||
if($ip1num > $ipNum) {
|
||
$EndNum = $Middle;
|
||
continue;
|
||
}
|
||
|
||
$DataSeek = fread($fd, 3);
|
||
if(strlen($DataSeek) < 3) {
|
||
fclose($fd);
|
||
return '- System Error';
|
||
}
|
||
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
|
||
fseek($fd, $DataSeek);
|
||
$ipData2 = fread($fd, 4);
|
||
if(strlen($ipData2) < 4) {
|
||
fclose($fd);
|
||
return '- System Error';
|
||
}
|
||
$ip2num = implode('', unpack('L', $ipData2));
|
||
if($ip2num < 0) $ip2num += pow(2, 32);
|
||
|
||
if($ip2num < $ipNum) {
|
||
if($Middle == $BeginNum) {
|
||
fclose($fd);
|
||
return '- Unknown';
|
||
}
|
||
$BeginNum = $Middle;
|
||
}
|
||
}
|
||
|
||
$ipFlag = fread($fd, 1);
|
||
if($ipFlag == chr(1)) {
|
||
$ipSeek = fread($fd, 3);
|
||
if(strlen($ipSeek) < 3) {
|
||
fclose($fd);
|
||
return '- System Error';
|
||
}
|
||
$ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
|
||
fseek($fd, $ipSeek);
|
||
$ipFlag = fread($fd, 1);
|
||
}
|
||
|
||
if($ipFlag == chr(2)) {
|
||
$AddrSeek = fread($fd, 3);
|
||
if(strlen($AddrSeek) < 3) {
|
||
fclose($fd);
|
||
return '- System Error';
|
||
}
|
||
$ipFlag = fread($fd, 1);
|
||
if($ipFlag == chr(2)) {
|
||
$AddrSeek2 = fread($fd, 3);
|
||
if(strlen($AddrSeek2) < 3) {
|
||
fclose($fd);
|
||
return '- System Error';
|
||
}
|
||
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
|
||
fseek($fd, $AddrSeek2);
|
||
} else {
|
||
fseek($fd, -1, SEEK_CUR);
|
||
}
|
||
|
||
while(($char = fread($fd, 1)) != chr(0))
|
||
$ipAddr2 .= $char;
|
||
|
||
$AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
|
||
fseek($fd, $AddrSeek);
|
||
|
||
while(($char = fread($fd, 1)) != chr(0))
|
||
$ipAddr1 .= $char;
|
||
} else {
|
||
fseek($fd, -1, SEEK_CUR);
|
||
while(($char = fread($fd, 1)) != chr(0))
|
||
$ipAddr1 .= $char;
|
||
|
||
$ipFlag = fread($fd, 1);
|
||
if($ipFlag == chr(2)) {
|
||
$AddrSeek2 = fread($fd, 3);
|
||
if(strlen($AddrSeek2) < 3) {
|
||
fclose($fd);
|
||
return '- System Error';
|
||
}
|
||
$AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
|
||
fseek($fd, $AddrSeek2);
|
||
} else {
|
||
fseek($fd, -1, SEEK_CUR);
|
||
}
|
||
while(($char = fread($fd, 1)) != chr(0))
|
||
$ipAddr2 .= $char;
|
||
}
|
||
fclose($fd);
|
||
|
||
if(preg_match('/http/i', $ipAddr2)) {
|
||
$ipAddr2 = '';
|
||
}
|
||
$ipaddr = "$ipAddr1 $ipAddr2";
|
||
$ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
|
||
$ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
|
||
$ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
|
||
if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
|
||
$ipaddr = '- Unknown';
|
||
}
|
||
|
||
return iconv('gb2312', 'utf-8', $ipaddr);
|
||
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 去除字符串右侧可能出现的乱码
|
||
*
|
||
* @param string $str 字符串
|
||
*
|
||
* @return string
|
||
*/
|
||
function trim_right($str)
|
||
{
|
||
$len = strlen($str);
|
||
/* 为空或单个字符直接返回 */
|
||
if ($len == 0 || ord($str{$len-1}) < 127)
|
||
{
|
||
return $str;
|
||
}
|
||
/* 有前导字符的直接把前导字符去掉 */
|
||
if (ord($str{$len-1}) >= 192)
|
||
{
|
||
return substr($str, 0, $len-1);
|
||
}
|
||
/* 有非独立的字符,先把非独立字符去掉,再验证非独立的字符是不是一个完整的字,不是连原来前导字符也截取掉 */
|
||
$r_len = strlen(rtrim($str, "\x80..\xBF"));
|
||
if ($r_len == 0 || ord($str{$r_len-1}) < 127)
|
||
{
|
||
return sub_str($str, 0, $r_len);
|
||
}
|
||
|
||
$as_num = ord(~$str{$r_len -1});
|
||
if ($as_num > (1<<(6 + $r_len - $len)))
|
||
{
|
||
return $str;
|
||
}
|
||
else
|
||
{
|
||
return substr($str, 0, $r_len-1);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 将上传文件转移到指定位置
|
||
*
|
||
* @param string $file_name
|
||
* @param string $target_name
|
||
* @return blog
|
||
*/
|
||
function move_upload_file($file_name, $target_name = '')
|
||
{
|
||
if (function_exists("move_uploaded_file"))
|
||
{
|
||
if (move_uploaded_file($file_name, $target_name))
|
||
{
|
||
@chmod($target_name,0755);
|
||
return true;
|
||
}
|
||
else if (copy($file_name, $target_name))
|
||
{
|
||
@chmod($target_name,0755);
|
||
return true;
|
||
}
|
||
}
|
||
elseif (copy($file_name, $target_name))
|
||
{
|
||
@chmod($target_name,0755);
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 将JSON传递的参数转码
|
||
*
|
||
* @param string $str
|
||
* @return string
|
||
*/
|
||
function json_str_iconv($str)
|
||
{
|
||
if (EC_CHARSET != 'utf-8')
|
||
{
|
||
if (is_string($str))
|
||
{
|
||
return addslashes(stripslashes(ecs_iconv('utf-8', EC_CHARSET, $str)));
|
||
}
|
||
elseif (is_array($str))
|
||
{
|
||
foreach ($str as $key => $value)
|
||
{
|
||
$str[$key] = json_str_iconv($value);
|
||
}
|
||
return $str;
|
||
}
|
||
elseif (is_object($str))
|
||
{
|
||
foreach ($str as $key => $value)
|
||
{
|
||
$str->$key = json_str_iconv($value);
|
||
}
|
||
return $str;
|
||
}
|
||
else
|
||
{
|
||
return $str;
|
||
}
|
||
}
|
||
return $str;
|
||
}
|
||
|
||
/**
|
||
* 循环转码成utf8内容
|
||
*
|
||
* @param string $str
|
||
* @return string
|
||
*/
|
||
function to_utf8_iconv($str)
|
||
{
|
||
if (EC_CHARSET != 'utf-8')
|
||
{
|
||
if (is_string($str))
|
||
{
|
||
return ecs_iconv(EC_CHARSET, 'utf-8', $str);
|
||
}
|
||
elseif (is_array($str))
|
||
{
|
||
foreach ($str as $key => $value)
|
||
{
|
||
$str[$key] = to_utf8_iconv($value);
|
||
}
|
||
return $str;
|
||
}
|
||
elseif (is_object($str))
|
||
{
|
||
foreach ($str as $key => $value)
|
||
{
|
||
$str->$key = to_utf8_iconv($value);
|
||
}
|
||
return $str;
|
||
}
|
||
else
|
||
{
|
||
return $str;
|
||
}
|
||
}
|
||
return $str;
|
||
}
|
||
|
||
/**
|
||
* 获取文件后缀名,并判断是否合法
|
||
*
|
||
* @param string $file_name
|
||
* @param array $allow_type
|
||
* @return blob
|
||
*/
|
||
function get_file_suffix($file_name, $allow_type = array())
|
||
{
|
||
$file_name_arr = explode('.', $file_name);
|
||
$file_suffix = strtolower(array_pop($file_name_arr));
|
||
if (empty($allow_type))
|
||
{
|
||
return $file_suffix;
|
||
}
|
||
else
|
||
{
|
||
if (in_array($file_suffix, $allow_type))
|
||
{
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 读结果缓存文件
|
||
*
|
||
* @params string $cache_name
|
||
*
|
||
* @return array $data
|
||
*/
|
||
function read_static_cache($cache_name)
|
||
{
|
||
if ((DEBUG_MODE & 2) == 2)
|
||
{
|
||
return false;
|
||
}
|
||
static $result = array();
|
||
if (!empty($result[$cache_name]))
|
||
{
|
||
return $result[$cache_name];
|
||
}
|
||
$cache_file_path = ROOT_PATH . '/temp/static_caches/' . $cache_name . '.php';
|
||
if (file_exists($cache_file_path))
|
||
{
|
||
include_once($cache_file_path);
|
||
$result[$cache_name] = $data;
|
||
return $result[$cache_name];
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 写结果缓存文件
|
||
*
|
||
* @params string $cache_name
|
||
* @params string $caches
|
||
*
|
||
* @return
|
||
*/
|
||
function write_static_cache($cache_name, $caches)
|
||
{
|
||
if ((DEBUG_MODE & 2) == 2)
|
||
{
|
||
return false;
|
||
}
|
||
$cache_file_path = ROOT_PATH . '/temp/static_caches/' . $cache_name . '.php';
|
||
$content = "<?php\r\n";
|
||
$content .= "\$data = " . var_export($caches, true) . ";\r\n";
|
||
$content .= "?>";
|
||
file_put_contents($cache_file_path, $content, LOCK_EX);
|
||
}
|
||
|
||
function strtonum($strnum){
|
||
return str_replace( ',', '', $strnum );
|
||
}
|
||
|
||
function hb_uuid()
|
||
{
|
||
return sprintf('%04x%04x%04x%04x%04x%04x%04x%04x',
|
||
mt_rand(0, 0xffff), mt_rand(0, 0xffff),
|
||
mt_rand(0, 0xffff),
|
||
mt_rand(0, 0x0fff) | 0x4000,
|
||
mt_rand(0, 0x3fff) | 0x8000,
|
||
mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
|
||
);
|
||
}
|
||
?>
|