golang调用php7详解及实例教程

 更新时间:2017年1月22日 11:08  点击:2036
这篇文章介绍了golang调用php7详解及实例教程,有兴趣的同学可以参考一下

执行php文件

func Test_exec(t *testing.T) {
  engine.Initialize()
  ctx := &engine.Context{
    Output: os.Stdout,
  }
  err := engine.RequestStartup(ctx)
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.RequestShutdown(ctx)
  err = ctx.Exec("/tmp/index.php")
  iferr != nil {
    fmt.Println(err)
  }
}

其中 /tmp/index.php 的内容为

<?php
echo("hello\n");

Eval,返回值

func Test_eval(t *testing.T) {
  engine.Initialize()
  ctx := &engine.Context{}
  err := engine.RequestStartup(ctx)
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.RequestShutdown(ctx)
  val, err := ctx.Eval("return 'hello';")
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.DestroyValue(val)
  ifengine.ToString(val) !="hello"{
    t.FailNow()
  }
}

返回的value的生命周期所有权是golang程序,所以我们要负责DestroyValue

设置全局变量来传参

func Test_argument(t *testing.T) {
  engine.Initialize()
  ctx := &engine.Context{}
  err := engine.RequestStartup(ctx)
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.RequestShutdown(ctx)
  err = ctx.Bind("greeting","hello")
  iferr != nil {
    fmt.Println(err)
  }
  val, err := ctx.Eval("return $greeting;")
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.DestroyValue(val)
  ifengine.ToString(val) !="hello"{
    t.FailNow()
  }
}

传递进去的参数的生命周期是php控制的,在request shutdown的时候内存会被释放。

PHP 回调 Golang

type greetingProvider struct {
  greeting string
}
 
func (provider *greetingProvider) GetGreeting() string {
  returnprovider.greeting
}
 
func newGreetingProvider(args []interface{})interface{} {
  return&greetingProvider{
    greeting: args[0].(string),
  }
}
 
func Test_callback(t *testing.T) {
  engine.Initialize()
  ctx := &engine.Context{}
  err := engine.RequestStartup(ctx)
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.RequestShutdown(ctx)
  err = engine.Define("GreetingProvider", newGreetingProvider)
  iferr != nil {
    fmt.Println(err)
  }
  val, err := ctx.Eval(`
  $greetingProvider=newGreetingProvider('hello');
  return$greetingProvider->GetGreeting();`)
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.DestroyValue(val)
  ifengine.ToString(val) !="hello"{
    t.FailNow()
  }
}

PHP 错误日志

func Test_log(t *testing.T) {
  engine.PHP_INI_PATH_OVERRIDE ="/tmp/php.ini"
  engine.Initialize()
  ctx := &engine.Context{
    Log: os.Stderr,
  }
  err := engine.RequestStartup(ctx)
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.RequestShutdown(ctx)
  _, err = ctx.Eval("error_log('hello', 4); trigger_error('sent from golang', E_USER_ERROR);")
  iferr != nil {
    fmt.Println(err)
  }
}

其中 /tmp/php.ini 的内容为

error_reporting= E_ALL
error_log="/tmp/php-error.log"

错误会被输出到 /tmp/php-error.log。直接调用error_log会同时再输出一份到stderr

HTTP 输入输出

func Test_http(t *testing.T) {
  engine.Initialize()
  recorder := httptest.NewRecorder()
  ctx := &engine.Context{
    Request: httptest.NewRequest("GET","/hello", nil),
    ResponseWriter: recorder,
  }
  err := engine.RequestStartup(ctx)
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.RequestShutdown(ctx)
  _, err = ctx.Eval("echo($_SERVER['REQUEST_URI']);")
  iferr != nil {
    fmt.Println(err)
  }
  body, err := ioutil.ReadAll(recorder.Result().Body)
  iferr != nil {
    fmt.Println(err)
  }
  ifstring(body) !="/hello"{
    t.FailNow()
  }
}

所有的PHP超级全局变量都会被初始化为传递进去的Request的值,包括

$_SERVER
$_GET
$_POST
$_FILE
$_COOKIE
$_ENV

echo的内容,http code和http header会被写回到传入的ResponseWriter

fastcgi_finish_request

PHP-FPM 很常用的一个功能是 fastcgi_finish_request ,用于在php里做一些异步完成的事情。这个特殊的全局函数必须支持

func Test_fastcgi_finish_reqeust(t *testing.T) {
  engine.Initialize()
  buffer := &bytes.Buffer{}
  ctx := &engine.Context{
    Output: buffer,
  }
  err := engine.RequestStartup(ctx)
  iferr != nil {
    fmt.Println(err)
  }
  defer engine.RequestShutdown(ctx)
  ctx.Eval("ob_start(); echo ('hello');")
  ifbuffer.String() !=""{
    t.FailNow()
  }
  ctx.Eval("fastcgi_finish_request();")
  ifbuffer.String() !="hello"{
    t.FailNow()
  }
}

实际的作用就是把output提前输出到 ResposneWriter 里去,让调用方知道结果。对于当前进程的执行其实是没有影响的,只是影响了output。

这篇文章介绍了WAF的正确bypass,有需要的同学可以参考一下

前言 半年前的我,手握各种WAF的bypass,半年之后的我。就把思路分享出来了。别问我什么!问了我也不会告诉你,我是没事闲的!是不是好多人遇见WAF,就一阵头大呢~今天我就开车啦~大家快上车!

正文 测试环境

php:我使用的是 phpStudy

WAF:各种WAF的官网

测试思路 php的本地环境是用来检测sql语句是否可以执行。

WAF官网用来测试语句是否被拦截。

重点 :

1.HTTP数据包的认识。

2.充分利用数据库的注释功能。

3.有对WAF的构造思路。

测试代码 本地PHP存在注入漏洞的代码:

 
 代码如下 复制代码
<?
php$id=$_GET['x'];
$conn= mysql_connect('127.0.0.1','root','Lyy1314...');
mysql_select_db('ceshi',$conn);
$sql="select * from user where id={$id}";
$cun= mysql_query($sql);
echo"< charset=utf-8>";while($row= mysql_fetch_array($cun))
echo"url:".$row['URL']."<br>"; 
echo"password:".$row['password']."<br>"; 
echo"<hr>";
}
mysql_close($conn);
echo"您当前执行的SQL语句:";
echourldecode($sql);
?>
 

GET型注入测试 - 伪造HTTP数据包 GET型注入相对于POST注入来说,在某些方面是比POST注入bypass更轻松一些的。这是为什么呢?答案是因为POST数据包中也包含了GET包哦~我们可以通过伪造POST数据包的方式进行GET注入。

也就是说,GET的类型最少有三种,甚至更多的数据包类型可以进行注入。

如:POST、PUT、GET。

1.测试普通的GET型注入 

可以发现,上面成功接收到了GET数据包提交的数据。这是理所当然的!

2.测试POST提交的GET型注入 

从上面可以看出,POST数据包种,确实包含了GET的数据包。所以,在有些时候进行Bypass测试时,适当的改下数据包类型,也是可以的哦。

在360主机卫士的之前版本中,POST提交只拦截POST的数据,当你利用POST数据包进行GET注入时,它是不会进行拦截的哦~ GET型注入测试绕过云锁 - 伪造HTTP数据包 首先,我们去云锁的官网进行Bypass测试! 我们在云锁官网的URL后面加入 and 1=1 进行测试。

当然,正如所料 100% 被拦截 

一般情况,大家都会扭头就走~ 那我们现在来伪造个POST数据包,进行测试把~ 

正如我们期待的那样,伪造数据包后,WAF就被一棍子打死了~ 有时,即使我们伪造数据包后,仍过不了WAF,不要灰心,因为这个时候WAF的规则绝对比GET包的规则少哦~ GET型注入测试 - 合理构造HTTP数据包 - 思路 在http数据包中每个参数中间都会用&符连接,那么我们可不可以利用这个&符号呢? 下面我们先来进行本地测试! 

我们发现即使 &符后面的参数被 /* 包含住,这可以被接收到。并没有被注释掉! 那是因为, /* 被HTTP当成了参数a的值,而并不是当成了注释! 有时候,我们可以利用这个方法,加其他的方法来bypass。

后记 挖WAF的bypass时,一定要从多方面入手,编码,协议,语句等,甚至有时都会利用系统的截断!

推荐大家买一本关于 HTTP协议 方面的书籍进行阅读,因为,只有越接近底层,才能越了解它。最后从方方面面进行绕过。

有编程功底的,可以思考一下WAF的编写方式,哪里容易出现漏洞等~比如我们常常用来截断文件的%00,在安全狗中却能截断安全狗对HTTP协议的检测。比如菜刀过狗时,EVAL%00()是不会被杀的!不要只靠别人!思路是你自己的!你学到的知识也是属于你自己的!

这篇文章介绍了一个php实现的简单中文验证码功能的实例,实例代码简单易懂,有兴趣的同学可以尝试一下

本文实例讲述了php实现的简单中文验证码功能。分享给大家供大家参考,具体如下:

img.php

 
 代码如下 复制代码
<?php
session_start();
/*for($i=0;$i<4;$i++) {
  $rand .= dechex(rand(1,15));
}
$_SESSION[check_pic] = $rand;
*/
$image= imagecreatetruecolor(100, 30);
$bg= imagecolorallocate($image, 0, 0, 0);
$color= imagecolorallocate($image, 255, 255, 255);
//imagestring($image, rand(1,6), rand(3,60), rand(3,15), $rand, $color);
for($i=0;$i<3;$i++) {
  $color2= imagecolorallocate($image, rand(0,255), rand(0,255),rand(0,255));
  imageline($image, rand(0,100), 0, 100, 30,$color2);
}
//rand() ---->0-max 不大于100
for($i=0;$i<200;$i++) {
  imagesetpixel($image, rand()%100, rand()%30,$color2);
}
//$str = iconv("gbk", "utf-8", "中");
$str="中国";
$_SESSION[check_pic] =$str;
//解决中文,页面本身为utf-8
$str= mb_convert_encoding($str,"html-entities","utf-8");
//2:字体大小 3:倾斜角度 x , y 坐标
imagettftext($image, 12, 0, 20, 20,$color,'MSYH.TTF',$str);
//输出图片
header("Content-type: image/jpeg;charset=utf-8");
imagejpeg($image);
/*修改eclipse的配置,可以使得eclipse的新建项目的默认编码直接为UTF-8
在菜单栏的
Window->Preferences->General->Workspace->Text file encoding
将其改为UFT-8即可。*/
?>
 

sub.php

 
 代码如下 复制代码
<?php
  header("Content-type: text/html;charset=utf-8");
  session_start();
  if($_POST[check]) {
    if($_POST[check]==$_SESSION[check_pic]) {
      echo"验证码正确:".$_SESSION[check_pic];
    }else{
      echo"验证码错误:".$_SESSION[check_pic];
    }
  }
?>
<form action=""method="post">
  <img alt=""src="img.php"><br/>
  <input type="text"name="check"><br/>
  <input type="submit"value="提交">
</form>
 

运行效果图如下:

k-means聚类算法怎么用?K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,本次一聚教程网为大家带来的k-means聚类算法介绍将为大家详细介绍k-means聚类算法的原理、作用和用法。

前提条件

特定领域的经验要求:无

专业经验要求:无行业经验

不需要机器学习的知识,但是读者应该熟悉基本的数据分析(如,描述性分析)。为了实践该示例,读者也应该熟悉Python。

K-means聚类简介

K-means聚类是一种无监督学习,用于有未标记的数据时(例如,数据没有定义类别或组)。该算法的目标是在数据中找到分组,变量K代表分组的个数。该算法迭代地分配每个数据点到提供特征的K分组中的一个。数据点基于特征相似性聚集。K-means聚类算法的结果是:

1. K聚类的质心,它可以用来标记新数据

2. 训练数据标记(每个数据点被分配到一个单一的集群 )

聚类允许你发现和分析有机形成的组,而不是在查看数据之前定义组。下面例子中“选择K”的步骤描述如何确定组的数目。

集群的每个质心都是特征值的集合,它定义所产生的组。检查质心特征权重可以用来定性解释每个集群代表什么样的组。

这篇K-means聚类算法涵盖了:

  • 使用K-means的常见商业案例

  • 运行该算法所涉及的步骤

  • 使用一个配送车队数据的Python示例

商业用途

K-means聚类算法用来查找那些包含没有明确标记数据的组。这可以用于确定商业假设,存在什么类型的分组或为复杂的数据集确定未知组。一旦该算法已运行并定义分组,任何新数据可以很容易地分配到正确的组。

这是一个通用算法,可以用于任何类型的分组。用例的一些例子是:

  • 行为细分

    • 根据购买历史细分

    • 根据应用程序、网站或平台上的活动细分

    • 定义基于利益的角色

    • 基于活动监视创建图表

  • 库存分类

    • 按销售活动分

    • 按生产指标分

  • 传感器测量数据分类

    • 检测运动传感器中的活动类型

    • 图片分组

    • 分离音频

    • 健康检测中的分组

  • 检测机器人或异常

    • 来自机器人的单独有效活动组

    • 清理孤立点检测的有效活动组

此外,监测是否一个被跟踪的数据点随着时间在组之间切换,这可以用来检测数据有意义的变化。

算法

Κ-means聚类算法使用迭代细化来产生最终的结果。该算法的输入是聚类的数目Κ和数据集。数据集是每个数据点特征的集合。该算法从为K质点初始估计开始,它可以随机生成或从数据集中随机选择。然后该算法在以下两步之间迭代:

1. 数据分配步骤

每个质点定义一个聚类。在本步骤中,每个数据点被分配到离它最近的质心,基于欧氏距离的平方。更准确地说,如果ci是集合C质心的集合,然后每个数据点x被分配到一个聚类,基于

dist( · )是标准(L2)欧氏距离。数据点集分配每个ith聚类质心Si。

2. 质心更新步骤:

在本步骤中,质心被重新计算。这通过分配所有数据点的平均值到质心的聚类来实现。

该算法在步骤1和步骤2之间迭代直到满足停止标准(如,没有数据点改变聚类,距离之和最小化,或者达到了最大的迭代次数)。

该算法保证收敛到一个结果。其结果可能是一个局部最优(例如,不一定是最好的结果),意思是使用随机开始质心评估多个运行的算法可能给出更好的结果。

选择K

上述算法查找聚类和一个特定的预先选定K的带标记的数据。为了查找数据中的聚类个数,用户需要为在K值范围内运行K-means聚类算法并比较结果。总体而言,目前还没有确定K精确值的方法,但可以使用以下技术获得准确的估计。

通常用于比较不同K值结果的度量之一是数据点和它们聚类质心的平均距离。由于增加聚类的数量总是会减少数据点的距离,增加K总

是会降低这个度量,当k与数据点数相同时达到极值。因此,这个度量不能作为唯一的指标。相反,平均距离到质心作为一个函数的K

被绘制并且急剧下降率的地方“肘点”,可用于大致确定K。

有许多其它技术确认K,包括交叉验证、信息标准、信息理论跳法、影像法和G-means算法。另外,监测数据点跨组分布可以深入了解

该算法如何为每个k分割数据。

示例:应用K-Means聚类到配送车队数据

举例来说,我们将展示K-means算法如何处理配送车队司机数据的样本数据集。简单起见,我们只会看两个司机特征:平均每天驾驶距离和一个司机>5mph以上速度限制的平均时间百分比。总

体而言,该算法可以用于任何数量的特征,只要数据样本的个数比特征的数量大的多。

步骤1:清洁和改造数据

在本例中,我们已经清理并完成了一些简单的数据转换。数据样本作为pandas DataFrame如下所示。

下面的图表显示了4,000个司机的数据集,x轴表示距离特征,y轴表示加速特征。

步骤2: 选择K并运行该算法

首先选择K=2。对于本例,使用Python包scikit-learn和NumPy进行计算,如下所示:

类别标记以kmeans.labels_返回。

步骤3:审查结果 

结果如下所示。你可以看到K-means算法基于距离特征分成两组。每个聚类质心用一颗星标记。

  • 组1的质心 = (49.62, 8.72)

  • 组2的质心 = (179.73, 17.95)

使用数据集的领域知识,我们可以推断组1是都市司机,组2是乡村司机。

步骤4: 对K的多个值迭代

测试K=4的结果。完成这个,你只需要的改变是KMeans()函数中聚类的目标数量。

下面的图表显示了聚类的结果。我们看到由该算法确定了四个不同的组;现在超速驾驶的司机已经与那些遵守速度限制的分开,除了乡村和都市的差别。城市驾驶组比农村司机的速度门槛较

低,可能是由于城市司机在交叉路口和停车交通上花费更多的时间。

附加说明和备选方案

特征工程

特征工程是使用领域知识选择哪些数据度量作为特征输入到机器学习算法的过程。特征工程在K-means聚类中起着关键作用;使用有意义的特征捕获数据的可变性至关重要,针对算法找出所有自然产生的组。

分类数据(例如,分类标志如性别,国家,浏览器类型)需要被编码或者以一种仍然可以使用该算法的方式分离数据。

特征变换,特别是代表利率而不是测量,可以帮助规范化数据。例如,在上面交付车队的例子中,如果使用总驾驶距离而不是每天平均距离,那么驾驶员通过他们在公司驾驶多久而不是乡村和都市的分组。

备选方案

有很多可供替代的聚类算法存在,包括DBScan,谱聚类,和高斯混合建模。维数约减技术,如主成分分析,可以用于数据中的不同组模式。一种可能的结果是数据中没有有机聚类;相反,所

有的数据沿着一个单一组的连续特征范围。既然这样,你可能需要重新查看数据特征以查看是否需要包括不同的测量或者特征变换将更好地代表数据的可变性。此外,你可能想强加分类或者

基于知识领域标记并修改你的分析方法。

[!--infotagslink--]

相关文章

  • Painter绘制红衣喝酒男水粉画效果教程

    今天小编在这里就来给Painter的这一款软件的使用者们来说一说绘制红衣喝酒男水粉画效果的教程,各位想知道具体绘制步骤的使用者,那么下面就快来跟着小编一起看一看教程...2016-09-14
  • iPhone6怎么激活?两种苹果iPhone6激活教程图文详解

    iPhone6新机需要激活后才可以正常使用,那么对于小白用户来说,iPhone6如何激活使用呢?针对此问题,本文就为大家分别介绍Wifi无线网络激活以及iPhone6连接电脑激活这两种有效的方法,希望本文能够帮助到大家...2022-09-14
  • Photoshop制作雨中野外孤独行走的一头牛海报教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说下制作雨中野外孤独行走的一头牛海报的教程,各位想知道具体制作方法的使用者们,大家就快来看一看小编给...2016-09-14
  • Painter绘制帅气卡通魔法王子漫画教程

    今天小编在这里就来给Painter的这一款软件的使用者们来说一下绘制帅气卡通魔法王子漫画的具体教程,各位想知道绘制步骤的使用者,那么下面就快来跟着小编一起看一看教程...2016-09-14
  • Illustrator鼠绘堆雪人的孩童矢量插画教程

    今天小编在这里就来给各位Illustrator的这一款软件的使用者们来说说鼠绘堆雪人的孩童矢量插画的教程,各位想知道具体绘制方法的使用者们,那么各位就快来跟着小编来看看...2016-09-14
  • 安卓手机app添加支付宝支付开发教程

    支付宝支付在国内算是大家了,我们到处都可以使用支付宝了,下文整理介绍的是在安卓app应用中使用支付宝进行支付的开发例子。 之前讲了一篇博客关与支付宝集成获取...2016-09-20
  • 美图秀秀给照片天空加蓝天白云教程一览

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下究竟该怎么给照片天空加蓝天白云的教程,各位想知道具体制作步骤的,那么下面就来跟着小编一起看看吧。 ...2016-09-14
  • llustrator绘制扁平化风格卡通警察护士空姐肖像教程

    今天小编在这里就来给llustrator的这一款软件的使用者们来说一说绘制扁平化风格卡通警察护士空姐肖像的教程,各位想知道具体绘制步骤的使用者们,那么下面就快来跟着小编...2016-09-14
  • Illustrator绘制一个方形的录音机图标教程

    今天小编在这里就来给Illustrator的这一款软件的使用者们来说一下绘制一个方形的录音机图标的教程,各位想知道具体绘制方法的使用者们,那么下面就来看一下小编给大家分...2016-09-14
  • photoshop简单制作一个搞笑的换脸表情包教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说一说简单制作一个搞笑的换脸表情包的教程,各位想知道具体制作方法的使用者们,那么大家就快来看一看教程吧。...2016-09-14
  • Spring AOP 对象内部方法间的嵌套调用方式

    这篇文章主要介绍了Spring AOP 对象内部方法间的嵌套调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-08-29
  • photoshop给手绘画调色变换场景后期教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说说给手绘画调色变换场景的后期教程,各位想知道具体后期处理步骤的使用者们,那么大家就快来跟着小编来看...2016-10-02
  • 美图秀秀让你胸丰满起来处理教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说一下让你胸丰满起来的处理教程,各位想知道具体处理步骤的,那么下面就快来跟着小编一起看一下教程吧。 给...2016-09-14
  • Painter绘制雷神传插画教程

    今天小编在这里就来给Painter的这一款软件的使用者们来说一下绘制雷神传插画的教程,各位想知道具体绘制步骤的使用者,那么下面就快来跟着小编一起看看绘制方法吧。 ...2016-09-14
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • c# 三种方法调用WebService接口

    这篇文章主要介绍了c# 三种方法调用WebService接口的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
  • 美图秀秀制作隔离区聊天背景教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下制作隔离区聊天背景的教程,各位想知道具体方法的,那么下面就快来跟着小编一起看一看吧。 给各位美图秀...2016-09-14
  • MySQL中的联合索引学习教程

    联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进...2015-11-24
  • Lua语言新手简单入门教程

    这篇文章主要给大家介绍的是关于Lua语言新手入门的简单教程,文中通过示例代码一步步介绍的非常详细,对各位新手们的入门提供了一个很方便的教程,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。...2020-06-30
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24