PHP用socket模拟post之fsocketopen

 更新时间:2016年11月25日 15:59  点击:1775
PHP用socket模拟post之fsocketopen

地听说这个功能需求的时候,立即就蒙了,不骗大家!首先PHP的socket几乎都没使用过,其次没有听说过post还能用PHP的socket来模拟的呢!后来找了个案例看了看,才明白其实没有那么高深,只不过战地还不清楚post的原理和本质而已,其实本质就是发送给目的程序一个标志为post的协议串如下:


 POST /目的程序 HTTP/1.1
Accept: */*
Accept-Language: zh-cn,en-us;q=0.5
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; .NET CLR 1.0.3705; .NET CLR 1.1.4322)
Host: 要发送到的主机地址
Content-Length: 发送数据的长度
Pragma: no-cache
Cache-Control: no-cache
username=php&password=iask   //post发送的数据

我想大家对form的post方法应该是最熟悉不过了,例如我们想吧用户名和密码发送给某个页面的时候,点击有两个文本域的表单的提交按钮,这个表单发送到action程序的就是以上数据。知道了这一点我想就不难了。

这时候我们只需要用php的socket打开一个端口,例如80端口,把以上信息利用这个端口发送给目的程序就行了。

我们如何在一个端口上建立一个socket信道呢?
在PHP中是如此简单呢!

fsocketopen(主机名称,端口号码,错误号的接受变量,错误提示的接受变量,超时时间)

主机名称就是你需要发送数据的目的地;
端口号就是这个目的程序会在哪个端口等着你的数据;
错误号的接受变量,这个是如果建立socket不成功的时候返回的错误编号;
错误提示的变量,是错误的时候返回的错误提示信息;
超时时间,就是post数据之后如果对方没有回应信息,等待的最长时间。

如果不出意外(你正确的设置fsocketopen()函数的参数)的话,一个socket信道现在已经打开了,我们下一步需要做的就是,通过这个打开的信道把post请求协议发给目的程序,这时候可以使用fwrite或者fputs函数中的任意一个,把post的请求格式发给fsocketopen()打开的句柄,这时候一个伟大的socket模拟的post请求就诞生了。顺便说一下啊:

你发送的时候可不能把我的post请求格式直接ctrl + V过去,你没看见里面的汉字等你自己去填写的吗?

以上是文字的描述,如果大家觉得说的非常垃圾,非常没有说服力的话,下边有一个现成的程序片段,大家可以看看。


 $port = $url['port'] ? $url['port'] : 80;
$fp = fsockopen($url['host'], $port, $errno, $errstr,10);
if (!$fp) return "在主机: $url[host] $port 打开socket失败,失败原因是: $errno - $errstr";
fputs($fp, sprintf("POST %s%s%s HTTP/1.0rn", $url['path'], $url['query'] ? "?" : "", $url['query']));
fputs($fp, "Host:".$url['host']."rn");
fputs($fp, "Content-type: application/x-www-form-urlencodedrn");
fputs($fp, "Content-length: " . strlen($encoded) . "rn");
fputs($fp, "Connection: closernrn");
fputs($fp, "$encoded ");

对了还是顺便说一下吧,fgets($fp,1024);这个可以得到返回值的哦!!已经有不止一个人问过我咋接受返回了!!

get_magic_quotes_gpc

()函数


在PHP中()函数是内置的函数,这个函数的作用就是得到php.ini设置中magic_quotes_gpc选项的值。

那么就先说一下magic_quotes_gpc选项:
如果magic_quotes_gpc=On,PHP解析器就会自动为post、get、cookie过来的数据增加转义字符“”,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误。

在magic_quotes_gpc=On的情况下,如果输入的数据有
单引号(’)、双引号(”)、反斜线()与 NUL(NULL 字符)等字符都会被加上反斜线。这些转义是必须的,如果这个选项为off,那么我们就必须调用addslashes这个函数来为字符串增加转义。

正是因为这个选项必须为On,但是又让用户进行配置的矛盾,在PHP6中删除了这个选项,一切的编程都需要在magic_quotes_gpc=Off下进行了。在这样的环境下如果不对用户的数据进行转义,后果不仅仅是程序错误而已了。同样的会引起数据库被注入攻击的危险。所以从现在开始大家都不要再依赖这个设置为On了,以免有一天你的服务器需要更新到PHP6而导致你的程序不能正常工作。

当magic_quotes_gpc=On的时候,函数()就会返回1
当magic_quotes_gpc=Off的时候,函数()就会返回0

因此可以看出这个()函数的作用就是得到环境变量magic_quotes_gpc的值。既然在PHP6中删除了magic_quotes_gpc这个选项,那么在PHP6中这个函数我想也已经不复存在了。

php 自动加载函数 __autoload()

PHP在魔术函数__autoload()方法出现以前,如果你要在一个程序文件中实例化100个对象,那么你必须用include或者require包含进来100个类文件,或者你把这100个类定义在同一个类文件中——相信这个文件一定会非常大。
但是__autoload()方法出来了,以后就不必为此大伤脑筋了,这个类会在你实例化对象之前自动加载制定的文件。

下边我们通过一个例子来看一下,具体的使用方法,并在稍后说明使用PHP魔术函数__autoload应该注意些什么。

class ClassA{
 public  function __construct(){
  echo "ClassA load success!";
 }
}
 //定义一个类ClassA,文件名为ClassA.php
class ClassA{
 public  function __construct(){
  echo "ClassA load success!";
 }
}
class ClassB extends ClassA {
 public function __construct(){
  //parent::__construct();
  echo "ClassB load success!";
 }
}
 //定义一个类ClassB,文件名为ClassB.php,ClassB继承ClassA
class ClassB extends ClassA {
 public function __construct(){
  //parent::__construct();
  echo "ClassB load success!";
 }
}

定义两个测试用的类之后,我们来编写一个含有__autoload()方法的PHP运行程序文件如下:

 function __autoload($classname){
 $classpath="./".$classname.'.php';
 if(file_exists($classpath)){
  require_once($classpath);
 }
 else{
  echo 'class file'.$classpath.'not found!';
 }
}
 
$newobj = new ClassA();
$newobj = new ClassB();

这个文件的运行是一点问题都没有的,可见autoload是多么的好用啊,呵呵……
但是不得不提醒你一下几个方面是必须要注意的。

1、如果类存在继承关系(例如:ClassB extends ClassA),并且ClassA不在ClassB所在目录
利用__autoload魔术函数实例化ClassB的时候就会受到一个致命错误:
Fatal error: Class ‘Classd’ not found in ……ClassB.php on line 2,

解决方法:把所有存在extends关系的类放在同一个文件目录下,或者在实例化一个继承类的时候在文件中手工包含被继承的类;

2、另外一个需要注意的是,类名和类的文件名必须一致,才能更方便的使用魔术函数__autoload;

其他需要注意的事情:
3、在CLI模式下运行PHP脚本的话这个方法无效;

4、如果你的类名称和用户的输入有关——或者依赖于用户的输入,一定要注意检查输入的文件名,例如:.././这样的文件名是非常危险的。

或者你还对:PHP魔术函数__call()感兴趣!

您好y'all我是比较新的PHP的,请原谅我的愚蠢。

我目前正在与开关,我是想知道如何 - 如果可能的话在所有 - 添加到同一页上第二个变量。例如

我希望能到我的浏览器类型是:

php?scs=blah">www.mysite.com/index.php?scs=blah

并获得了我的网站的某些部分。同样地,我想类型:

www.mysite.com/index.php?atp=blah

并获得不同的部分。

我已经设定了两个变量,但问题是我有一个默认设置的第一个变量,需要熬夜。开关代码如下

$scs = $_GET['scs'];
@include('pt1.php');
switch($scs){
default:
@include('vm9.php');
break;
case vstr:
@include('vst/v1.php');
break;}$atp = $_GET['atp'];
switch($atp)
{    case credits:    @include('atp/credits.php');    break;}


 function doSomething(x)
{
            if(x === "someString")
    {         $("#item").css("background-color","blue");
$("div.items").slideUp("fast");
        $("input[checkbox]:checked").hide();
}
}

php 文件上传代码,限制jpg文件
<?php
    /* 图片上传类 www.lost63.com原创代码 仅限JPG格式图片 */
    class uploadFile
    {
        var $inputName; //input名称
        var $fileName; //文件命名
        var $fileProperty; //文件属性
        var $fileSize=2097152; //文件大小限制,2M
        var $filePath="upload/"; //文件存储路径
        function uploadFile($inputName){
            $this->inputName=$inputName;
            $this->getName(); //取得新的名称
            $this->fileSave();
        }
        //随机名称
        private function getName(){
            $this->fileName=date("YmdHms").rand(0,9).$this->getProperty();
        }
        //文件属性,返回后辍名
        private function getProperty(){
            if($_FILES[$this->inputName]["type"]=="image/pjpeg"||$_FILES[$this->inputName]["type"]=="image/jpeg"){
                return ".jpg";
            }else{
                exit("文件格式不对");
            }
        }
        //文件存储
        private function fileSave(){
            if($_FILES[$this->inputName]["size"]>$this->fileSize){
                exit("文件太大,最大限制为".$this->fileSize."字节");
            }
            if(!file_exists($this->filePath)){
                mkdir($this->filePath); //如果文件存储目录不存在,则建立;
            }
            move_uploaded_file($_FILES[$this->inputName]["tmp_name"],
                $this->filePath.$this->fileName);
        }
    }
    if($_GET['action']=="fileSave"){
        $f=new uploadFile("file");
        echo '<input name="textfield" type="text" size="30" value="'.$f->filePath.$f->fileName.'" /> 上传成功! <a href="'.$f->filePath.$f->fileName.'">浏览</a>';
    }else{
        echo '<form action="?action=fileSave" method="post" enctype="multipart/form-data" name="form1" id="form1">
              <input type="file" name="file" size="30" />
              <input type="submit" name="Submit" value="提交" />
            </form>';
    }
?>

[!--infotagslink--]

相关文章

  • gin 获取post请求的json body操作

    这篇文章主要介绍了gin 获取post请求的json body操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-15
  • C#使用Http Post方式传递Json数据字符串调用Web Service

    这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • PHP函数分享之curl方式取得数据、模拟登陆、POST数据

    废话不多说直接上代码复制代码 代码如下:/********************** curl 系列 ***********************///直接通过curl方式取得数据(包含POST、HEADER等)/* * $url: 如果非数组,则为http;如是数组,则为https * $header:...2014-06-07
  • C#模拟http 发送post或get请求的简单实例

    下面小编就为大家带来一篇C#模拟http 发送post或get请求的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • c# socket网络编程接收发送数据示例代码

    这篇文章主要介绍了c# socket网络编程,server端接收,client端发送数据,大家参考使用吧...2020-06-25
  • C#实现Socket通信的解决方法

    这篇文章主要介绍了C#实现Socket通信的解决方法,需要的朋友可以参考下...2020-06-25
  • 详解JS WebSocket断开原因和心跳机制

    这篇文章主要介绍了JS WebSocket断开原因和心跳机制,对websocket感兴趣的同学,可以参考下...2021-05-08
  • 详解C# Socket异步通信实例

    本篇文章主要介绍了C# Socket异步通信,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
  • Angular利用HTTP POST下载流文件的步骤记录

    这篇文章主要给大家介绍了关于Angular利用HTTP POST下载流文件的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Angular具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-07-26
  • 解决HttpPost+json请求---服务器中文乱码及其他问题

    这篇文章主要介绍了解决HttpPost+json请求---服务器中文乱码及其他问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-01-22
  • C#使用post发送和接收数据的方法

    这篇文章主要介绍了C#使用post发送和接收数据的方法,涉及C#使用post收发数据的相关技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • C# Socket的TCP通讯的实例代码

    本篇文章主要介绍了C# Socket的TCP通讯,socket通讯方式有两种:同步和异步,详细的介绍了这两种方法,有兴趣的可以了解一下。...2020-06-25
  • python使用socket高效传输视频数据帧(连续发送图片)

    本文主要介绍了python使用socket高效传输视频数据帧(连续发送图片),文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-23
  • 用Intel HAXM给Android模拟器Emulator加速

    Android 模拟器 Emulator 速度真心不给力,, 现在我们来介绍使用 Intel HAXM 技术为 Android 模拟器加速,使模拟器运行度与真机比肩。 周末试玩了一下在Eclipse中使...2016-09-20
  • JS如何实现基于websocket的多端桥接平台

    我们在调试过程使用的工具有:modheader,postman等,但这些工具都会存在的问题:缺少客户端里相应的设备信息;即使将cookie信息复制出来,也是存在过期的问题;多个设备之间切换时不方便;针对这些存在的问题,我基于websocket双向通信的特点,实现了多端桥接管理平台...2021-05-15
  • C语言中send()函数和sendto()函数的使用方法

    这篇文章主要介绍了C语言中send()函数和sendto()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • C# 实现WebSocket服务端教程

    这篇文章主要介绍了C# 实现WebSocket服务端教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-08
  • C# 模拟浏览器并自动操作的实例代码

    这篇文章主要介绍了C# 模拟浏览器并自动操作的实例代码,文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03