月度归档:2016年10月

git 常用命令及用法

git 命令  是我自己常用的 , 具体不在一一复述  ,  用到的时候就会更新

1,分支相关

列出所有分支    git  branch -a  输出所有分支

创建分支    git  branch  + 分支名     例如 创建一个开发分支dev  ,  键入  git branch dev 即可

切换分支    git  checkout  +分支名   例如 切换到新创建的 分支 dev  键入  git checkout  dev 即可

分支合并    git  merge  +分支名     例如   现在是在dev 分支内    把test分支合并进来    键入git  merge   test 即可

提交本地分支到远程分支   git push origin  +本地分支名:远程分支名  例如   git push orgin  dev:dev

本地分支关联远程分支  git branch  –set-upstream    分支名称  origin 远程分支名  例如   git branch –set-upstream    dev   origin  dev

 

 

PHP超全局变量和常用常量

PHP超级全局变量数组(Super Global Array),又称为PHP预定义数组,是由PHP引擎内置的,不需要开发者重新定义。 在PHP脚本运行时,PHP会自动将一些数据放在超级全局数组中。

php超级全局变量列表

$_GET[] 获得以GET方法提交的变量数组
$_POST[] 获得以POST方法提交的变量数组
$_COOKIE[] 获取和设置当前网站的Cookie标识
$_SESSION[] 取得当前用户访问的唯一标识,以数组形式体现,如sessionid以及自定义session数据
$_ENV[] 当前php环境变量数组
$_SERVER[] 当前php服务器变量数组
$_FILES[] 上传文件时提交到当前脚本的参数值,以数组形式体现
$_REQUEST[] 包含当前脚本提交的全部请求,$_GET、$_POST、$_COOKIE、$_SESSION的所有动作
$GLOBALS[] 包含正在执行脚本所有超级全局变量的引用内容

PHP系统常量
__FILE__ 当前PHP程序脚本的绝对路径及文件名称
__LINE__ 存储该常量所在的行号
__FUNCTION__ 存储该常量所在的函数名称
__CLASS__ 存储该常量所在的类的名称
PHP_VERSION 存储当前PHP的版本号,也可以通过PHPVERSION()函数获取。
PHP_OS 存储当前服务器的操作系统

php利用geohash算法查找附近的人

之前没做过,后来自己写好了发现个问题,读出来的就不是附近的人。只是单纯的计算出两点间的距离而已,后来又想了一下,并且网上找了找,对比了一下。用geohash 算法 还是比较不错的。

下面附上方法步骤

原理

首先要了解一下  geohash 算法  网上关于这个讲的蛮多的,在此不详细说明了,我简单的理解就是无限缩小定位一个范围。虽说是无限的,但是还是有限的。

比如一个坐标点(29,121) ,把经纬度分为 (-90,0) (0,90)  (-180,0)(0,180)  ,如果给的坐标在这个区间内,就为1 不在的话 就为 0 ,以纬度然后继续分  在(0,45)的区间内 则为1 不在则为0,然后继续  (0,22.5)(22.5,45)一直分直到达到你所需要的精度为止。

然后得到类似 1011 1000 1100 0111 1001 这样的字符串   经度的 也是一样 合并两个字符串  11100 11101 00100 01111 00000 01101 01011 00001   奇数位为 纬度   偶数位  为经度。最后,用0-9、b-z(去掉a, i, l, o)这32个字母进行base32编码。  然后得到的 类似   wx4g0ec1(举例,不准的) 这样的字符串。

附 PHPGeohash.class.php   基类

<?php
class Geohash
{
    private $coding="0123456789bcdefghjkmnpqrstuvwxyz";
    private $codingMap=array();
    public function Geohash()
    {
        for($i=0; $i<32; $i++)
        {
            $this->codingMap[substr($this->coding,$i,1)]=str_pad(decbin($i), 5, "0", STR_PAD_LEFT);
        }
  
    }
  
    public function decode($hash)
    {
        $binary="";
        $hl=strlen($hash);
        for($i=0; $i<$hl; $i++)
        {
            $binary.=$this->codingMap[substr($hash,$i,1)];
        }
  
        $bl=strlen($binary);
        $blat="";
        $blong="";
        for ($i=0; $i<$bl; $i++)
        {
            if ($i%2)
                $blat=$blat.substr($binary,$i,1);
            else
                $blong=$blong.substr($binary,$i,1);
  
        }
  
        $lat=$this->binDecode($blat,-90,90);
        $long=$this->binDecode($blong,-180,180);
  
        $latErr=$this->calcError(strlen($blat),-90,90);
        $longErr=$this->calcError(strlen($blong),-180,180);
  
        $latPlaces=max(1, -round(log10($latErr))) - 1;
        $longPlaces=max(1, -round(log10($longErr))) - 1;
  
        $lat=round($lat, $latPlaces);
        $long=round($long, $longPlaces);
  
        return array($lat,$long);
    }
  
    public function encode($lat,$long)
    {
        $plat=$this->precision($lat);
        $latbits=1;
        $err=45;
        while($err>$plat)
        {
            $latbits++;
            $err/=2;
        }
  
        $plong=$this->precision($long);
        $longbits=1;
        $err=90;
        while($err>$plong)
        {
            $longbits++;
            $err/=2;
        }
  
        $bits=max($latbits,$longbits);
  
        $longbits=$bits;
        $latbits=$bits;
        $addlong=1;
        while (($longbits+$latbits)%5 != 0)
        {
            $longbits+=$addlong;
            $latbits+=!$addlong;
            $addlong=!$addlong;
        }
  
        $blat=$this->binEncode($lat,-90,90, $latbits);
  
        $blong=$this->binEncode($long,-180,180,$longbits);
  
        $binary="";
        $uselong=1;
        while (strlen($blat)+strlen($blong))
        {
            if ($uselong)
            {
                $binary=$binary.substr($blong,0,1);
                $blong=substr($blong,1);
            }
            else
            {
                $binary=$binary.substr($blat,0,1);
                $blat=substr($blat,1);
            }
            $uselong=!$uselong;
        }
  
        $hash="";
        for ($i=0; $i<strlen($binary); $i+=5)
        {
            $n=bindec(substr($binary,$i,5));
            $hash=$hash.$this->coding[$n];
        }
  
        return $hash;
    }
  
    private function calcError($bits,$min,$max)
    {
        $err=($max-$min)/2;
        while ($bits--)
            $err/=2;
        return $err;
    }
  
    private function precision($number)
    {
        $precision=0;
        $pt=strpos($number,'.');
        if ($pt!==false)
        {
            $precision=-(strlen($number)-$pt-1);
        }
  
        return pow(10,$precision)/2;
    }
  
    private function binEncode($number, $min, $max, $bitcount)
    {
        if ($bitcount==0)
            return "";
        $mid=($min+$max)/2;
        if ($number>$mid)
            return "1".$this->binEncode($number, $mid, $max,$bitcount-1);
        else
            return "0".$this->binEncode($number, $min, $mid,$bitcount-1);
    }
  
    private function binDecode($binary, $min, $max)
    {
        $mid=($min+$max)/2;
  
        if (strlen($binary)==0)
            return $mid;
  
        $bit=substr($binary,0,1);
        $binary=substr($binary,1);
  
        if ($bit==1)
            return $this->binDecode($binary, $mid, $max);
        else
            return $this->binDecode($binary, $min, $mid);
    }
?>

查找

把这样的一条数据(wx4g0ec1)存入到你的数据表里面

把你需要查找的坐标  转换成  类似(wx4g0ec1)字符  ,然后用LIKE  查询 你存入的 坐标信息

 

查找附近,利用 在SQL中 LIKE ‘wx4g%’;且此结果可缓存;在小区域内,不会因为改变经纬度,而重新数据库查询

查找出的有限结果,如需要求距离或者排序,可利用距离公式和二维数据排序;此时也是少量数据,会很快的

查出来的数据按照距离远近排序一下,然后对查出的数据分下页就好了

测算距离的函数。(具体原理不在详细说明)

/**
     * 说明: 根据两点间的经纬度计算距离
     * @param type $lat1 纬度值1
     * @param type $lng1 经度值1
     * @param type $lat2 纬度值2
     * @param type $lng2 经度值2
     * @return type
     */
    function getDistance($lat1, $lng1, $lat2, $lng2) {
        $earthRadius = 6367000;
        $lat1 = ($lat1 * pi() ) / 180;
        $lng1 = ($lng1 * pi() ) / 180;
        $lat2 = ($lat2 * pi() ) / 180;
        $lng2 = ($lng2 * pi() ) / 180;
        $calcLongitude = $lng2 - $lng1;
        $calcLatitude = $lat2 - $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
        $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;
        return $calculatedDistance;
    }
排序函数
    php 自带的 函数 array_multisort具体怎么用可以查下手册;
下面是我写的一个  原先不知道有自带函数。。
  /**
     * 对二维数组进行排序
     * @param type $arr
     * @param type $keys
     * @param type $type
     * @return type
     */
    function array_sort($arr, $keys, $type = 'asc') {
        $keysvalue = $new_array = array();
        foreach ($arr as $k => $v) {
            $keysvalue[$k] = $v[$keys];
        }
        if ($type == 'asc') {
            asort($keysvalue);
        } else {
            arsort($keysvalue);
        }
        foreach ($keysvalue as $k => $v) {
            $new_array[$k] = $arr[$k];
        }
        $array = array();
        foreach ($new_array as $v) {
            $array[] = $v;
        }
        return $array;
    }

Linux 下 svn服务器简单安装教程

svn  卸载  

rpm -e   subversion  一般卸载

rpm -e subversion –nodeps 强制卸载

svn –version  检测是否安装(客户端)

svnadmin –version 检测是否安装 (服务端)

安装:

yum install subversion(svn服务器)

mysql-server (用于codestriker)
httpd mod_dav_svn mod_perl (用于支持WEB方式管理SVN服务器)
sendmail (用于配置用户提交代码后发邮件提醒)
wget gcc-c++ make unzip perl* (必备软件包)
ntsysv vim-enhanced (可选)

配置

新建个文件夹

#mkdir /usr/local/svn  位置理论上可以随意

新建版本库

#svnadmin create /usr/local/svn/pro

创建版本库后,在这个目录下会生成3个配置文件:

authz  passwd  svnserve.conf   配置文件

authz   权限配置文件  passwd 用户名 口令文件  svnserve.conf   配置文件

authz   文件:

在网上找到一个很好的配置例子:

[groups]   组权限

admin = john, kate

devteam1 = john, rachel, sally

devteam2 = kate, peter, mark

docs = bob, jane, mike

training = zak

passwd 文件:

添加用户名 并设置密码 

[root@localhost conf]# cat passwd

### This file is an example password file for svnserve.

### Its format is similar to that of svnserve.conf. As shown in the

### example below it contains one section labelled [users].

### The name and password for each user follow, one account per line.

[users]

# harry = harryssecret

# sally = sallyssecret

在最下面 写  用户名=密码

例  user=123456   即 用户名=密码

svnserve.conf 文件:

anon-access: 控制非鉴权用户访问版本库的权限。

anon-access=none 的时候 不允许 匿名访问。

auth-access:  控制鉴权用户访问版本库的权限。

password-db: 指定用户名口令文件名。

authz-db:指定权限配置文件名,通过该文件可以实现以路径为基础的访问控制。

realm:指定版本库的认证域,即在登录时提示的认证域名称。若两个版本库的认证域相同,建议使用相同的用户名口令数据文件

以上代码行去除前面的 #号时 一定要顶格写 不然会报 配置文件错误

启动和停止服务

启动服务:

svnserve -d -r /usr/local/svn/pro

-d 表示后台运行  -r  是指定根目录

结束服务:

netstat  -ntlp  grep svn   查看进程

tcp        0      0 0.0.0.0:3690                0.0.0.0:*                   LISTEN      7303/svnserve

kill -9  7303 (进程数)结束进程

修改配置文件记得重启服务

php若干常见漏洞及介绍[转]

在甲方公司做代码审计一般还是以白盒为主,漏洞无非这么几类,XSS、sql注入、命令执行、上传漏洞、本地包含、远程包含、权限绕过、信息泄露等。

1.xss + sql注入

其中占大头的自然是XSS与SQL注入,对于框架类型或者有公共文件的,建议在公共文件中统一做一次XSS和SQL注入的过滤。写个过滤函数,可由如下所示:

$_REQUEST = filter_xss($_REQUEST);

$_GET = filter_xss($_GET);

$_POST = filter_xss($_POST);

$_COOKIE = filter_xss($_COOKIE);

$_POST = filter_sql($_POST);

$_GET = filter_sql($_GET);

$_COOKIE = filter_sql($_COOKIE);

$_REQUEST = filter_sql($_REQUEST);

这里有一点需要说明,$_REQUEST虽然等于$_GET+$_POST,但他们是独立的数组,也就是说假设改变了$_GET的值,但$_REQUEST的值还是原来的值,所以过滤时都不能落下,至于其他的如$_FILE之类的就可忽略了。

最简单的filter_xss函数是htmlspecialchars()

最简单的filter_sql函数是mysql_real_escape_string()

当然,谁都知道这种过滤filter_sql只能过滤字符型和搜索型的注入,对于数字型是没有办法的,但也说明做了这层过滤后,只需在后面注意数字型的SQL语句就可以了,遇到了加intval过滤就可以了,这就变得容易多了。

2. 命令执行

对于命令执行,可以从关键字入手,总共可分为3类

(1) php代码执行 :eval等

(2)shell命令执行:exec、passthru、system、shell_exec等

(3) 文件处理:fwrite、fopen、mkdir等

对于这几类需要注意其参数是否用户可控。

3.上传漏洞

对于上传漏洞,也是重点关注的地方,要仔细分析它的处理流程,针对上传的绕过方式是很多的,最保险的方式:在保存文件是采用文件名随机命名和后缀白名单方式。其次要注意的一点是上传文件的地方可能不止一处,不要有遗漏,可能会碰到这样的情况,突然在某个目录里面包含了一个第三方的编辑器在里面。

文件包含漏洞涉及的函数如include() 、include_once()、require()、require_once()、file_get_contents()等

最常见的还是出在下载文件功能函数,例如download.php?file=../../../etc/passwd 这种类型中。

4. 权限绕过

权限绕过可分为两类吧

(1)后台文件的未授权访问。后台的文件没有包含对session的验证,就容易出现这样的问题

(2)未作用户隔离,例如mail.php?id=23显示了你的信件,那么换个ID, mail.php?id=24就查看到了别人的信件,编写代码是方便,把信件都存在一个数据表里,id统一编号,前端展现时只需按id取出即可,但未作用户隔离,判定归属,容易造成越权访问。

这样的例子是很常见的,给某银行做评估是就经常发现这种漏洞。

5. 信息泄露

信息泄露算是比较低危的漏洞了,比如列目录这种就属于部署问题,而与代码审计无关了,而像暴路径、暴源码这种是需要防止的。曾经遇到这样的代码

<?php if(empty($_GET[‘a’])) {…} ?>

表面上似乎没问题,可是当请求变为 xx.php?a[]=1时,即参数变为数组的时候,就会发生错误以致路径泄露,而用isset判断则不会,当然一个个防太麻烦,建议在配置文件中关闭错误提示,或者在公共文件中加入如下代码以关闭错误显示功能:

<?php error_reporting(0);?>

当然,漏洞远不止这些,其他如cookie伪造、CSRF等非主流的就不介绍了

 

转自:http://blog.csdn.net/u011650048/article/details/12748429