ISAPI Rewrite实现IIS图片防盗链

为了实现图片防盗链,根据网络上搜集的资料加上自己的实践,终于实现了iis下的图片防盗链功能。

  实施步骤:

  1.下载比较出名的www.helicontech.com提供的ISAPI Rewrite软件的免费版本(免费版本虽然有一些功能上的限制,但是做防盗链足够了):

  upload/200907301349042465.gif|/2_files/logo_tg\.gif)).*\.(?:gif|jpg|jpeg|png)$ /block.gif [I,O,N]

  解释说明:

  a.上面规则第三行中的www.abc.net为你网站的域名,请根据实际情况作出相应的修改,里面的baidu.com 和google.com是为了不阻止搜索引擎蜘蛛抓取图片。

  b.第四行中的/logo.gif和2_fies/logo_tg.gif为你的logo图片的地址,目的是允许别人友情链接使用你的logo,如果不需要可以去掉"(?!(/logo\.gif|/2_files/logo_tg\.gif))"。后面的gif jpg等等可以自己根据实际情况修改。

  另修改规则无需重启iis,只需要修改httpd.ini配置文件即可。

PHP 修改密码模块

MySQL数据库的名称是test,表的名称是t_user

创建t_user的sql文件: create_table.sql

//*******************create_table.sql***************************

create database if not exists test;
use test;
drop table if exists t_user;
create table if not exists t_user
(
f_username char(50) not null primary key,
f_password char(50) not null,
f_name char(50) not null,
f_email char(50) not null,
f_logintimes int not null default 0,
f_lasttime datetime,
f_loginip char(20)
);
//*******************EndCode***********************************

//*******************modify.php*********************************

<?php
//判断用户是否已经登陆
session_start();
if(empty($_SESSION[‘username’]))
{
echo "您还没有登录,请您先登录页面!";
exit;
}
?>
<?php

require_once(‘check.php’); //引入公共文件,实现检查用户输入,防止SQL注入漏洞的代码
require_once(‘db_connect.php’); //引入公共文件,数据库的连接

//服务器端的数据有效性验证
//trim()函数可以截取头尾的空白字符
$username = trim($_POST[‘username’]);
$old_pwd = $_POST[‘old_pwd’];
$new_pwd = $_POST[‘new_pwd’];

//将明文密码使用md5算法加密
$old_pwd = md5($old_pwd);
$new_pwd = md5($new_pwd);

if(!empty($username))
{
//建立数据库的连接
$db = db_connect();
//查询数据库,看填写的用户名是否已经存在
$sql = "select * from t_user
         where f_username=’$username’ and f_password=’$old_pwd’";
$res = $db->query($sql);
//$res->num_rows 判断上面的执行结果是否含有记录,有记录说明用户名已经存在
if($res->num_rows <= 0)
{
   echo "<center><font color=’red’ size=’4′>数据库里不存在该用户!</font></center><br/>";
}
else
{
   //将用户信息插入数据库的t_user表
   $sql = "update t_user set f_password = ‘$new_pwd’
          where f_username=’$username’ and f_password=’$old_pwd’";
   $res = $db->query($sql);
   if(!$res)
   {
    $db->close(); //关闭数据库
    echo ‘数据库记录修改失败!’;
    exit;
   }
   //将输出重定向到register_result.php文件
   header("Location: modify_result.php?uid=$username");
}
//关闭数据库连接
$db->close();
}
?>
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
   <title>修改密码</title>
  
   <style type="text/css">
   <!–
   .alert {color:red}
   .textinput {width:160px}
   .btn {width:80px}
   table {border:3px double;background-color:#eeeeee;}
   –>
   </style>
  
   <script language=’javascript’>
   <!–
   //验证表单数据有效性的函数
   //当函数返回true时,说明验证成功,表单数据正常提交
   //当函数返回false时,说明验证失败,表单数据被终止提交
   function doCheck()
   {
    var username = document.frmRegister.username.value;
    var old_pwd = document.frmRegister.old_pwd.value;
    var new_pwd = document.frmRegister.new_pwd.value;
    var repeat_pwd = document.frmRegister.repeat_pwd.value;
   
    if(username == ”)
    {
     alert(‘请输入用户名!’);
     return false;
    }
    if(old_pwd == ”)
    {
     alert(‘请输入旧密码!’);
     return false;
    }
    if(new_pwd == ”)
    {
     alert(‘请输入新密码!’);
     return false;
    }
    if(repeat_pwd == ”)
    {
     alert(‘请输入重复密码!’);
     return false;
    }
    if(new_pwd != repeat_pwd)
    {
     alert(‘重复密码与新密码不一致!’);
     return false;
    }
    if(new_pwd.length < 6 || new_pwd.length > 30)
    {
     alert(‘密码必须在6到30个字符之间!’);
     return false;
    }
    return true;
   }
   –>
   </script>
</head>
<body>
<h1 align="center"><font color="black" size="5"> 修改密码 </font></h1>
<form name="frmRegister" method="post" action="modify.php" onsubmit="return doCheck();">
   <table width="330" border="0" align="center" cellpadding="5" bgcolor="#eeeeee">
    <tr>
     <td width="40%">用户名:</td>
     <td><input name="username" type="text" id="username"></td>
    </tr>
    <tr>
     <td>旧密码:</td>
     <td><input name="old_pwd" type="password" id="old_pwd"></td>
    </tr>
    <tr>
     <td>新密码:</td>
     <td><input name="new_pwd" type="password" id="new_pwd"></td>
    </tr>
    <tr>
     <td>重复密码:</td>
     <td><input name="repeat_pwd" type="password" id="repeat_pwd"></td>
    </tr>
    <tr>
     <td colspan="2" align="center">
      <input type="submit" name="submit" value="修改" />
      <input type="reset" name="reset" value="重置" />
     </td>
    </tr>
   </table>
</form>
</body>
</html>
//*******************EndCode***********************************

//*******************check.php**********************************

<?php
//防范SQL注入漏洞
function checkIlldalWord()
{
//定义不允许提交的SQL命令及关键字
$words = arr
ay();
$words[] = " add ";
$words[] = " count ";
$words[] = " create ";
$words[] = " delete ";
$words[] = " drop ";
$words[] = " from ";
$words[] = " grant ";
$words[] = " insert ";
$words[] = " select ";
$words[] = " truncate ";
$words[] = " update ";
$words[] = "use ";
$words[] = "– ";

//判断提交的数据中是否存在以上关键字,$_REQUEST中含有所有提交数据
foreach($_REQUEST as $strGot)
{
   $strGot = strtolower($strGot);//转为小写
   foreach($words as $word)
   {
    if(strstr($strGot,$word))
    {
     echo "您输入的内容含有非法字符!";
     exit;//退出运行
    }
   }
}
}
checkIlldalWord();
?>
//*******************EndCode***********************************

//*******************db_connect.php***************************

<?php
//数据库连接函数
function db_connect()
{
//调用mysql的构造函数建立连接,同时选择使用数据库’test’
$dbhost = ‘localhost’;
$dbuser = ‘root’;
$dbpw = ‘123456789’;
$dbname = ‘test’;

$db = @new mysqli($dbhost,$dbuser,$dbpw,$dbname);

//检查数据库连接
if(mysqli_connect_errno())
{
   echo "数据库连接失败!<br>\n";
   echo mysqli_connect_error();
   exit; //退出程序,后面的语句将不再执行
}
return $db;
}
?>
//*******************EndCode***********************************

//*******************modify_result.php*************************

<?php
//获取用户名
$username = trim($_GET[‘uid’]);
if(empty($username))
{
echo ‘URL参数错误!’;
exit;
}
?>
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
   <title>Registering Reault</title>
   <style type="text/css">
   <!–
   /*表边框为内凹型*/
   table {border-color:#c0e0c0; border-style:insert; border-width:4px}
   td {font-size:14pt}
   /*居中*/
   td.hint {color:red; font-size:20pt; text-align:center}
   /*背景为天蓝色*/
   td.caption {background-color:skyblue; font-size:16pt}
   /*粗体*/
   td.label {font-weight:bold;}
   –>
   </style>
</head>
<body>
<center>
<?php
if(!empty($username))
{
?>
   <table border=’0′ cellpadding=’5′ cellspacing=’5′>
   <tr>
      <td colspan=’2′ class=’hint’>恭喜您修改密码成功!</td>
   </tr>
   <tr>
      <td class=’label’>用户名:</td>
      <td><? echo $username; ?></td>
   </tr>
   </table>
<?php
}
?>
</center>
</body>
</html>

//*******************EndCode***********************************

SS的一些特殊调用方法(附运算符的种类)

定义函数$i

<!–{eval $i=1;}–>
<!–{loop $_SBLOCK[‘relativeitem’] $ikey $value}–>
<!–{if (($i % 2 ==0))}–>  *意思是$i可以整除2没有余数
  <li><!–{echo $i;}–><a href="$value[url]">$value[subject]</a></li>
<!–{else}–>
  <li><a href="$value[url]" target="_blank">$value[subject]</a></li>
<!–{/if}–>
<!–{eval $i++;}–>
<!–{/loop}–>

还有其他用法如

<!–{if (($i !=5))}–>  *如果$i不是第5个

与此类似的还有如下:

<!–{loop $_SBLOCK[‘值’] $key $value}–>
<!–{if count($_SBLOCK[‘值’])==($key+1)}–>
最后一个循环
<!–{else}–>
前面的循环
<!–{/if}–>
<!–{/loop}–>

C语言的运算符可分为以下几类:
1.算术运算符
用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(–)共七种。
2.关系运算符
用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
3.逻辑运算符
用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
4.位操作运算符
参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
5.赋值运算符
用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6.条件运算符
这是一个三目运算符,用于条件求值(?:)。
7.逗号运算符
用于把若干表达式组合成一个表达式(,)。
8.指针运算符
用于取内容(*)和取地址(&)二种运算。
9.求字节数运算符
用于计算数据类型所占的字节数(sizeof)。
10.特殊运算符
有括号(),下标[],成员(→,.)等几种。

mysql_fetch_object mysql_fetch_row mysql_fetch_array三者区别

$array 是存储返回内容集得变量名字

mysql_fetch_row返回得要用
$array[0],$array[1]…… 这样得格式调用

mysql_fetch_array(返回索引数组+关联数组)
即可以用 $array[0],$array[1]…… 这样得格式调用
也可以用 $array[‘字段名1’],$array[‘字段名2’]…… 这样得格式调用

mysql_fetch_object 返回对象格式
$array->字段名1,$array->字段名2…… 这样调用

以下是摘自官网的详细说明:

1、mysql_fetch_object
返回类资料。

语法: object mysql_fetch_object(int result, int [result_typ]);

返回值: 类

函数种类: 数据库功能

内容说明

本函数用来将查询结果 result 拆到类变量中。使用方法和 mysql_fetch_array() 几乎相同,不同的地方在于本函数返回资料是类而不是数组。若 result 没有资料,则返回 false 值。另外治募 注意的地方是,取回的类资料的索引只能是文字而不能用数字,这是因为类的特性。类资料的特性中所有的属性 (property) 名称都不能是数字,因此只好乖乖使用文字字符串当索引了。参数 result_typ是一个常量值,有以下几种常量 MYSQL_ASSOC、MYSQL_NUM 与 MYSQL_BOTH。关于速度方面,本函数的处理速度几乎和 mysql_fetch_row() 及 mysql_fetch_array() 二函数差不多,要用哪个函数还是看使用的需求决定。

使用范例

下面的例子示范如使用返回的类。

<?php
mysql_connect($host,$user,$password);
$result = mysql_db_query("MyDatabase","select * from test");
while($row = mysql_fetch_object($result)) {
    echo $row->user_id;
    echo $row->fullname;
}
mysql_free_result($result);
?>

2、mysql_fetch_array
返回数组资料。

语法: array mysql_fetch_array(int result, int [result_typ]);

返回值: 数组

函数种类: 数据库功能

内容说明

本函数用来将查询结果 result 拆到数组变量中。若 result 没有资料,则返回 false 值。而本函数可以说是 mysql_fetch_row() 的加强函数,除可以将返回列及数字索引放入数组之外,还可以将文字索引放入数组中。若是好几个返回字段都是相同的文字名称,则最后一个置入的字段有效,解决方法是使用数字索引或者为这些同名的字段 (column) 取别名 (alias)。治募 注意的是使用本函数的处理速度其实不会比 mysql_fetch_row() 函数慢,要用哪个函数还是看使用的需求决定。参数 result_typ 是一个常量值,有以下几种常量 MYSQL_ASSOC、MYSQL_NUM 与 MYSQL_BOTH。

使用范例

<?php
mysql_connect($host,$user,$password);
$result = mysql_db_query("database","select * from table");
while($row = mysql_fetch_array($result)) {
echo $row["user_id"];
echo $row["fullname"];
}
mysql_free_result($result);
?>

3、MySQL 数据库函数库

mysql_fetch_row
返回单列的各字段。

语法: array mysql_fetch_row(int result);

返回值: 数组

函数种类: 数据库功能

内容说明

本函数用来将查询结果 result 之单列拆到数组变量中。数组的索引是数字索引,第一个的索引值是 0。若 result 没有资料,则返回 false 值。
 

使用X-UA-Compatible来设置IE8兼容模式

X-UA-Compatible是针对ie8新加的一个设置,对于ie8之外的浏览器是不识别的,这个区别与content=”IE=7″在无论页面是否包含<!DOCTYPE>指令,都像是使用了 Windows Internet Explorer 7的标准模式。而content=”IE=EmulateIE7″模式遵循<!DOCTYPE>指令。对于多数网站来说,它是首选的兼容性模式。

目前IE8尚在测试版中,所以为了避免制作出的页面在IE8下面出现错误,建议直接将IE8使用IE7进行渲染。也就是直接在页面的header的meta标签中加入如下代码:

1.<meta http-equiv=”X-UA-Compatible” content=”IE=5″ />
像是使用了 Windows Internet Explorer 7 的 Quirks 模式,这与 Windows Internet Explorer 5 显示内容的方式很相似。

2.<meta http-equiv=”X-UA-Compatible” content=”IE=7″ />
无论页面是否包含 <!DOCTYPE> 指令,都像是使用了 Windows Internet Explorer 7 的标准模式。

3.<meta http-equiv=”X-UA-Compatible” content=”IE=8″ />

4.<meta http-equiv=”X-UA-Compatible” content=”edge” />
Edge 模式通知 Windows Internet Explorer 以最高级别的可用模式显示内容,这实际上破坏了“锁定”模式。

5.<meta http-equiv=”X-UA-Compatible” content=”IE=EmulateIE7″ />
EmulateIE7 模式通知 Windows Internet Explorer 使用 <!DOCTYPE> 指令确定如何呈现内容。标准模式指令以Windows Internet Explorer 7 标准模式显示,而 Quirks 模式指令以 IE5 模式显示。与 IE7 模式不同,EmulateIE7 模式遵循 <!DOCTYPE> 指令。对于多数网站来说,它是首选的兼容性模式。

附:今天又看到一篇译文说X-UA-Compatible不加时默认被锁定为IE7版本执行。

这样我们才能使得页面在IE8里面表现正常!

IE8兼容模式的问题

最近装了IE8 ,最新版的,有关IE8下浏览网站变形等问题,在这篇文章里面已经详细说了(虽然废话多了点)  
某些网站可能无法正确显示,或在 Windows Internet Explorer 8 中正常工作  ,在网上也找过资料,不过上面的方法在我自己做的东西里面,稍微试了下,没用,最后还是自己发现IE8的开发者工具里面有个下拉列表,浏览器模式   改为IE7,就完全没有问题了。用地址栏或者菜单栏里面的兼容模式,问题还是依旧。加标签也没用。
反正还是能解决的,所以也就不计较这么多了,凑合用吧。

dede5.3.1版单页文档的编辑器取消

修改模板,在根目录下》dede》templets内
templets_one_add.htm(增加新页面模板)
此句:<?php GetEditor("body",$body,450);?>
改为:<textarea name=’body’ rows="20" style=’width:100%;height:400xp’></textarea>

templets_one_edit.htm(更新页面模板)
此句:<?php GetEditor("body",$row[‘body’],450);?> 
改为:<textarea name=’body’ rows="20" style=’width:100%;height:400xp’><?php echo $row[‘body’]?></textarea>

说明:上面是简化编辑器,不使用系统的编辑器,系统编辑器乱生成代码,比较麻烦,还不如手写。

Windows IIS主机去掉wordpress永久链接中的index.php

看到朋友们很多都问WIN主机IIS下如何实现永久连接方法如下本人测试成功

看到朋友们很多都问WIN主机IIS下如何实现永久连接,也就是去掉INDEX.PHP放下如下,本人测试成功
这篇文章转自phplamp,还有 shamas!
作为国内的大部分主机提供商都是用的windows主机,号称全能主机。但在WP的rewrite URL方面却一致是个弱项,不过看了下面的文章,你可是有福音了!

要说Wordpress中的完美工作环境,当然要属于Lamp平台,或是稍微逊色一点的Wamp平台;但是由于某此特殊原因,我们没有选择它们,而是选择了Windows+iis+MySql+Php,我把它统称为:Wimp平台。

这次我要说的就是如何在Wimp平台中实现Wordpress的完美URL结构!

例:http://www.phplamp.org/2008/06/wp-iis-isapi/

用过Wordpress的应该都知道,实现这样的URL只需要在后台中:Settings->permalinks,然后设置成自己中意的 URL就行了。但是前提是您的空间支持 rewrite || 您的虚拟主机支持 .htaccess。Lamp,Wamp中只要开启加载mod_rewrite模块就行了。但是Wimp却不是这么简单的,它如果想实现rewrite功 能只能借助于第三方的ISAPI组件。

如现在比较火的:http://www.helicontech.com/isapi_rewrite/ 这是一个国外的组织专门为IIS写的ISAPI Rewrite组件,非常类似于Apache的mod_rewrite。有免费版与收费版!很多网友说实现WP在IIS中的rewrite功能只需要下载 一个它的组件就OK了。我在本地测试了好一阵子,没有成功,而且用它的比较麻烦,还要自己写rewrite规则!(没有成功可能是我没写正确规则, 汗!)。最后我放弃了它……

下面说一下本博客中(phplamp.org)用到的ISAPI组件吧:

wp-url-rewriting.dll 下载地址:http://code.google.com/p/wp-url-rewriting-on-iis/downloads/list

这是位好心的牛人专门为工作于iiS中的WP写的ISAPI rewrite组件,用它您根本就不用写rewrite规则,您只需要将其加载到您的ISAPI中,然后进wp后台定义自己的permalinks即可。 假如你用的是虚拟主机的话,您可以联系您的空间商让其为您添加上这个组件。从此您的WP也可以完美rewrite了。

注意:本文还没有完呢!

当我们定义好permalinks后,可能您会发现,我们点击中文标量的文章链接时说找不到网址。

例:http://www.phplamp.org/2008/06/p … %e6%96%87%e7%ab%a0/

这是因为:WP的编码为utf-8,而这篇文章的URL中Slug(上链接红色部分)编码为gbk。然后WP取得文章Slug后,通过它来查找文章就会找不到!因为编码不同呀。

更改方法:

wp-include/classes.php中(44-50行)

if ( isset($_SERVER[‘PATH_INFO’]) )
$pathinfo = $_SERVER[‘PATH_INFO’];
else
$pathinfo = ”;
$pathinfo_array = explode(‘?’, $pathinfo);
$pathinfo = str_replace(“%”, “%25″, $pathinfo_array[0]);
$req_uri = $_SERVER[‘REQUEST_URI’];

替换为下(转换$_SERVER[‘PATH_INFO’]和$_SERVER[‘REQUEST_URI’]的编码):

if ( isset($_SERVER[‘PATH_INFO’]) )
$pathinfo = mb_convert_encoding($_SERVER[‘PATH_INFO’], ‘utf-8′, ‘GBK’);
else
$pathinfo = ”;
$pathinfo_array = explode(‘?’, $pathinfo);
$pathinfo = str_replace(“%”, “%25″, $pathinfo_array[0]);
$req_uri = mb_convert_encoding($_SERVER[‘REQUEST_URI’], ‘utf-8′, ‘GBK’);

这个操作的意思就是:将Slug的编码由GBK转换为utf-8(您也可以用iconv,或是其它的函数来代替mb_convert_encoding)。