月度归档:2011年03月

php伪静态技术

mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面。下面我详细说说它的使用方法

1.检测Apache是否支持mod_rewrite

通过php提供的phpinfo()函数查看环境配置,通过Ctrl+F查找到“Loaded Modules”,其中列出了所有apache2handler已经开启的模块,如果里面包括“mod_rewrite”,则已经支持,不再需要继续设置。

如果没有开启“mod_rewrite”,则打开目录 您的apache安装目录“/apache/conf/” 下的 httpd.conf 文件,通过Ctrl+F查找到“LoadModule rewrite_module”,将前面的”#”号删除即可。

如果没有查找到,则到“LoadModule” 区域,在最后一行加入“LoadModule rewrite_module ,modules/mod_rewrite.so”(必选独占一行),然后重启apache服务器即可。

2.让apache服务器支持.htaccess

如何让自己的本地APACHE服务器支持”.htaccess”呢?其实只要简单修改一下apache的httpd.conf设置就可以让 APACHE支 持.htaccess了。打开httpd.conf文件(在那里? APACHE目录的CONF目录里面),

用文本编辑器打开后,查找

Options FollowSymLinks

AllowOverride None

改为

Options FollowSymLinks

AllowOverride All

就可以了。

3.建立.htaccess 文件

有1种最简单的方法建立.htaccess文件:

用记事本 打开,点击文件–另存为,在文件名窗口输入”.htaccess”,注意是整个绿色部分,

也就是包含英文引号,然后点击保存就行了。

4.rewrite规则学习

我们新建一个.htaccess文件之后,就在里面写入以下内容:

RewriteEngine on #rewriteengine为重写引擎开关on为开启off为关闭

RewriteRule ([0-9]{1,}) $index.php?id=$1

我讲解一下RewriteRule:RewriteRule是重写规则,支持正则表达式的,上面的([0-9]{1,})是指由数

字组成的,$是结束标志,说明是以数字结束!

好吧,现在我们可以实现伪静态页面了,写下一下的规则:

RewriteEngine on

RewriteRule ([a-zA-Z]{1,})-([0-9]{1,}).html $index.php?action=$1&id=$2

([a-zA-Z]{1,})-([0-9]{1,}).html$是规则,index.php?action=$1&id=$2是要替换的格式,$1代表第

一个括号匹配的值,$2代表第二个,如此类推!!

我们写一个处理的PHP脚本:

index.php

PHP代码

echo ‘你的Action是:’ . $_GET[‘action’];

echo ‘

’;

echo ‘你的ID是:’ . $_GET[‘id’];

?>

好了,我们现在在浏览器中输入:

localhost/page-18.html

输出的是:

你的Action是:page

你的ID是:18

centOS安装jdk,java

下载java:http://cds-esd.sun.com/ESD6/JSCDL/jdk/6u24-b07/jdk-6u24-linux-i586.bin?AuthParam=1300950622_5a859408e7d9c0e84576e7ebd4153056&TicketId=B%2Fw%2BkBqESVhISxJBPlNYkgDn&GroupName=CDS&FilePath=/ESD6/JSCDL/jdk/6u24-b07/jdk-6u24-linux-i586.bin&File=jdk-6u24-linux-i586.bin

用WinSCP把jdk-6u24-linux-i586.bin传到centos,

执行:

#chmod 755 jdk-6u24-linux-i586.bin

#./jdk-6u24-linux-i586.bin

#mv jdk1.6.0_24/ /usr/java

增加环境变量: #vi /etc/profile

在文件末尾添加:

JAVAHOME=/usr/java

PATH=$JAVAHOME/bin:$PATH

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export JAVAHOME

export PATH

export CLASSPATH

保存/etc/profile

#source /etc/profile 使环境变量生效!

mysql 主从同步

MysqlserverA:192.168.1.1
MysqlserverB:192.168.1.2
同步对象:db1
1、 两台服务器安装centos/rhel 5
注意 mysql 数据库的版本,两个数据库版本要相同
3、 进 行单项同步配置
a)主服务器master配置
i. 配置Master 的my.cnf文件
My.cnf 配置选项
说明
log-bin=mysql-bin
启动二进制日志系统
binlog-do-db=db1
二进制需要同步的数据库名
server-id = 1
本机数据库ID 标示为主
log-bin=/var/log/mysql/updatelog
设定生成log文件名(保证目录权限)
binlog-ignore-db=mysql
避免同步mysql用户配置,以免不 必要的麻烦
ii. 进入mysql命令行,为slave用户添加同步专用权限
mysql命令
说明
GRANT REPLICATION SLAVE,REPLICATION CLIENT,RELOAD,SUPER ON *.* TO \’repl\’@\’192.168.1.2\’ IDENTIFIED BY \’123\';
##给与从服务器用户repl的同步权限
Grant ALL PRIVILEGES ON *.* TO hk@\’%\’ IDENTIFIED BY \’123456\';
# 如果需要的话添加管理用户
Flush privileges;
#刷新权限
iii. 停止数据库,并将本地数据库打包拷贝到从数据库上
mysql命令
说明
Service mysqld stop
停 止服务
Tar -cvf /root/db1.tar /var/lib/mysql/db1
备份主服务器数据库
Scp /root/db1.tar root@192.168.1.2:/root
远程拷贝到从服务器
Service mysqld start
启动主服务器mysql服务
b) 同步 slave 从服务器配置
i. 配置slave服务器my.cnf文件
将以下配置启用:
My.cnf 配置选项
说明
server-id = 2
从服务器ID号,不要和主ID相同
master-host =192.168.1.1
指定主服务器IP地址
master-user =repl
制定在主服务器上可以进行同步的用户名
master-password =123
密码
master-port =3306
同步所用的端口
master-connect-retry=60
断点重新连接时间
replicate-ignore-db=mysql
屏蔽对mysql库的同步
replicate-do-db=db1
同步数据库名称
ii. 装载主服务器数据库
命 令
说明
Cd /var/lib/mysql
进入数据库库文件主目录
Cp /root/db1.tar ./
拷 贝主数据库的tar文件到当前目录
Tar -xvf db1.tar
解包
Service mysqld start
启 动从数据库服务
iii.查询配置
1、在从服务器(备份服务器)运行下面语句
l此处Slave_IO_Running ,Slave_SQL_Running 都应该是yes;
l表示从库的I/O,Slave_SQL线程都正确开启.
l更多详细信息以 及参数设置,请参考MySQL 5.0 Manual手册.
2、在主服务器A MySQL命令符下:
显示(不同主机结果不同)
注 意:
同步之前如果主从数据不同步可以采取:上面冷备份远程拷贝法或者在从服务器上命令行同步方法
3、 主从数据库不同步的解决方法
ü 在从服务器执行MySQL命令下:
slave stop;
先停止slave服务
CHANGE MASTER TO MASTER_LOG_FILE=\’updatelog.000028\’,MASTER_LOG_PO S=313361;
根 据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果
l MASTER_LOG_FILE: 主服务器最后产生的二进制文件名
l MASTER_LOG_POS:主服务器最后的“检查点”数值
slave start;
启动从服务器同步服务
ü 用show slave status\G;看一下从服务器的同步情况
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,那代表已经在同步
问题,注意:
Slave_IO_Running: NO
如果此项为NO多为连接性问题
1、 两个服务器系统之间网络连接问题
2、 数据库用户权限问题
Slave_SQL_Running: NO
数据库二进制文件权限不对,mysql无法执行
进行双向同步配置
一、先修改原 slave 服务器配置
1. 配置原slave服务器my.cnf文件(红字为添加内容)
server-id = 2
从服务器ID号,不要和主ID相同
master-host = 192.168.1.1
指定主服务器IP地址
master-user = repl
制定在主服务器上可以进行同步的用户名
master-password = 123
密码
master-port = 3306
同步所用的端口
master-connect-retry=60
断点重新连接时间
replicate-ignore-db=mysql
屏蔽对mysql库的同步
replicate-do-db=db1
同步数据库名称
log-bin=/var/log/mysql/updatelog
设定生成log文件名
binlog-do-db=db1
设置同步数据库名
binlog-ignore-db=mysql

强制linux必需使用密钥登陆

创建密钥
在linux下用ssh-keygen,windows下可以用puttygen或securecrt(我使用securecrt,创建的时候要使用标准openssh格式)。

上传公钥
登陆服务器,在希望使用的用户主目录下:
mkdir .ssh && chmod 700 .ssh && cd .ssh
将公钥上传到.ssh目录,并将文件名改为authorized_keys2
mv * authorized_keys2 && chmod 600 authorized_keys2

调整sshd配置文件
修改:/etc/ssh/sshd_config
设置PasswordAuthentication no

这样设置之后,就禁止了用户使用密码登陆系统。强制用户必需用密钥登陆。

重启系统

利用PHP和FLASH生成验证码程序

php要求安装Ming库,现在的php版本都自带Ming扩展模块,只要在php.ini里面将extension=php_ming.dll前面的注释去掉就可以用了。如果你没有php_ming.dll或文件,可以去www.php.net下载一个最新的php安装包,里面包含有的。简单来说Ming就是一个php扩展库,提供给phper用php代码生成flash文件的一个东东,具体的使用方法大家上网搜搜。下面是我写的一个简单的Ming库使用例子,在注册和登录程序里面经常用到的验证码程序。

PHP文件
code.php

<?php 

session_start();

unset($_SESSION[code]); 

$code=substr(md5(rand()),10,4); 

$_SESSION[code]=$code

$font = new SWFFont'_sans' );          //设置文字显示的字体,这个在支持自定义字体方面还比较麻烦,现在使用系统字体吧。

$tf = new SWFTextField();                         //设置文本域

$tf->setFont$font );                                   //指定文本使用的字体

$tf->setColorrand(90,255),rand(90,255),rand(90,255) );         //文本的颜色

$tf->setHeight80 );                              //文本高度

$tf->addString$code);                        //添加文本内容

$m = new SWFMovie();                        //创建一个flash文件

$m->setbackground60,60,60 );         //设置背景颜色

$m->setDimension25080 );               //设置flash的大小

$f_tf $m->add$tf );                             //将文本域添加到影片中

$f_tf->moveTo( -1000);                   //将文本对象移到影片左边,-1000应该让大家看不到的了。

for( $i 0$i 31$i++ ) {               

$m->nextframe();                                       //影片播放下一帧 

if ($i>25)

$f_tf->moveTo( ($i-10)*($i-10), );         //将文本对象加速向右移动,飞出右边框

else if($i>5)

$f_tf->moveTo( ($i-5)*4);                        //慢点移动,好让大家看清文本内容

else

$f_tf->moveTo( -($i-15)*($i-15), );         //迅速从左边飞到中间

header('Content-type: application/x-shockwave-flash');    //设置输出格式

$m->output();                                                                          //将影片输出

?>

将这个文本保存后,执行运行就可以看到flash效果了。
为了偷懒可以利用flash发布时候生成的AC_RunActiveContent.js文件,我们随便改改就可以写出一个验证码显示和刷新的脚本了
将AC_RunActiveContent.js中的document.write改成返回字符串,
就是将AC_Generateobj函数里面的document.write(str)改为return str;
再将AC_FL_RunContent函数改为返回的。
同时将AC_getArgs函数里面的
这行代码 //args[i+1] = AC_AddExtension(args[i+1], ext);注释掉。
改完后,我们就可以这样用了


<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh_cn" lang="zh_cn">

<head>

<meta http-equiv="Content-Type" />

<title>code</title>

<script src="AC_RunActiveContent.js" language="javascript"></script>


</head>

<body bgcolor="#ffffff">

<!--影片中使用的 URL-->

<!--影片中使用的文本-->

<!-- saved from url=(0013)about:internet -->

<script src="AC_RunActiveContent.js" language="javascript"></script>

<script language="javascript" >

function strSwf()

{

    i = Math.random();

    return AC_FL_RunContent(

          'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0',

          'width', '120',

          'height', '30',

          'src', 'code.php?'+i,

          'quality', 'high',

          'pluginspage', 'http://www.macromedia.com/go/getflashplayer',

          'align', 'middle',

          'play', 'true',

          'loop', 'true',

          'scale', 'showall',

          'wmode', 'window',

          'devicefont', 'false',

          'id', 'numcheck',

          'name', 'numcheck',

          'menu', 'true',

          'allowFullScreen', 'false',

          'allowScriptAccess','sameDomain',

          'movie', 'code.php?'+i,

          'salign', ''

          ); //end AC code

    }

</script>

<table width=500 height=30 border=1 align=center>

<tr>

<td align='right' height=30>请输入验证码<input type='text' name='checkcode' value='' size=6></td>

<td align='left'>    <span  id='showflash'><script>document.write(strSwf())</script></span>  <input type='button' name='reflash' value='刷新验证码'  onclick='showflash.innerHTML=strSwf();'> </td>

</tr>

</table>

</body>

</html>

[ 本帖最后由 sentrychen 于 2007-9-30 03:35 编辑 ]

sentrychen (2007-9-30 03:32:37)
修改后的AC_RunActiveContent.js文件

//v1.7

// Flash Player Version Detection

// Detect Client Browser type

// Copyright 2005-2007 Adobe Systems Incorporated.    All rights reserved.

var isIE    = (navigator.appVersion.indexOf("MSIE") != -1) ? true false;

var isWin = (navigator.appVersion.toLowerCase().indexOf("win") != -1) ? true false;

var isOpera = (navigator.userAgent.indexOf("Opera") != -1) ? true false;

function ControlVersion()

{

var version;

var axo;

var e;

// NOTE : new ActiveXObject(strFoo) throws an exception if strFoo isn't in the registry

try {

    // version will be set for 7.X or greater players

    axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");

    version axo.GetVariable("$version");

} catch (e) {

}

if (!version)

{

    try {

         // version will be set for 6.X players only

         axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");

         

         // installed player is some revision of 6.0

         // GetVariable("$version") crashes for versions 6.0.22 through 6.0.29,

         // so we have to be careful. 

         

         // default to the first public version

         version "WIN 6,0,21,0";

         // throws if AllowScripAccess does not exist (introduced in 6.0r47)    

         axo.AllowScriptAccess "always";

         // safe to call for 6.0r47 or greater

         version axo.GetVariable("$version");

    } catch (e) {

    }

}

if (!version)

{

    try {

         // version will be set for 4.X or 5.X player

         axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");

         version axo.GetVariable("$version");

    } catch (e) {

    }

}

if (!version)

{

    try {

         // version will be set for 3.X player

         axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.3");

         version "WIN 3,0,18,0";

    } catch (e) {

    }

}

if (!version)

{

    try {

         // version will be set for 2.X player

         axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");

         version "WIN 2,0,0,11";

    } catch (e) {

         version = -1;

    }

}

return version;

}

// JavaScript helper required to detect Flash Player PlugIn version information

function GetSwfVer(){

// NS/Opera version >= 3 check for Flash plugin in plugin array

var flashVer = -1;

if (navigator.plugins != null && navigator.plugins.length 0) {

    if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {

         var swVer2 navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" "";

         var flashDescription navigator.plugins["Shockwave Flash" swVer2].description;

         var descArray flashDescription.split(" ");

         var tempArrayMajor descArray[2].split(".");         

         var versionMajor tempArrayMajor[0];

         var versionMinor tempArrayMajor[1];

         var versionRevision descArray[3];

         if (versionRevision == "") {

          versionRevision descArray[4];

         }

         if (versionRevision[0] == "d") {

          versionRevision versionRevision.substring(1);

         } else if (versionRevision[0] == "r") {

          versionRevision versionRevision.substring(1);

          if (versionRevision.indexOf("d") > 0) {

         versionRevision versionRevision.substring(0versionRevision.indexOf("d"));

          }

         }

         var flashVer versionMajor "." versionMinor "." versionRevision;

    }

}

// MSN/WebTV 2.6 supports Flash 4

else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.6") != -1flashVer 4;

// WebTV 2.5 supports Flash 3

else if (navigator.userAgent.toLowerCase().indexOf("webtv/2.5") != -1flashVer 3;

// older WebTV supports Flash 2

else if (navigator.userAgent.toLowerCase().indexOf("webtv") != -1flashVer 2;

else if ( isIE && isWin && !isOpera ) {

    flashVer ControlVersion();

return flashVer;

}

// When called with reqMajorVer, reqMinorVer, reqRevision returns true if that version or greater is available

function DetectFlashVer(reqMajorVerreqMinorVerreqRevision)

{

versionStr GetSwfVer();

if (versionStr == -) {

    return false;

} else if (versionStr != 0) {

    if(isIE && isWin && !isOpera) {

         // Given "WIN 2,0,0,11"

         tempArray                   versionStr.split(" ");    // ["WIN", "2,0,0,11"]

         tempString              tempArray[1];         // "2,0,0,11"

         versionArray              tempString.split(","); // ['2', '0', '0', '11']

    } else {

         versionArray              versionStr.split(".");

    }

    var versionMajor              versionArray[0];

    var versionMinor              versionArray[1];

    var versionRevision         versionArray[2];

                   // is the major.revision >= requested major.revision AND the minor version >= requested minor

    if (versionMajor parseFloat(reqMajorVer)) {

         return true;

    } else if (versionMajor == parseFloat(reqMajorVer)) {

         if (versionMinor parseFloat(reqMinorVer))

          return true;

         else if (versionMinor == parseFloat(reqMinorVer)) {

          if (versionRevision >= parseFloat(reqRevision))

         return true;

         }

    }

    return false;

}

}

function AC_AddExtension(srcext)

{

    if (src.indexOf('?') != -1)

          return src.replace(/\?/, ext+'?'); 

    else

          return src ext;

}

function AC_Generateobj(objAttrsparamsembedAttrs

    var str '';

    if (isIE && isWin && !isOpera)

    {

          str += '<object ';

          for (var i in objAttrs)

          {

              str += '="' objAttrs '" ';

          }

          str += '>';

          for (var i in params)

          {

              str += '<param name="' '" value="' params '" /> ';

          }

          str += '</object>';

    }

    else

    {

          str += '<embed ';

          for (var i in embedAttrs)

          {

              str += '="' embedAttrs '" ';

          }

          str += '> </embed>';

    }

    //document.write(str);

    return str;

}

function AC_FL_RunContent(){

    var ret 

          AC_GetArgs

          (    arguments".swf""movie""clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"

         "application/x-shockwave-flash"

          );

//AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);

    return AC_Generateobj(ret.objAttrsret.paramsret.embedAttrs);

}

function AC_SW_RunContent(){

    var ret 

          AC_GetArgs

          (    arguments".dcr""src""clsid:166B1BCA-3F9C-11CF-8075-444553540000"

         null

          );

    AC_Generateobj(ret.objAttrsret.paramsret.embedAttrs);

}

function AC_GetArgs(argsextsrcParamNameclassidmimeType){

    var ret = new Object();

    ret.embedAttrs = new Object();

    ret.params = new Object();

    ret.objAttrs = new Object();

    for (var i=0args.lengthi=i+2){

          var currArg args.toLowerCase();          

          switch (currArg){ 

              case "classid":

              break;

              case "pluginspage":

              ret.embedAttrs[args] = args[i+1];

              break;

              case "src":

              case "movie"

              //args[i+1] = AC_AddExtension(args[i+1], ext);

              ret.embedAttrs["src"] = args[i+1];

              ret.params[srcParamName] = args[i+1];

              break;

              case "onafterupdate":

              case "onbeforeupdate":

              case "onblur":

              case "oncellchange":

              case "onclick":

              case "ondblclick":

              case "ondrag":

              case "ondragend":

              case "ondragenter":

              case "ondragleave":

              case "ondragover":

              case "ondrop":

              case "onfinish":

              case "onfocus":

              case "onhelp":

              case "onmousedown":

              case "onmouseup":

              case "onmouseover":

              case "onmousemove":

              case "onmouseout":

              case "onkeypress":

              case "onkeydown":

              case "onkeyup":

              case "onload":

              case "onlosecapture":

              case "onpropertychange":

              case "onreadystatechange":

              case "onrowsdelete":

              case "onrowenter":

              case "onrowexit":

              case "onrowsinserted":

              case "onstart":

              case "onscroll":

              case "onbeforeeditfocus":

              case "onactivate":

              case "onbeforedeactivate":

              case "ondeactivate":

              case "type":

              case "codebase":

              case "id":

              ret.objAttrs[args] = args[i+1];

              break;

              case "width":

              case "height":

              case "align":

              case "vspace"

              case "hspace":

              case "class":

              case "title":

              case "accesskey":

              case "name":

              case "tabindex":

              ret.embedAttrs[args] = ret.objAttrs[args] = args[i+1];

              break;

              default:

              ret.embedAttrs[args] = ret.params[args] = args[i+1];

          }

    }

    ret.objAttrs["classid"] = classid;

    if (mimeTyperet.embedAttrs["type"] = mimeType;

    return ret;

}

解决CLOSE_WAIT 问题

最近web服务器在大流量情况下经常出现假死现象,后台log报 too many open files 的错误,加大linux系统的文件打开数是可以解决部分问题,但是时间长了同样出问题,通过查询网络连接发现是tcp连接不关闭造成的。如下:
  netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’
 
  LAST_ACK 1
  SYN_RECV 15
 
CLOSE_WAIT 7729
  ESTABLISHED 471
  FIN_WAIT1 3
  FIN_WAIT2 52
  SYN_SENT 1
  TIME_WAIT 725


  从结果可以看到有大量的连接处于CLOSE_WAIT状态。



要解决这个问题的可以修改系统的参数,系统默认超时时间的是7200秒,也就是2小时。

默认如下:

tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds


意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效


修改后


sysctl -w net.ipv4.tcp_keepalive_time=30
sysctl -w net.ipv4.tcp_keepalive_probes=2
sysctl -w net.ipv4.tcp_keepalive_intvl=2


经过这个修改后,服务器会在短时间里回收没有关闭的tcp连接。

强大的PHP伪造IP头、Cookies、Reference

<?
$fp = fsockopen ("passport.baidu.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br>\n";
} else {
$msg="GET /?login&username=lapiaotuan22&password=oyhz123456 HTTP/1.0\r\n";
$msg.="Host:passport.baidu.com \r\n";
$msg.="Referer: http://passport.baidu.com/ \r\n";

$msg.="Client-IP: 202.101.201.11\r\n";
$msg.="X-Forwarded-For: 202.101.201.11\r\n"; //主要是这里来构造IP
$msg.="Connection: Close\r\n\r\n";
fputs ($fp, $msg);
while (!feof($fp)) {
echo fgets ($fp,1024);
}
fclose ($fp);
}
?>

HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东。
以下是伪造方法:
PHP(前提是装了curl):
PHP代码
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.dc9.cn/xxx.asp ");
curl_setopt ($ch, CURLOPT_REFERER, "http://www.dc9.cn/ ");
curl_exec ($ch);
curl_close ($ch);
PHP(不装curl用sock)
PHP代码
$server = ‘www.dc9.cn';
$host = ‘www.dc9.cn';
$target = ‘/xxx.asp';
$referer = ‘http://www.dc9.cn/'; // Referer
$port = 80;
$fp = fsockopen($server, $port, $errno, $errstr, 30);
if (!$fp)
{
echo "$errstr ($errno)<br />\n";
}
else
{
$out = "GET $target HTTP/1.1\r\n";
$out .= "Host: $host\r\n";
$out .= "Cookie: ASPSESSIONIDSQTBQSDA=DFCAPKLBBFICDAFMHNKIGKEG\r\n";
$out .= "Referer: $referer\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp))
{
echo fgets($fp, 128);
}
fclose($fp);
}

IP也可以伪造

$fp = fsockopen ("192.168.0.128", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br>\n";
} else {
$msg="GET /003.php HTTP/1.0\r\n";
$msg.="Host: 192.168.0.128\r\n";
$msg.="Referer: http://www.baidu.com\r\n ";

$msg.="Client-IP: 1.1.1.1\r\n";
$msg.="X-Forwarded-For: 1.1.1.1\r\n"; //主要是这里来构造IP
$msg.="Connection: Close\r\n\r\n";
fputs ($fp, $msg);
while (!feof($fp)) {
echo fgets ($fp,1024);
}
fclose ($fp);
}

记住用fsockopen时,命令最后一定要有\r\n\r\n,不然会超时。

其实这个可以用$_SERVER[‘REMOTE_ADDR’]来得到正确IP,但是人们为了得到代理访问IP,而采用的得到IP的方法往往不是$_SERVER[‘REMOTE_ADDR’],这就为我们提供了机会。

批处理解决环境变量的问题

 

http://www.cn-dos.net/forum/viewthread.php?tid=44462

前一段时间我一直为如果在新增环境变量而苦恼。因为不想每次都是通过“我的电脑”-“属性”来增加“环境变量”。因为不是每个人都懂怎么做,尤其对于一些对计算机不是很懂的人。
起先我想到的是用注册表来实现。先将增加环境变量的地方导出来,然后通过命令C:\WINDOWS\regedit /s Environment.reg 来导入注册表。
但是这个方法比较笨。今天终于知道了一个简单的办法。通过WMIC,只需要一条命令就可以了。

比如添加一个环境变量:
wmic ENVIRONMENT create name="ORACLE_HOME",VariableValue="C:\ORACLE"

ENVIRONMENT – 系统环境设置管理

  1. ::获取temp环境变量  
  2. wmic ENVIRONMENT where "name=’temp’" get UserName,VariableValue  
  3. ::更改path环境变量值,新增e:\tools  
  4. wmic ENVIRONMENT where "name=’path’ and username='<system>’" set VariableValue="%path%;e:\tools"  
  5. ::新增系统环境变量home,值为%HOMEDRIVE%%HOMEPATH%   
  6. wmic ENVIRONMENT create name="home",username="<system>",VariableValue="%HOMEDRIVE%%HOMEPATH%"  
  7. ::删除home环境变量  
  8. wmic ENVIRONMENT where "name=’home’" delete  

一般来说,wmic创建或修改的系统变量不用重启windows生效,但如果你发现在DOS窗下检测不生效的话,你试着关闭 DOS窗,再检测一次.就生效了.

如果你的批处理想不关闭而直接让新的变量给下级程序应用可以这样写

 

  1. ::检查path中有没有e:\tools(有就跳到run,没有就接着执行)  
  2. echo %path%|findstr /i "e:\tools"&&(goto run)  
  3.   
  4. ::先添加,防止没有时修改出错  
  5. wmic ENVIRONMENT create name="path",VariableValue="e:\tools;%path%"  
  6. ::再修改,防止已有时添加出错  
  7. wmic ENVIRONMENT where "name=’path’ and username='<system>’" set VariableValue="e:\tools;%path%"  
  8. ::再即时应用  
  9. set "path=e:\tools;%path%"  
  10.   
  11. :run  
  12. start 程序.exe  

第三方工具可以使用Windows2003系统下的Setx.exe

命令行使用:setx 参数 值 -m

setx path "C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem" -m

不用重启应用环境变量,免重启,即时环境变量,修改环境变量,添加环境变量,系统环境向下传递,即时应用,免重启的方法