WebQQ网页hash加密算法PHP版

 更新时间:2016年11月25日 15:44  点击:1705
我们在QQ网上找到的一个hash加密算法是js版本的,下面我们根据js版的hash加密算法改成php版的加密算法,希望方法对各位有帮。

由于最近QQ垃圾信息群发严重,官方选择将WebQQ部分功能实现细节方面做了点手脚。其中获取好友的POST值多了一个hash参数。

这个hash是在js里加密完成的。

以下是js源码

 代码如下 复制代码

<script type="text/javascript">
function getHash(b, i) {
    for (var a = i + "password error",
    s = "",
    j = [];;) if (s.length <= a.length) {                                                                                                       
        if (s += b, s.length == a.length) break
    } else {
        s = s.slice(0, a.length);
        break
    }  
    for (var d = 0; d < s.length; d++) j[d] = s.charCodeAt(d) ^ a.charCodeAt(d);
    a = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];
    s = "";
    for (d = 0; d < j.length; d++) s += a[j[d] >> 4 & 15],
    s += a[j[d] & 15];
    return s;
}
</script>

转成PHP版本处理,源码如下

 代码如下 复制代码
<?php
/**
 * 获取好友时的POST参数Hash算法
 *
 * public
 * @param string $qq qq号
 * @param string $ptwebqq cookies中的ptwebqq
 * @return string
 */
function get_hash($qq, $ptwebqq)
{
 for ($a = $ptwebqq . "password error", $s = "", $j = array();;)
 {
  if (strlen($s) <= strlen($a))
  {
   $s .= $qq;
   if ($s == strlen($a)) break;
  }
  else
  {
   $s = substr($s, 0, strlen($a));
   break;
  }
 }
 
 for ($d = 0; $d < strlen($s); $d++)
 {
  $j[$d] = uniord(substr($s,$d)) ^ uniord(substr($a,$d));
 }
 
 $a = array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
 $s = "";
 for ($d = 0; $d < count($j); $d++)
 {
  $s .= $a[$j[$d] >> 4 & 15];
  $s .= $a[$j[$d] & 15];
 }
 
 return $s;
}
 
/**
 * 模拟 JavaScript charCodeAt函数
 *
 * protected
 * @param string $str
 * @return int
 */
function uniord($str)
{
 list(, $ord) = unpack('N', mb_convert_encoding($str, 'UCS-4BE', 'UTF-8'));
 
 return

$ord;
}
 
/* End of file commons.php */

本文章来给各位同学介绍关于在PHP5.3的VC9、VC6、Thread Safe、Non Thread Safe的区别哦,这个大部份朋友都不知道,我来普及一下。

PHP5.3的VC9、VC6、Thread Safe、Non Thread Safe的区别

PHP一共给了四个版本,VC9 x86 Non Thread Safe、VC9 x86 Thread Safe、VC6 x86 Non Thread Safe、VC6 x86 Thread Safe,这让我这个菜鸟头疼啊,还好 PHP 官网提供下载的地方左边有个英文 choose 我看懂了,我估摸着就是如何来选择版本的意思吧,于是开始查字典及上网查找,终于看明白了具体意思,拿来做个备忘先。

一、如何选择 PHP5.3 的 VC9 版本和 VC6 版本

VC6 版本是使用 Visual Studio 6 编译器编译的,如果你的 PHP 是用 Apache 来架设的,那你就选择 VC6 版本。

VC9 版本是使用 Visual Studio 2008 编译器编译的,如果你的 PHP 是用 IIS 来架设的,那你就选择 VC9 版本。

二、如何选择 PHP5.3 的 Thread Safe 和 Non Thread Safe 版本

先从字面意思上理解,Thread Safe 是线程安全,执行时会进行线程(Thread)安全检查,以防止有新要求就启动新线程的 CGI 执行方式而耗尽系统资源。Non Thread Safe 是非线程安全,在执行时不进行线程(Thread)安全检查。

再来看 PHP 的两种执行方式:ISAPI 和 FastCGI。

ISAPI 执行方式是以 DLL 动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以 ISAPI 来执行 PHP,建议选择 Thread Safe 版本;

FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以 FastCGI(无论搭配 IIS 6 或 IIS 7)执行 PHP ,都建议下载、执行 non-thread safe 的 PHP (PHP 的二进位档有两种包装方式:msi 、zip ,请下载 zip 套件)。

而线程安全检查正是为ISAPI方式的PHP准备的,因为有许多php模块都不是线程安全的,所以需要使用Thread Safe的PHP。

所以,对于PHP5.2选择Thread Safe版本安装,而对于PHP5.3则下载None-Thread Safe,执行PHP比较有效率。

本文章给各位同学介绍一个php批量设置IIS目录实例代码,希望此教程 对大家会有所帮助呀。
 代码如下 复制代码
<?php
//获取文件目录列表,该方法返回数组
function getDir($dir='') {
    $dir=empty($dir) ? getcwd() : $dir;
    $dirArray[]=NULL;
    if (false != ($handle = opendir ( $dir ))) {
        $i=0;
        while ( false !== ($file = readdir ( $handle )) ) {
            //去掉"“.”、“..”以及带“.xxx”后缀的文件
            if ($file != "." && $file != ".."&&!strpos($file,".")) {
                $dirArray[$i]=$file;
                $i++;
            }
        }
        //关闭句柄
        closedir ( $handle );
    }
    return $dirArray;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>IIS目录批量设置</title>
<style>
body {
    font:12px/22px "Microsoft YaHei", SimSun;
}
input, select, texteare, button {
    font-family:"Microsoft YaHei", SimSun;
}
</style>
</head>
<body>
<?php
if(empty($_POST)){
?>
<form action="" method="post"  onsubmit="return check();">
<h2>当前目录:<?php echo getcwd();?></h2>
<div>
  <fieldset>
    <legend>网站目录</legend>
    <div>
      <ul>
<?php
      $dirArr=getDir();
      if(is_array($dirArr)){
          foreach($dirArr as $dir){
?>
        <li>
          <label>
            <input name="directory[]" type="checkbox" value="<?php echo $dir;?>" />
           <?php echo $dir;?></label>
        </li>
<?php     
          }
      }
?>
      </ul>
        <div>
        <input id="CheckALL" type="button" onclick="checkAll();" value="全选" />
        <input id="NoCheckAll" type="button" onclick="noCheckAll();" value="全不选" />
        <input id="inverse" type="button" onclick="inverseCheck()" value="反选" />
         </div>
    </div>
  </fieldset>
</div>
<div>
  <fieldset>
    <legend>执行权限</legend>
    <div>
      <select name="Execute" onchange="Warning(this.value)">
        <option value="0" selected="selected">无</option>
        <option value="1">纯脚本</option>
        <option value="2">脚本和可执行</option>
      </select>
    </div>
  </fieldset>
</div>
<div>
  <fieldset>
    <legend>站点信息</legend>
    <div>
      站点ID: <input name="SiteId" id="SiteId" type="text" value="" />
    </div>
  </fieldset>
</div>
<div style="margin-top:20px; padding-left:20px;">
  <input type="submit" value="提交" />
</div>
</form>
<script type="text/javascript">
    var all = document.getElementById("CheckALL"); //全选
    var single = document.getElementsByName("directory[]"); //选项
    var noAll = document.getElementById("NoCheckAll"); //不全选
    var inverse = document.getElementById("inverse"); //反选
    var SiteId = document.getElementById("SiteId"); //SiteId
    function checkTrue() {
        for (var i = 0; i < single.length; i++) {
            single[i].checked = true;
        }
    }
    function checkFalse() {
        for (var i = 0; i < single.length; i++) {
            single[i].checked = false;
        }
    }
    //全选
    function checkAll() {
        if (all.disabled == false) {
            noAll.disabled = false;
            checkTrue();
        }
        else {
            noAll.disabled = true;
            checkFalse();
        }
        all.disabled = true;
    }
    //全不选
    function noCheckAll() {
        if (noAll.disabled == false) {
            all.disabled = false;
            checkFalse();
        }
        else {
            all.checked = true;
            checkTrue();
        }
        noAll.disabled = true;
    }
    //反选
    function inverseCheck() {
        noAll.disabled = false;
        all.disabled = false;
        for (var i = 0; i < single.length; i++) {
            single[i].checked = !single[i].checked;
        }
    }
    function Warning(value) {
        if(value==2){
        alert('目录拥有 "脚本和可执行" 权限会很危险请慎重选择!')
        }
    }
    function check(){
        var checkd_sum;
        checkd_sum=0;
        for (var i = 0; i < single.length; i++) {
            if(single[i].checked ==true){
            checkd_sum++;
            }
        }
        if(checkd_sum==0){
            alert('请先选择目录!');
            return false;
        }
        if(SiteId.value==""){
            alert('请输入站点ID!');
            return false;
        }
        return true;
    }
</script>
<?php
}else{
    $directorys=@$_POST['directory'];
    $Execute=@$_POST['Execute'];
    $SiteId=@$_POST['SiteId'];
    $SiteId=trim($SiteId);
    if($Execute=0){
        $ExecutePermission="AccessRead";
    }
    if($Execute=1){
        $ExecutePermission="AccessRead | AccessScript";
    }
    if($Execute=1){
        $ExecutePermission="AccessExecute | AccessRead | AccessScript";
    }
?>
<div>
<pre>
<?php
if(is_array($directorys)){
    foreach($directorys as $directory ){
        echo <<<EOF
&lt;IIsWebDirectory Location ="/LM/W3SVC/{$SiteId}/root/{$directory}"
    AccessFlags="{$ExecutePermission}"
&gt;
&lt;/IIsWebDirectory&gt;rn
EOF;
    }
}
?>
</pre>
</div>
<?php
}
?>
</body>
</html>
我们经常会碰到一些问题像目录权限无法访问了,这时可能有几百或上千个文件或文件目录,下面我写了一个利用php来批量更改目录权限的实例。
 代码如下 复制代码

<?php
//获取文件目录列表,该方法返回数组
function getDir($dir=”) {
    $dir=empty($dir) ? getcwd() : $dir;
    $dirArray[]=NULL;
    if (false != ($handle = opendir ( $dir ))) {
        $i=0;
        while ( false !== ($file = readdir ( $handle )) ) {
            //去掉”“.”、“..”以及带“.xxx”后缀的文件
            if ($file != “.” && $file != “..”&&!strpos($file,”.”)) {
                $dirArray[$i]=$file;
                $i++;
            }
        }
        //关闭句柄
        closedir ( $handle );
    }
    return $dirArray;
}
?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<title>目录权限批量设置</title>
<style>
body {
    font:12px/22px “Microsoft YaHei”, SimSun;
}
input, select, texteare, button {
    font-family:”Microsoft YaHei”, SimSun;
}
</style>
</head>
<body>
<?php
if(empty($_POST)){
?>
<form action=”" method=”post”  onsubmit=”return check();”>
<h2>当前目录:<?php echo getcwd();?></h2>
<div>
  <fieldset>
    <legend>网站目录</legend>
    <div>
      <ul>
<?php
      $dirArr=getDir();
      if(is_array($dirArr)){
          foreach($dirArr as $dir){
?>
        <li>
          <label>
            <input name=”directory[]” type=”checkbox” value=”<?php echo $dir;?>” />
           <?php echo $dir;?></label>
        </li>
<?php     
          }
      }
?>
      </ul>
        <div>
        <input id=”CheckALL” type=”button” onclick=”checkAll();” value=”全选” />
        <input id=”NoCheckAll” type=”button” onclick=”noCheckAll();” value=”全不选” />
        <input id=”inverse” type=”button” onclick=”inverseCheck()” value=”反选” />
         </div>
    </div>
  </fieldset>
</div>
<div>
  <fieldset>
    <legend>目录权限</legend>
    <div>
      <select name=”Perm”>
        <option value=”N” selected=”selected”>N-无</option>
        <option value=”R”>R-读取</option>
        <option value=”W”>W-写入</option>
        <option value=”C”>C-更改(写入)</option>
        <option value=”F”>F-完全控制</option>
      </select>
<!–
/G user:perm  赋予指定用户访问权限。
              Perm 可以是: R  读取
                          W  写入
                          C  更改(写入)
                          F  完全控制

/P user:perm  替换指定用户的访问权限。
              Perm 可以是: N  无
                          R  读取
                          W  写入
                          C  更改(写入)
                          F  完全控制
–>
    </div>
  </fieldset>
</div>
<div>
  <fieldset>
    <legend>来宾帐户</legend>
    <div>
      Internet 来宾帐户: <input name=”User” id=”User” type=”text” value=”" />
    </div>
  </fieldset>
</div>
<div style=”margin-top:20px; padding-left:20px;”>
  <input type=”submit” value=”提交” />
</div>
</form>
<script type=”text/javascript”>
    var all = document.getElementById(“CheckALL”); //全选
    var single = document.getElementsByName(“directory[]“); //选项
    var noAll = document.getElementById(“NoCheckAll”); //不全选
    var inverse = document.getElementById(“inverse”); //反选
    var User = document.getElementById(“User”); //SiteId
    function checkTrue() {
        for (var i = 0; i < single.length; i++) {
            single[i].checked = true;
        }
    }
    function checkFalse() {
        for (var i = 0; i < single.length; i++) {
            single[i].checked = false;
        }
    }
    //全选
    function checkAll() {
        if (all.disabled == false) {
            noAll.disabled = false;
            checkTrue();
        }
        else {
            noAll.disabled = true;
            checkFalse();
        }
        all.disabled = true;
    }
    //全不选
    function noCheckAll() {
        if (noAll.disabled == false) {
            all.disabled = false;
            checkFalse();
        }
        else {
            all.checked = true;
            checkTrue();
        }
        noAll.disabled = true;
    }
    //反选
    function inverseCheck() {
        noAll.disabled = false;
        all.disabled = false;
        for (var i = 0; i < single.length; i++) {
            single[i].checked = !single[i].checked;
        }
    }
    function check(){
        var checkd_sum;
        checkd_sum=0;
        for (var i = 0; i < single.length; i++) {
            if(single[i].checked ==true){
            checkd_sum++;
            }
        }
        if(checkd_sum==0){
            alert(‘请先选择目录!’);
            return false;
        }
        if(User.value==”"){
            alert(‘请输入Internet 来宾帐户!’);
            return false;
        }
        return true;
    }
</script>
<?php
}else{
    $directorys=@$_POST['directory'];
    $Perm=trim(@$_POST['Perm']);
    $User=trim(@$_POST['User']);
?>
<div>
<pre>
@echo off
<?php
$BASE_DIR=getcwd();
if(is_array($directorys)){
    foreach($directorys as $directory ){
        echo <<<EOF
echo Y|cacls {$BASE_DIR}\{$directory} /T /E /C /G {$User}:{$Perm} <br/>
EOF;
    }
}
?>
pause
</pre>
</div>
<?php
}
?>
</body>
</html>

301重定向有很多办法可以实现,如iis可以,apache,php,asp等等都可以快速的设置页面301重定向跳转了,下面我来给各位同学介绍介绍

本文将通过IIS、APACHE、ASP、PHP几种服务器端或页面程序端分别讲解如何设置301重定向,先还是简单介绍下重定向。
301重定向:指的是一种非常重要的“自动转向”技术--其实谈不上技术,即网址重定向--用户访问一个地址或目录,可以指定跳转到另一个地址。
301重定向,这是所有重定向方法中唯一符合seo/seo.html" target="_blank">搜索引擎规则的重定向,这也是SEO中的一个基础名词,比方:一个站用www.111cn.net、111cn.net绑定,就会存在2个权重,如果将111cn.net重定向到www.111cn.net,就会权重集中,相应增加权重值。

1、IIS服务器上设置301重定向
准备工作:你要有服务器设置权限,可以随意开通新的虚拟空间!
第一,新建一个虚拟空间,将你需要进行重定向的域名与之解析绑定;
第二,我的电脑-->打开“控制面板”-->“管理工具”-->打开“Internet 信息服务”,左侧会有树形菜单,找到你的网站--右键“属性”--选择“主目录”选项卡,再选择“重定向到URL”,然后在地址框栏输入需要定向的目标域名,最后将选项卡中的“资源的永久重定向”选择上,点击“确定”完成操作。属性界面设置,如下图所示:



2、Unix/linux主机上apache设置301重定向

新建.htaccess文件,输入下列内容(需要开启mod_rewrite):  
1)将不带WWW的域名转向到带WWW的域名下
 代码如下 复制代码
Options +FollowSymLinks
RewriteEngine on 
RewriteCond %{HTTP_HOST} ^111cn.net [NC]
RewriteRule ^(.*)$www.111cn.net/301/[L,R=301]  

2)重定向到新域名
 代码如下 复制代码
Options +FollowSymLinks
RewriteEngine on 
RewriteRule ^(.*)$www.111cn.net/301/ [L,R=301]

3)使用正则进行301转向,实现伪静态
 代码如下 复制代码
Options +FollowSymLinks
RewriteEngine on 
RewriteRule ^article-(.+).html$ article.php?id=$1 
将article.php?id=123这样的地址转向到article-123.html

3、ASP程序页面中设置301重定向代码
在公共头部文件或全局调用文件里,加上如下代码:
 代码如下 复制代码

<%@ Language=VBScript %>

<%
if request.ServerVariables("SERVER_NAME")!="www.111cn.net" then
Response.Status="301 Moved Permanently"
Response.AddHeader "Location", "http://www.111cn.net"
Response.End 
end if
%>

原理:判断请求的server_name,是否与主目标网址一样,不一样则重定向

4、PHP程序页面中设置301重定向
代码如下:(比较完美的写法)

 代码如下 复制代码
$host= 'www.111cn.net'; //你目标定向的网址 
if ($_SERVER['HTTP_HOST'] != $host)//若不是则进行重定向,后面页面参数不变
{ header("HTTP/1.1 301 Moved Permanently"); header("Location: http://{$host}{$_SERVER[REQUEST_URI]}");
}
unset($host);
原理:首先定义目标定向网址,然后判断当前请求访问的host是否一致,若为否,则进行重定向
[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • C#几种排序算法

    作者:Sabine 【导读】本文介绍了C#的四种排序算法:冒泡排序、选择排序、插入排序和希尔排序  冒泡排序 using System; namespace BubbleSorter { public class Bubb...2020-06-25
  • 经典实例讲解C#递归算法

    这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
  • vue接口请求加密实例

    这篇文章主要介绍了vue接口请求加密实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-12
  • AES加密解密的例子小结

    关于AES加密的算法我们就不说了,这里主要给各位演示了三个关于AES算法实现的加密例子,希望本文章能给你带来帮助。 话不多说,先放上代码,一共有两个文件:AES.php(aes算...2016-11-25
  • node.JS md5加密中文与php结果不一致怎么办

    这次文章要给大家介绍的是node.JS md5加密中文与php结果不一致怎么办,不知道具体解决办法的下面跟小编一起来看看。 因项目需要,需要Node.js与PHP做接口调用,发现nod...2017-07-06
  • NODE.JS加密模块CRYPTO常用方法介绍

    使用require('crypto')调用加密模块。加密模块需要底层系统提供OpenSSL的支持。它提供了一种安全凭证的封装方式,可以用于HTTPS安全网络以及普通HTTP连接。该模块还提供了一套针对OpenSSL的hash(哈希),hmac(密钥哈希),cipher...2014-06-07
  • C#连接加密的Sqlite数据库的方法

    对数据加密分两种,一种是对数据库本身进行加密,另一种是对数据表中的数据进行加密,下面通过本文给大家介绍C#连接加密的Sqlite数据库的方法,感兴趣的朋友一起看看吧...2020-06-25
  • C#中实现任意List的全组合算法代码

    这篇文章主要是介绍了.net C# 实现任意List的全组合算法实现代码,需要的朋友可以参考下...2020-06-25
  • 图文详解Heap Sort堆排序算法及JavaScript的代码实现

    这篇文章以图文详解Heap Sort堆排序算法及JavaScript的代码实现,堆排序算法基于类二叉树的堆数据结构,需要的朋友可以参考下...2016-05-05
  • C#实现对文件进行加密解密的方法

    这篇文章主要介绍了C#实现对文件进行加密解密的方法,涉及C#加密与解密的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 同时兼容JS和C#的RSA加密解密算法详解(对web提交的数据加密传输)

    这篇文章主要给大家介绍了关于同时兼容JS和C#的RSA加密解密算法,通过该算法可以对web提交的数据进行加密传输,文中通过图文及示例代码介绍的非常详细,需要的朋友们可以参考借鉴,下面来一起看看吧。...2020-06-25
  • php使用异或实现的加解密的方法

    若a=b ^ c;则b=a ^ c (^是异或的意思),php在处理异或的字符时先把字符转化为二进制的ascii值,对这些值进行异或,获取结果后在将ascii值转化为字符...2013-09-26
  • JS实现的随机排序功能算法示例

    这篇文章主要介绍了JS实现的随机排序功能算法,结合具体实例形式分析了javascript常用的排序算法实现技巧,需要的朋友可以参考下...2017-06-15
  • go语言使用RC4加密的方法

    这篇文章主要介绍了go语言使用RC4加密的方法,实例分析了RC4加密的技巧与实现方法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-05-07
  • C#常用数据结构和算法总结

    这篇文章主要介绍了C#常用数据结构和算法,这里我们总结了一些知识点,可以帮助大家理解这些概念。...2020-06-25
  • C#为配置文件加密的实现方法

    这篇文章主要介绍了C#为配置文件加密的实现方法,可实现对配置文件中的敏感信息进行加密,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • C++实现的O(n)复杂度内查找第K大数算法示例

    这篇文章主要介绍了C++实现的O(n)复杂度内查找第K大数算法,结合实例形式分析了算法的原理以及具体实现方法,需要的朋友可以参考下...2020-04-25
  • c# 实现位图算法(BitMap)

    这篇文章主要介绍了c# 如何实现位图算法(BitMap),文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-11-03
  • 一篇文章带你搞懂Vue虚拟Dom与diff算法

    这篇文章主要给大家介绍了关于Vue虚拟Dom与diff算法的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-08-26