php集成环境与分开安装的原生版环境对比

 更新时间:2016年11月25日 15:22  点击:2238
大家都知道,运行动态网页,是需要相关的环境支持才行,所以不管你是学习php,还是做php的工作,都必须要安装php运行环境。

运行php的环境很多,windows下有 apache+php+mysql 和 iis+php+mysql,linux下有 apache+php+mysql 。后者别无选择,前者就多了。


我们平时的学习和工作大多还是用的windows系统,当配置环境时,网上一搜,php集成环境一大片。那么使用php集成环境好吗?是应该使用集成环境呢还是一步步亲自安装原生态的好呢?

 

下面以我个人经验分析一下它们的区别。


学习性上:


安装原生版的可以让你学习怎么配置apache+php+mysql 或 iis+php+mysql,这样也能让你更了解它们的工作原理,以至于后期能熟悉的配置出自己所需的个性化环境。集成环境的话,什么都帮你做好了,即使用过很久后,也不太知道底层的工作原理,一旦出现问题,你还是会不知所措。


稳定性上:


我记得刚开始学习php的时候,总觉得安装php环境很难,不是这里没到位就是那里弄错了。然后就百度一下,php集成环境。我用过WampServer和APMServ,刚开始觉得还好,用久了发现总是容易出问题,特别是APMServ,经常遇到mysql无法启动的情况。后来,工作的需要,便学着去安装php原生态的环境,学会了才发现,其实安装很简单,网上一搜,图文教程一大把,所以安装起来并不难,而且一次学习、学会,终生受益,何乐而不为呢?从这以后我就一直在用,从未出现问题过,而且经常会去根据需求改一些配置,现在对一些基本的东西已经非常熟悉了。

所以,我个人之见,如果是满足一时之需的话,比如在别人电脑上为了快捷可以去安装php集成环境,如果是自己学习和工作,那么尽量尝试配置原生版的。

 

现在有很多php开发框架都提供关于防XSS攻击的过滤方法,下面和大家分享一个预防XSS攻击和ajax跨域攻击的函数,摘自某开发框架,相比于仅仅使用内置函数应该还是够强了的吧。

对网站发动XSS攻击的方式有很多种,仅仅使用php的一些内置过滤函数是对付不了的,即使你将filter_var,mysql_real_escape_string,htmlentities,htmlspecialchars,strip_tags这些函数都使用上了也不一定能保证绝对的安全。

那么如何预防 XSS 注入?主要还是需要在用户数据过滤方面得考虑周全,在这里不完全总结下几个 Tips

1. 假定所有的用户输入数据都是“邪恶”的
2. 弱类型的脚本语言必须保证类型和期望的一致
3. 考虑周全的正则表达式
4. strip_tags、htmlspecialchars 这类函数很好用
5. 外部的 Javascript 不一定就是可靠的
6. 引号过滤必须要重点注意
7. 除去不必要的 HTML 注释
8. Exploer 求你放过我吧……

方法一,利用php htmlentities函数

例子

php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 。

在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义.

所以,htmlspecialchars函数更多的时候要加上第二个参数, 应该这样用: htmlspecialchars($string,ENT_QUOTES).当然,如果需要不转化如何的引号,用htmlspecialchars($string,ENT_NOQUOTES).

另外, 尽量少用htmlentities, 在全部英文的时候htmlentities和htmlspecialchars没有区别,都可以达到目的.但是,中文情况下, htmlentities却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。

htmlentities和htmlspecialchars这两个函数对 '之类的字符串支持不好,都不能转化, 所以用htmlentities和htmlspecialchars转化的字符串只能防止XSS攻击,不能防止SQL注入攻击.


所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312) 。

方法二,什么也不多说我们给一个函数


例子

 代码如下 复制代码

function xss_clean($data){
 // Fix &entity\n;
 $data=str_replace(array('&','<','>'),array('&','<','>'),$data);
 $data=preg_replace('/(&#*\w+)[\x00-\x20]+;/u','$1;',$data);
 $data=preg_replace('/(&#x*[0-9A-F]+);*/iu','$1;',$data);
 $data=html_entity_decode($data,ENT_COMPAT,'UTF-8');
 // Remove any attribute starting with "on" or xmlns
 $data=preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu','$1>',$data);
 // Remove javascript: and vbscript: protocols
 $data=preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu','$1=$2nojavascript...',$data);
 $data=preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu','$1=$2novbscript...',$data);
 $data=preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u','$1=$2nomozbinding...',$data);
 // Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
 $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i','$1>',$data);
 $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i','$1>',$data);
 $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu','$1>',$data);
 // Remove namespaced elements (we do not need them)
 $data=preg_replace('#</*\w+:\w[^>]*+>#i','',$data);
 // http://www.111cn.net/
 do{// Remove really unwanted tags
  $old_data=$data;
  $data=preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i','',$data);
 }while($old_data!==$data);
 // we are done...
 return $data;
}

网站给机器发重复内容重复注册己经不是什么希事了,我们只要有注册页面或者是评论页面就会有这种问题出现了,下面我找了两个例子大家一起看看。

网站开放注册的时候有一些渣渣就喜欢乱搞我们的网站。使我们站长们 都是蛋疼无比。所以就去百度找了找防止恶意注册。一般都是加验证码。但是会网页的人一般都是在你的要提交的那个页面利用url传参数。在写入数据的文件没有写好 就很容易被利用了! 所以我得出了2个解决方法

例子、

1.在提交的时候获取客户端IP 在IP第二次访问或者第三次提交数据的时候视为恶意提交

2.使用session访问2次或者3次 视为恶意注册

以下是代码:

 代码如下 复制代码

<?php
 $cs = $_SESSION['cs'] = $_SESSION['cs']+1;//每访问一次加1
 $sql = "INSERT INTO ".$DB_PREFIX."user (username,password,nickname,role,photo,email,description) VALUES ('$username','$password','$user_namex','writer','','$name_mailbox','')";
 if($cs < "2"){//页面被反复刷新的时候 不执行代码
 if( mysql_query($sql) == 1){?>
 <script language="javascript" type="text/javascript"> 
location.href='cache.php';
</script>
 <?php }}else{echo "警告别恶意注册!"; } ?>

当然这个办法也不是很好的。但是目前就感觉这个比较好了

例子、

比较高级的办法RSA算法进行加密通讯 .

avascript部分代码(with jQuery)

 代码如下 复制代码

 

    $(document).ready(function(){ 
    //十六进制公钥 
    var rsa_n = "C34E069415AC02FC4EA5F45779B7568506713E9210789D527BB89EE462662A1D0E94285E1A764F111D553ADD7C65673161E69298A8BE2212DF8016787E2F4859CD599516880D79EE5130FC5F8B7F69476938557CD3B8A79A612F1DDACCADAA5B6953ECC4716091E7C5E9F045B28004D33548EC89ED5C6B2C64D6C3697C5B9DD3"; 
         
    $("#submit").click(function(){ 
        setMaxDigits(131); //131 => n的十六进制位数/2+3 
        var key      = new RSAKeyPair("10001", '', rsa_n); //10001 => e的十六进制 
        var password = $("#password").val(); 
        password = encryptedString(key, password); //不支持汉字 
        $("#password").val(password); 
        $("#login").submit(); 
        alert(password); //test 
    }); 
    }); 

 

PHP部分代码

 代码如下 复制代码

 

    /**
     * 公钥加密
     * www.111Cn.net
     * @param string 明文
     * @param string 证书文件(.crt)
     * @return string 密文(base64编码)
     */ 
    function publickey_encodeing($sourcestr, $fileName) 
    { 
        $key_content = file_get_contents($fileName); 
        $pubkeyid    = openssl_get_publickey($key_content); 
         
        if (openssl_public_encrypt($sourcestr, $crypttext, $pubkeyid)) 
        { 
            return base64_encode("".$crypttext); 
        } 
    } 
    /**
     * 私钥解密
     *
     * @param string 密文(二进制格式且base64编码)
     * @param string 密钥文件(.pem / .key)
     * @param string 密文是否来源于JS的RSA加密
     * @return string 明文
     */ 
    function privatekey_decodeing($crypttext, $fileName, $fromjs = FALSE) 
    { 
        $key_content = file_get_contents($fileName); 
        $prikeyid    = openssl_get_privatekey($key_content); 
        $crypttext   = base64_decode($crypttext); 
        $padding = $fromjs ? OPENSSL_NO_PADDING : OPENSSL_PKCS1_PADDING; 
        if (openssl_private_decrypt($crypttext, $sourcestr, $prikeyid, $padding)) 
        { 
            return $fromjs ? rtrim(strrev($sourcestr), "/0") : "".$sourcestr; 
        } 
        return ; 
    } 
    //JS->PHP 测试 
    $txt_en = $_POST['password']; 
    $txt_en = base64_encode(pack("H*", $txt_en)); 
    $file = 'ssl/server.pem'; 
    $txt_de = privatekey_decodeing($txt_en, $file, TRUE); 
    var_dump($txt_de); 
    //PHP->PHP 测试  www.111cn.net
    $data = "汉字:1a2b3c"; 
    $config = Core::getInstance()->config; 
    $file1 = 'ssl/server.crt'; 
    $file2 = 'ssl/server.pem'; 
    $a = publickey_encodeing($data, $file1); 
    $b = privatekey_decodeing($a, $file2); 
    var_dump($b); 

 

其中密钥的获取是关键(其他难点已经被从代码中解决)

下面来给大家分享两个关于php威盾解密的例子,一个是批量解密一个是超级算法的解密都非常的好,大家有举的进入参考。

例子,批量解密

 代码如下 复制代码

<?php
/***********************************
*威盾PHP加密专家解密算法 By:zhrt
*http://www.111cn.Net
*2013.12.31
*把该程序放到网站程序的目录下,即可针对文件所在目录及子目录的文件进行破解,源加密文件被更改名为.bak.php.
***********************************/ 

//decode("Image.class.php");

function explorerdir($dir)
{
 $dp=opendir($dir); //打开目录句柄
 //echo " ".$dir."rn"; //输出目录
 while ($file = readdir($dp)) //遍历目录
 {
    if ($file !='.'&&$file !='..') //如果文件不是当前目录及父目录
    {
  $path=$dir.DIRECTORY_SEPARATOR.$file; //获取路径
  if(is_dir($path)) //如果当前文件为目录
  {
   explorerdir($path);   //递归调用
  }
  else   //如果不是目录
  {

   //echo "-".$path."n"; //输出文件名

  echo decode($path);

  }
    }
 }
 closedir($dp);    //关闭文件名柄

}
explorerdir(".");    //调用当前目录

function decode($filename="")
{

 if(pathinfo($filename, PATHINFO_EXTENSION)!="php" || strpos($filename,".bak.php") || realpath($filename) == __FILE__ ){return;}

 //$filename="intro.class.php";//要解密的文件 

 if(!file_exists($filename))
 {
  exit("file is not exist;");

 }

 $lines = file($filename);//0,1,2行 

 //第一次base64解密
 $content="";
 if(preg_match("/O0O0000O0('.*')/",$lines[1],$y))
 {
  $content=str_replace("O0O0000O0('","",$y[0]);
  $content=str_replace("')","",$content);
  $content=base64_decode($content);
 }
 else
 {
  weidun_log(false,realpath($filename)." is not Encrypted!");
  return false;

 }
 //第一次base64解密后的内容中查找密钥
 $decode_key="";
 if(preg_match("/),'.*',/",$content,$k))
 {
  $decode_key=str_replace("),'","",$k[0]);
  $decode_key=str_replace("',","",$decode_key);
 }
 //查找要截取字符串长度
 $str_length="";
 if(preg_match("/,d*),/",$content,$k))
 {
  $str_length=str_replace("),","",$k[0]);
  $str_length=str_replace(",","",$str_length);
 }
 //截取文件加密后的密文
 $Secret=substr($lines[2],$str_length);
 //echo $Secret; 

 //直接还原密文输出
 echo "<!-- <?phpn".base64_decode(strtr($Secret,$decode_key,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'))."?> -->"; //很奇怪,去掉这行,下面的代码就出现问题,可能跟编码有关,在这里我就暂时不做进一步分析了,注视掉避免界面缭乱。
 //echo "解密中....<br>";
 $filecontent = "<?phpn".base64_decode(strtr($Secret,$decode_key,'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'))."?>";
 //echo $filecontent;
 $filenamebak = str_replace(".php",".bak.php",$filename);

 if(!file_exists($filenamebak)){

  if(rename($filename,$filenamebak))
  {

   if(!file_exists($filename) && file_exists($filenamebak))//文件被更改成功
   {

    $fp = fopen($filename,"w");
    fwrite($fp,$filecontent);
    fclose($fp);

   }

  }

 }else{

     //return("备份文件".$filenamebak."已存在,停止解密。");
  weidun_log(false,realpath($filenamebak)." is exist!");
  return false;

 }
  weidun_log(true,realpath($filename)." - successful!");
 return $filename." - successful! n";

}

function weidun_log($s = true,$c ="")
{

 if($s)
 {
  $fp = fopen("./log.txt","a+");
  fwrite($fp,$c."n");
  fclose($fp);
 }
 else
 {
  $fp = fopen("./log_error.txt","a+");
  fwrite($fp,$c."n");
  fclose($fp);
 }

}
?>

例子,一个强人的加密做法

 代码如下 复制代码

<?php
function pass($str){
 Return  htmlspecialchars(base64_decode(strtr($str, 'EnteryouwkhRHYKNWOUTAaBbCcDdFfGgIiJjLlMmPpQqSsVvXxZz0123456789+/=', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/')));
 }
echo  nl2br(pass('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W1WICoiIRMnpcoEIWaHICoivfoaSUBOIRtieT1aKatiIc29vcoEVColLCtLqW09aTlWPCo1lcol1dBEVColLCtLQHt41hU8PW09aTlWPCofvd2OIRMnpcoEph0YNaA5AhonscBOpfB1IRMnpcoEph0YNaA5AhonJCBOIRMnpcoEphUPxHeEIWaHICuYifolzcMyjfolvdMEIOlkNTUnIGZO0DolzRT50CBkScbnZcb1Pd3OldoEICoiIwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1jd21scB50CtnIc29vcoEIT04ICoiIRMnpcoE9Cofvd2OIRMnPd3OldrlLCtnnTLWICofvd2OIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIc29vcoEVColzcoaSCe0XwryKOtnIc29vcoEVCuYjd3klCe0m5DB96h+rkZnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9C29sdBaVfoEICo1lcol1dBEIT04ICoiIRMnpcoE9Co1lcol1dBEVCoivfoaSUBOIwryKOtnIdBaLDbasCt5IF3OifuazCe0m5dGZ5D6i5Qt4kZnnTLWICo1lcol1dBEVColzcoaSCe0XwryKOtnIdBaLDbasCt5IF2YvFMaINUgLVh3Pq4WmwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1jd21scB50CtnICMyLCtnNTJnIDoEVColLCe1ICMyLCt5IDo90cBxkcoEIWA5rwonJCBOIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnICMyLCt5IDbYLcBxINTEIWA5rwonJCBOIRMnzC29ZcBE9k+B3qVJvitFIa0iyALAICoiIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIDoEVColzcoaSCe0XwrfUT1aWwrkcwonPCt5IDBOIhUnIF2EIT04ICoiIRMnpcoE9CuYIRMnPd3OldrlLCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9Foivfo9Iwonjd2EIT04ICoiIRMnjd3clFME9CoYvCt5IDBOIwryKOtnIC29IRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIC29IRMnpF2OldoE9HtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9Foivfo9IwonXCtnNTJnIDoEVColLCe1IFoEVCoYifoamd3k5AMaSUBOIwryKOtnIFoEVCoYifoamd3k5TMyscBE9k2ivfoaSkZnnTLWICunIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIFoEVColzcoaSCe0XwyfwOakywonPCt5IF3OifuazCe0m5dGZ5D6i5Qt4kZnnTLWICoiIRMnpF2OldoE9HtnnTLWICoxIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIdoEVColzcoaSCe0XwryKOtnICBEVCuY0CbO1F2E9k+B3SVBVPGDIVtFIWA5rwoniCt5IDbYLcBxINTEIWA5rwonjfoEVCuY0CbO1F2E9k+B3SVBVPGDIVtFIWA5rwonjfoEVColzcoaSCe0XwryKOtnIFucIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIFucIRMnpF2OldoE9HtnnTLWICoiIRMnpcoE9kolLwrfUT1aWwrkcwonPCt5IDBOIwJL7eWp9eWpXfBkSDBHIcmaVC3Opd24Ic2a0TolzftILf2ilFMASko9ZcoaZWmLSkolzWaYewe0IaykaOUXLDB5LcbIINUExRtOzDbplwe0IHtLIGX0hkuY0Cbk0we0IhtOpdMOlGtEsHULIhJELF2l6cTSYtJOzFBXINUEJA0aHOAYAwonPd3OldoEVhJxIcMy2d3kpfoaIRMnJd29qTmasCtxIFukpC2aIRMnXFMljcBESCoYifoamd3k5CtnoAL9YwtiTOAxyW1WICoiIRJPSCoYvCt5IdMyscBEIWaHICoYvfMaZTMyscBESCoxIRMnVCB1lCtnnAZnIdoa2cBxKCB1lCtxIdoEVCunpC3O1FMaIwryTwonScbcldynpC3O1FMaIRonSCt5IcolzFoxiGA9ZcoaZCtnnAZnIdoa2cBxNFMOlFMESCoyIRMnVCB1lCtnnAZnICbklCA5idBaIRonjfoEVCo5idBaIwryTwonjDbO5TMyscBESCun2Ct5IdMyscBEIWaHICunZd3cpdMYlTMyscBESCoxsCt5IdMyscBEIWaHICoxidMOsCbkqTMyscBESwonSdBEVCoYifoamd3k5CtnnAZnIdoyVco1iFMsjCbOlc29ZGBEIRonzCBEVCo5idBaIwryTwonzDo9XCbklCA5idBaIRrloTlaHTtiIC2EVCoYvdB1ldmOKfB1IReEpwryTwonjd21scB50TmasCtxeOAlHUA5uhrloTlaHTtiIF2EVCuYifolzcMyjfolvdMESHTEXhULIWaHICuYifolzcMyjfolvdMESW09aTlWPCunIRMnpcoEpwryTwonXDo90d051dBESCoYifoamd3k5CtnoAL9Ywon7kuOPDbHsNmOiCMxlFuklgBivfoaSCtnIDoEITraoatnhT0lKwon7kuOPDbHsNmOiCMxlFuklgBxlfMaSCtnIdoEIT04ICoiIRMnScbcldrlLCe1IdoEVColLCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9CbklCBEICoyIwr9KwonPCt5ICbklCAlLCe1ICBEVColLCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9C2l0GBEICoY0CtnNTJnICBEVCoYpfulkcoE9CoY0Ct5IDBOIwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1XFM92DB5jcBEICun2CtnNTJnIC3OIRMnXFM92DB5jcAlLCe1IFucIRMnpcoEITraoatnhT0lKwon7kuOPDbHsNmOiCMxlFuklgBxidMOsCbkqCtnIdo1Iwr9KwonPCt5IdoyVco1iFMskcoE9CoxsCt5IDBOIwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1zDo9XCbklCBEICuYiCtnNTJnIDoEVCuYPd3niFMaiUBOINBnzCBEVColLCtnHOAcAwrpNUA4IhyYyTraeatnIDoEVColLCtnnAZnIDo90cBxkcoESW09aTlWPCoYIRMnpcoEpwryTwonjd21scB50TmasCtnoAL9Ywon7kuOPDbHsNmOiCMxlFuklgBYvdB1ldmOIwonjCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9Do90cBxIwonPCtnNTJnIC2EVCoivfoaSUBOINBnPCt5IDBOIwyfwOakywonjCt5IF3OifuazCe0m5dGZ5D6i5Qt4kZnnTLWICoYIRMnpF2OldoE9HtnuAL9aAtntBUnIDoEVColLCtLICoYIwr9KwonPCt5IDBOINBnjCt5IDo90cBxkcoEITraoatnhT0lKwtiTOAxyW1WICoiIRMnpcoEIWaHICoivfoaSUBOIRtieT1aKatiIc29vcoEVColLCtLqW09aTlWPCo1lcol1dBEVColLCtLQHt41hU8PW09aTlWPCofvd2OIRMnpcoEph0YNaA5AhonscBOpfB1IRMnpcoEph0YNaA5AhonJCBOIRMnpcoEphUPxHeEIWaHICuYifolzcMyjfolvdMEIOlkNTUnIGZO0DolzRT50CBkScbnZcb1Pd3OldoEICoiIwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1jd21scB50CtnIc29vcoEIT04ICoiIRMnpcoE9Cofvd2OIRMnPd3OldrlLCtnnTLWICofvd2OIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIc29vcoEVColzcoaSCe0XwryKOtnIc29vcoEVCuYjd3klCe0m5DB96h+rkZnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9C29sdBaVfoEICo1lcol1dBEIT04ICoiIRMnpcoE9Co1lcol1dBEVCoivfoaSUBOIwryKOtnIdBaLDbasCt5IF3OifuazCe0m5dGZ5D6i5Qt4kZnnTLWICo1lcol1dBEVColzcoaSCe0XwryKOtnIdBaLDbasCt5IF2YvFMaINUgLVh3Pq4WmwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1jd21scB50CtnICMyLCtnNTJnIDoEVColLCe1ICMyLCt5IDo90cBxkcoEIWA5rwonJCBOIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnICMyLCt5IDbYLcBxINTEIWA5rwonJCBOIRMnzC29ZcBE9k+B3qVJvitFIa0iyALAICoiIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIDoEVColzcoaSCe0XwrfUT1aWwrkcwonPCt5IDBOIhUnIF2EIT04ICoiIRMnpcoE9CuYIRMnPd3OldrlLCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9Foivfo9Iwonjd2EIT04ICoiIRMnjd3clFME9CoYvCt5IDBOIwryKOtnIC29IRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIC29IRMnpF2OldoE9HtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9Foivfo9IwonXCtnNTJnIDoEVColLCe1IFoEVCoYifoamd3k5AMaSUBOIwryKOtnIFoEVCoYifoamd3k5TMyscBE9k2ivfoaSkZnnTLWICunIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIFoEVColzcoaSCe0XwyfwOakywonPCt5IF3OifuazCe0m5dGZ5D6i5Qt4kZnnTLWICoiIRMnpF2OldoE9HtnnTLWICoxIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIdoEVColzcoaSCe0XwryKOtnICBEVCuY0CbO1F2E9k+B3SVBVPGDIVtFIWA5rwoniCt5IDbYLcBxINTEIWA5rwonjfoEVCuY0CbO1F2E9k+B3SVBVPGDIVtFIWA5rwonjfoEVColzcoaSCe0XwryKOtnIFucIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIFucIRMnpF2OldoE9HtnuAL9aAtntBUnIDoEVColLCtLICoivfoaSCtnHOAcAwrpNUA4IhyYyTraeatnIDoEVColLCtxeT1aKatiId2EVColLCtLIWaHICokvd2sKfB1IwrcUT00ICuSLfoipFZ0+foyJdoaXFMa9d3kLcbkgFM9vdBEICo9IwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1Zd29sCtnIFMEIT04ICo9IRMnZd29sUBOINBnZCt5IDBOIwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1Pd3OldoEICoiIwr9KwonZCt5IDo90cBxkcoE9CoiIRMnpcoEIa0iyALAICo9IRMnpF2OldoE9HtnnTLWICukIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIFMEVColzcoaSCe0XwryKOtnIDoEVCuY0CbO1F2E9k+B3SVBVPGDIVtFIWA5rwonPCt5IDbYLcBxINTEIUaHITL9Awr5aTrXIO1kNaaEIWlLIColLCtLICocifM9ZDbOlCtnNTJnIDo90cBxIRMnpcoE9CocifM9ZDbOlCt5IDBOIwrxyOlWIUL9kTJEPA0aHOAYAwonPCt5IDBOIRr1kTJiIFoEVCunZDBYlCtLIWaHICunZDBYlCtnoAL9Ywon7kuOPDbHsNmOiCMxlFuklgBivfoaSCtnIDoEITraoatnhT0lKwon7kuOPDbHsNmOiCMxlFuklgbkvd21IwonZCtnNTJnIDoEVColLCe1IFMEVCoivfoaSUBOIwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1XFMljca9Zd29sCtnIFoEIT04ICukIRMnpcoE9CunIRMnZd29sUBOIwyfwOakywonPCt5IF3OifuazCe0m5dGZ5D6i5Qt4kZnnTLWICoiIRMnpF2OldoE9HtnnTLWICukIRMnzfoy0fbYINUgls7RlqQuMPRImwryKOtnIFMEVColzcoaSCe0XwryKOtnIFoEVCoOifoaINAOnarAPTL9bhtLpwryKOtnIFoEVColzcoaSCe0XwryKOtnIFoEVCunZDBYlCtnkAZnKT1WITlaHTtnuAL9aAtntBUnIDBOIhUnIFukpC2aIwr9KwonPd3OldoEVColLCe1IFukpC2aIRMnpcoEIwJ4PDbYzcbWPkufPcbklGzn9hUE/wlfwOakywtO3DoaZcUEJKJEmkZLVwL9UOraUwrkcwoELd3kLcbktGBEIwJ4PkolzWaYewe8JWaYewjPIwLOyA0HJhU4PkuYpGMAINjEINZwITrlYUaWIkuY0Cbk0RtOzDbplwjPIkZFpKX0hFMa0fbkVwtO0DolzRT5LCJ0+cMa0C2igCBxShtOzFBXpKX0hgW0hFuaJdoljwoc1dMY0DB9VwoflfrYvfB50htO3DoaZcUE9wtFmhUn7eWPLC291dmWINUELfoipFZ0+cowsNmklF3aSfy9MDbkzftIJA0aHOAYAwrYNaA5AhtPpwrcUT00IhyYyTraeatnIDoEVhJxIC29IRMnVCB1lCtnnAZnIC292cbkKCB1lCtxIdoEVCo5idBaIwryTwonScbcldr5idBaIRonSCt5IFoljfuaZcBEIWaHICoxlfMaSAoljfuaZcBESCoyIRMnVCB1lCtnnAZnICbklCA5idBaIRonjfoEVCo5idBaIwryTwonjDbO5TMyscBESCun2Ct5IdMyscBEIWaHICunZd3cpdMYlTMyscBESCoxsCt5IdMyscBEIWaHICoxidMOsCbkqTMyscBESwonSdBEVCoYifoamd3k5CtnnAZnIdoyVco1iFMsjCbOlc29ZGBEIRonzCBEVCo5idBaIwryTwonzDo9XCbklCA5idBaIRrloTlaHTtiIC2EVCoYvdB1ldmOKfB1IReEpwryTwonjd21scB50TmasCtxeOAlHUA5uhrloTlaHTtiIF2EVCuYifolzcMyjfolvdMESHTEXhULIWaHICuYifolzcMyjfolvdMESW09aTlWPCunIRMnpcoEpwryTwonXDo90d051dBESCoYifoamd3k5CtnoAL9Ywon7kuOPDbHsNmOiCMxlFuklgBivfoaSCtnIDoEITraoatnhT0lKwon7kuOPDbHsNmOiCMxlFuklgBxlfMaSCtnIdoEIT04ICoiIRMnScbcldrlLCe1IdoEVColLCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9CbklCBEICoyIwr9KwonPCt5ICbklCAlLCe1ICBEVColLCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9C2l0GBEICoY0CtnNTJnICBEVCoYpfulkcoE9CoY0Ct5IDBOIwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1XFM92DB5jcBEICun2CtnNTJnIC3OIRMnXFM92DB5jcAlLCe1IFucIRMnpcoEITraoatnhT0lKwon7kuOPDbHsNmOiCMxlFuklgBxidMOsCbkqCtnIdo1Iwr9KwonPCt5IdoyVco1iFMskcoE9CoxsCt5IDBOIwrxyOlWIUL9kTJnIGZO0DolzRT50CBkScbnZcb1zDo9XCbklCBEICuYiCtnNTJnIDoEVCuYPd3niFMaiUBOINBnzCBEVColLCtnHOAcAwrpNUA4IhyYyTraeatnIDoEVColLCtnnAZnIDo90cBxkcoESW09aTlWPCoYIRMnpcoEpwryTwonjd21scB50TmasCtnoAL9Ywon7kuOPDbHsNmOiCMxlFuklgBYvdB1ldmOIwonjCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaXFMa9Do90cBxIwonPCtnNTJnIC2EVCoivfoaSUBOINBnPCt5IDBOIwyfwOakywonjCt5IF3OifuazCe0m5dGZ5D6i5Qt4kZnnTLWICoYIRMnpF2OldoE9HtnuAL9aAtntBUnIDoEVColLCtLICoYIwr9KwonPCt5IDBOINBnjCt5IDo90cBxkcoEITraoatnhT0lKwtiTOAxyW1WICoiIRMnpcoEIWaHICoivfoaSUBOIRtieT1aKatiIc29vcoEVColLCtLqW09aTlWPCo1lcol1dBEVColLCtLQHt41hU8P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fMaSCtnbUraUOUnIDbYLcBxINTEIWA5rwonzfoy0fbYINUgls7RlqQuMPRImwr9UOraUwrkcwonLDbYXdoy5T3kLcbkIwrOyA0HJhTSYtm0Ytmn1CMxpCZnMfB5jfolvdJnmcbOTDo9XWbklCUIpwuSYtmklfuaZdJELfoipFZ0+cowsNMclfoYPb2ySdtIJA0aHOAYAwonpcoESCo5idBaIwrcUT00ICuSLfoipFZ0+foyJdoaXFMa9F2ivFoyZcByIwyfwOakywonpF2OldoE9HtnnTLWICuY0CbO1F2E9k+B3SVBVPGDIVtFIT1krOawIWlLICoOpF3nSCblNFMOlFMEIWaYewJL7eWp9eWpXfBkSDBHIcmaVC3Opd24Ic2a0TMaiFLk5htOPd3OldrlLRtOVfB0pwuSYtmklfuaZdJELfoipFZ0+cowsNMclfoYPb2ySdtIJA0aHOAYAwonPd3OldoEVhJxIcMy2d3kpfoaIRMnJd29qTmasCtxIFukpC2aIRMnXFMljcBESCoYifoamd3k5CtnoAL9YwtiTOAxyW1WICoiIRJPSCoYvCt5IdMyscBEIWaHICoYvfMaZTMyscBESCoxIRMnVCB1lCtnnAZnIdoa2cBxKCB1lCtxIdoEVCunpC3O1FMaIwryTwonScbcldynpC3O1FMaIRonSCt5IcolzFoxiGA9ZcoaZCtnnAZnIdoa2cBxNFMOlFMESCoyIRMnVCB1lCtnnAZnICbklCA5idBaIRonSdBEVCo5idBaIwryTwonSCB5LdByZD05idBaIRonzCBEVCo5idBaIwryTwonzDo9XCbklCA5idBaIRrloTlaHTtiIC2EVCoYvdB1ldmOKfB1IReEpwryTwonjd21scB50TmasCtxeOAlHUA5uhrloTlaHTtiIF2EVCuYifolzcMyjfolvdMESHTEXhULIWaHICuYifolzcMyjfolvdMESW09aTlWPCunIRMnpcoEpwryTwonXDo90d051dBESCoYifoamd3k5CtnoAL9Ywon7kuOPDbHsNmOiCMxlFuklgBivfoaSCtnIDoEITraoatnhT0lKwon7kuOPDbHsNmOiCMxlFuklgBxlfMaSCtnIdoEIT04ICoiIRMnScbcldrlLCe1IdoEVColLCtnHOAcAwrpNUA4ICuSLfoipFZ0+foyJdoaX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'));

关于AES加密的算法我们就不说了,这里主要给各位演示了三个关于AES算法实现的加密例子,希望本文章能给你带来帮助。

话不多说,先放上代码,一共有两个文件:AES.php(aes算法类文件)和aesDemo.php(应用实例文件),这里只贴出aesDemo.php,其他的看附件吧!
aesDemo.php:

例子,

 代码如下 复制代码

<?php
require_once('./AES.php');
//$aes = new AES();
$aes = new AES(true);// 把加密后的字符串按十六进制进行存储
//$aes = new AES(true,true);// 带有调试信息且加密字符串按十六进制存储
$key = "this is a 32 byte key";// 密钥
$keys = $aes->makeKey($key);
$encode = "123456";// 被加密的字符串
$ct = $aes->encryptString($encode, $keys);
echo "encode = ".$ct."<br>";
$cpt = $aes->decryptString($ct, $keys);
echo "decode = ".$cpt;
?>

例子、AES加密类

 代码如下 复制代码

<?php
//php aes加密类
class AESMcrypt {

public $iv = null;
public $key = null;
public $bit = 128;
private $cipher;

public function __construct($bit, $key, $iv, $mode) {
if(empty($bit) || empty($key) || empty($iv) || empty($mode))
return NULL;

$this->bit = $bit;
$this->key = $key;
$this->iv = $iv;
$this->mode = $mode;

switch($this->bit) {
case 192:$this->cipher = MCRYPT_RIJNDAEL_192; break;
case 256:$this->cipher = MCRYPT_RIJNDAEL_256; break;
default: $this->cipher = MCRYPT_RIJNDAEL_128;
} // www.111cn.net

switch($this->mode) {
case 'ecb':$this->mode = MCRYPT_MODE_ECB; break;
case 'cfb':$this->mode = MCRYPT_MODE_CFB; break;
case 'ofb':$this->mode = MCRYPT_MODE_OFB; break;
case 'nofb':$this->mode = MCRYPT_MODE_NOFB; break;
default: $this->mode = MCRYPT_MODE_CBC;
}
}

public function encrypt($data) {
$data = base64_encode(mcrypt_encrypt( $this->cipher, $this->key, $data, $this->mode, $this->iv));
return $data;
}

public function decrypt($data) {
$data = mcrypt_decrypt( $this->cipher, $this->key, base64_decode($data), $this->mode, $this->iv);
$data = rtrim(rtrim($data), "..");
return $data;
}

}
//使用方法
$aes = new AESMcrypt($bit = 128, $key = 'abcdef1234567890', $iv = '0987654321fedcba', $mode = 'cbc');
$c = $aes->encrypt('haowei.me');
var_dump($aes->decrypt($c));

例子、附一个可加密可解密类

 代码如下 复制代码

<?PHP
/**
 * AES加密、解密类
 * @author hushangming
 *
 * 用法:
 * <pre>
 * // 实例化类
 * // 参数$_bit:格式,支持256、192、128,默认为128字节的
 * // 参数$_type:加密/解密方式,支持cfb、cbc、nofb、ofb、stream、ecb,默认为ecb
 * // 参数$_key:密钥,默认为abcdefghijuklmno
 * $tcaes = new TCAES();
 * $string = 'laohu';
 * // 加密
 * $encodeString = $tcaes->encode($string);
 * // 解密
 * $decodeString = $tcaes->decode($encodeString);
 * </pre>
 */
class TCAES{
 private $_bit = MCRYPT_RIJNDAEL_256;
 private $_type = MCRYPT_MODE_CBC;
 //private $_key = 'abcdefghijuklmno0123456789012345';
 private $_key = 'abcdefghijuklmno'; // 密钥
 private $_use_base64 = true;
 private $_iv_size = null;
 private $_iv = null;
 
 /**
  * @param string $_key 密钥
  * @param int $_bit 默认使用128字节
  * @param string $_type 加密解密方式
  * @param boolean $_use_base64 默认使用base64二次加密
  */
 public function __construct($_key = '', $_bit = 128, $_type = 'ecb', $_use_base64 = true){
  // 加密字节
  if(192 === $_bit){
   $this->_bit = MCRYPT_RIJNDAEL_192;
  }elseif(128 === $_bit){
   $this->_bit = MCRYPT_RIJNDAEL_128;
  }else{
   $this->_bit = MCRYPT_RIJNDAEL_256;
  }
  // 加密方法
  if('cfb' === $_type){
   $this->_type = MCRYPT_MODE_CFB;
  }elseif('cbc' === $_type){
   $this->_type = MCRYPT_MODE_CBC;
  }elseif('nofb' === $_type){
   $this->_type = MCRYPT_MODE_NOFB;
  }elseif('ofb' === $_type){
   $this->_type = MCRYPT_MODE_OFB;
  }elseif('stream' === $_type){
   $this->_type = MCRYPT_MODE_STREAM;
  }else{
   $this->_type = MCRYPT_MODE_ECB;
  }
  // 密钥
  if(!empty($_key)){
   $this->_key = $_key;
  }
  // 是否使用base64
  $this->_use_base64 = $_use_base64;
  
  $this->_iv_size = mcrypt_get_iv_size($this->_bit, $this->_type);
  $this->_iv = mcrypt_create_iv($this->_iv_size, MCRYPT_RAND);
 }
 
 /**
  * 加密
  * @param string $string 待加密字符串
  * @return string
  */
 public function encode($string){
  if(MCRYPT_MODE_ECB === $this->_type){
   $encodeString = mcrypt_encrypt($this->_bit, $this->_key, $string, $this->_type); 
  }else{
   $encodeString = mcrypt_encrypt($this->_bit, $this->_key, $string, $this->_type, $this->_iv);
  }
  if($this->_use_base64)
   $encodeString = base64_encode($encodeString);
  return $encodeString;
 }
 
 /**
  * 解密
  * @param string $string 待解密字符串
  * @return string
  */
 public function decode($string){
  if($this->_use_base64)
   $string = base64_decode($string);
  
  $string = $this->toHexString($string);
  if(MCRYPT_MODE_ECB === $this->_type){
   $decodeString = mcrypt_decrypt($this->_bit, $this->_key, $string, $this->_type);
  }else{
   $decodeString = mcrypt_decrypt($this->_bit, $this->_key, $string, $this->_type, $this->_iv);
  }
  return $decodeString;
 }
 
 /**
  * 将$string转换成十六进制
  * @param string $string
  * @return stream
  */
 private function toHexString ($string){
  $buf = "";
  for ($i = 0; $i < strlen($string); $i++){
   $val = dechex(ord($string{$i}));
   if(strlen($val)< 2)
    $val = "0".$val;
   $buf .= $val;
  }
  return $buf;
 }
 
 /**
  * 将十六进制流$string转换成字符串
  * @param stream $string
  * @return string
  */
 private function fromHexString($string){
  $buf = "";
  for($i = 0; $i < strlen($string); $i += 2){
   $val = chr(hexdec(substr($string, $i, 2)));
   $buf .= $val;
  }
  return $buf;
 }
}

 

[!--infotagslink--]

相关文章

  • PHP7快速编译安装的步骤

    编译安装非常的简单了我们现在的php版本已经到了php7了,下文小编来为各位介绍一篇关于PHP7快速编译安装的步骤,希望文章能够帮助到各位。 一、安装必要一些依赖 yum...2016-11-25
  • 源码分析系列之json_encode()如何转化一个对象

    这篇文章主要介绍了源码分析系列之json_encode()如何转化一个对象,对json_encode()感兴趣的同学,可以参考下...2021-04-22
  • Rstudio中安装package出现的问题及解决

    这篇文章主要介绍了Rstudio中安装package出现的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
  • php中去除文字内容中所有html代码

    PHP去除html、css样式、js格式的方法很多,但发现,它们基本都有一个弊端:空格往往清除不了 经过不断的研究,最终找到了一个理想的去除html包括空格css样式、js 的PHP函数。...2013-08-02
  • PHP编译安装后PHP-FPM使用笔记

    PHP-FPM我们相信各位用高版本的php经常使用到了,下面整理了一些关于PHP-FPM的笔记,有兴趣的可进来看看。 今天赶上了123System OPenVZ VPS全场半价的机会,购入了一...2016-11-25
  • Linux安装Pytorch1.8GPU(CUDA11.1)的实现

    这篇文章主要介绍了Linux安装Pytorch1.8GPU(CUDA11.1)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-25
  • index.php怎么打开?如何打开index.php?

    index.php怎么打开?初学者可能不知道如何打开index.php,不会的同学可以参考一下本篇教程 打开编辑:右键->打开方式->经文本方式打开打开运行:首先你要有个支持运行PH...2017-07-06
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • vscode安装git及项目开发过程

    这篇文章主要介绍了vscode安装git及项目开发过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-19
  • Visual Studio 2015下载和安装图文教程

    这篇文章主要为大家详细介绍了Visual Studio 2015下载和安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
  • Node调试工具JSHint的安装及配置教程

    现在我们介绍一种在Node下检查简单错误的JS代码验证工具JSHint。  JSHint的具体介绍参考http://www.jshint.com/about/,说直白点儿,JSHint就是一个检查JS代码规范与否的工具,它可以用来检查任何(包括server端和client端...2014-05-31
  • Centos中彻底删除Mysql(rpm、yum安装的情况)

    我用的centos6,mysql让我整出了各种问题,我想重装一个全新的mysql,yum remove mysql-server mysql之后再install并不能得到一个干净的mysql,原来的/etc/my.cnf依然没变,datadir里面的数据已没有任何变化,手动删除/etc/my.cn...2015-03-15
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • 在PyCharm中安装PaddlePaddle的方法

    这篇文章主要介绍了在PyCharm中安装PaddlePaddle的方法,本文给大家介绍的非常想详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-05
  • linux服务器快速卸载安装node环境(简单上手)

    这篇文章主要介绍了linux服务器快速卸载安装node环境(简单上手),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-22
  • Ubuntu20.04安装cuda10.1的步骤(图文教程)

    这篇文章主要介绍了Ubuntu20.04安装cuda10.1的步骤(图文教程),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-07-30
  • uni-app从安装到卸载的入门教程

    这篇文章主要介绍了uni-app从安装到卸载的入门教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-05-15
  • PHP编程 SSO详细介绍及简单实例

    这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下...2017-01-25
  • Postman安装与使用详细教程 附postman离线安装包

    这篇文章主要介绍了Postman安装与使用详细教程 附postman离线安装包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-05
  • PHP实现创建以太坊钱包转账等功能

    这篇文章主要介绍了PHP实现创建以太坊钱包转账等功能,对以太坊感兴趣的同学,可以参考下...2021-04-20