第一个字节 0x81-0xfe 第二个字节 0x40-0xfe
第一個位元組 0x81-0xfe 第二個位元組 0x40-0xfe
2009年4月8日星期三
2009年2月10日星期二
纯真IP地址查询库
以下是PHP版本,有2个问题需要注意: 1. 每次加载QQWry.Dat文件对内存占用过大,不可接受。 2.由于IP和城市对应关系混乱,所以返回的为某具体地区,比如”复旦某宿舍”。
《纯真IP数据库格式详解》
链接一:http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx
链接二:http://lumaqq.linuxsir.org/article/qqwry_format_detail.html
纯真IP数据库官网:http://www.cz88.net/ip/
纯真IP数据库下载:http://update.cz88.net/soft/qqwry.rar
以下函数conrvertip()位于 Discuz!5_GBK/upload/include/misc.func.php 路径中,有兴趣可以具体去阅读分析。(下面代码我做了简单的修改,更便于阅读,核心没有修改)
以下是Java版实现:
《纯真IP数据库格式详解》
链接一:http://blog.csdn.net/heiyeshuwu/archive/2006/05/12/725675.aspx
链接二:http://lumaqq.linuxsir.org/article/qqwry_format_detail.html
纯真IP数据库官网:http://www.cz88.net/ip/
纯真IP数据库下载:http://update.cz88.net/soft/qqwry.rar
以下函数conrvertip()位于 Discuz!5_GBK/upload/include/misc.func.php 路径中,有兴趣可以具体去阅读分析。(下面代码我做了简单的修改,更便于阅读,核心没有修改)
//===================================
//
// 功能:IP地址获取真实地址函数
// 参数:$ip - IP地址
// 作者:[Discuz!] (C) Comsenz Inc.
//
//===================================
function convertip($ip) {
//IP数据文件路径
$dat_path = 'QQWry.Dat';
//检查IP地址
if(!preg_match("/^d{1,3}.d{1,3}.d{1,3}.d{1,3}$/", $ip)) {
return 'IP Address Error';
}
//打开IP数据文件
if(!$fd = @fopen($dat_path, 'rb')){
return 'IP date file not exists or access denied';
}
//分解IP进行运算,得出整形数
$ip = explode('.', $ip);
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
//获取IP数据索引开始和结束位置
$DataBegin = fread($fd, 4);
$DataEnd = fread($fd, 4);
$ipbegin = implode('', unpack('L', $DataBegin));
if($ipbegin < 0) $ipbegin += pow(2, 32);
$ipend = implode('', unpack('L', $DataEnd));
if($ipend < 0) $ipend += pow(2, 32);
$ipAllNum = ($ipend - $ipbegin) / 7 + 1;
$BeginNum = 0;
$EndNum = $ipAllNum;
//使用二分查找法从索引记录中搜索匹配的IP记录
while($ip1num>$ipNum || $ip2num<$ipNum) {
$Middle= intval(($EndNum + $BeginNum) / 2);
//偏移指针到索引位置读取4个字节
fseek($fd, $ipbegin + 7 * $Middle);
$ipData1 = fread($fd, 4);
if(strlen($ipData1) < 4) {
fclose($fd);
return 'System Error';
}
//提取出来的数据转换成长整形,如果数据是负数则加上2的32次幂
$ip1num = implode('', unpack('L', $ipData1));
if($ip1num < 0) $ip1num += pow(2, 32);
//提取的长整型数大于我们IP地址则修改结束位置进行下一次循环
if($ip1num > $ipNum) {
$EndNum = $Middle;
continue;
}
//取完上一个索引后取下一个索引
$DataSeek = fread($fd, 3);
if(strlen($DataSeek) < 3) {
fclose($fd);
return 'System Error';
}
$DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
fseek($fd, $DataSeek);
$ipData2 = fread($fd, 4);
if(strlen($ipData2) < 4) {
fclose($fd);
return 'System Error';
}
$ip2num = implode('', unpack('L', $ipData2));
if($ip2num < 0) $ip2num += pow(2, 32);
//没找到提示未知
if($ip2num < $ipNum) {
if($Middle == $BeginNum) {
fclose($fd);
return 'Unknown';
}
$BeginNum = $Middle;
}
}
以下是Java版实现:
/**
* 给定一个ip国家地区记录的偏移,返回一个IPLocation结构
* @param offset 国家记录的起始偏移
* @return IPLocation对象
*/
private IPLocation getIPLocation(long offset) {
try {
// 跳过4字节ip
ipFile.seek(offset + 4);
// 读取第一个字节判断是否标志字节
byte b = ipFile.readByte();
if(b == REDIRECT_MODE_1) {
// 读取国家偏移
long countryOffset = readLong3();
// 跳转至偏移处
ipFile.seek(countryOffset);
// 再检查一次标志字节,因为这个时候这个地方仍然可能是个重定向
b = ipFile.readByte();
if(b == REDIRECT_MODE_2) {
loc.country = readString(readLong3());
ipFile.seek(countryOffset + 4);
} else
loc.country = readString(countryOffset);
// 读取地区标志
loc.area = readArea(ipFile.getFilePointer());
} else if(b == REDIRECT_MODE_2) {
loc.country = readString(readLong3());
loc.area = readArea(offset + 8);
} else {
loc.country = readString(ipFile.getFilePointer() - 1);
loc.area = readArea(ipFile.getFilePointer());
}
return loc;
} catch (IOException e) {
return null;
}
}
/**
* 从offset偏移开始解析后面的字节,读出一个地区名
* @param offset 地区记录的起始偏移
* @return 地区名字符串
* @throws IOException 地区名字符串
*/
private String readArea(long offset) throws IOException {
ipFile.seek(offset);
byte b = ipFile.readByte();
if(b == REDIRECT_MODE_1 || b == REDIRECT_MODE_2) {
long areaOffset = readLong3(offset + 1);
if(areaOffset == 0)
return LumaQQ.getString("unknown.area");
else
return readString(areaOffset);
} else
return readString(offset);
}
/**
* 从offset位置读取3个字节为一个long,因为java为big-endian格式,所以没办法
* 用了这么一个函数来做转换
* @param offset 整数的起始偏移
* @return 读取的long值,返回-1表示读取文件失败
*/
private long readLong3(long offset) {
long ret = 0;
try {
ipFile.seek(offset);
ipFile.readFully(b3);
ret |= (b3[0] & 0xFF);
ret |= ((b3[1] << 8) & 0xFF00);
ret |= ((b3[2] << 16) & 0xFF0000);
return ret;
} catch (IOException e) {
return -1;
}
}
/**
* 从当前位置读取3个字节转换成long
* @return 读取的long值,返回-1表示读取文件失败
*/
private long readLong3() {
long ret = 0;
try {
ipFile.readFully(b3);
ret |= (b3[0] & 0xFF);
ret |= ((b3[1] << 8) & 0xFF00);
ret |= ((b3[2] << 16) & 0xFF0000);
return ret;
} catch (IOException e) {
return -1;
}
}
/**
* 从offset偏移处读取一个以0结束的字符串
* @param offset 字符串起始偏移
* @return 读取的字符串,出错返回空字符串
*/
private String readString(long offset) {
try {
ipFile.seek(offset);
int i;
for(i = 0, buf[i] = ipFile.readByte(); buf[i] != 0; buf[++i] = ipFile.readByte());
if(i != 0)
return Utils.getString(buf, 0, i, "GBK");
} catch (IOException e) {
log.error(e.getMessage());
}
return "";
}
2009年2月8日星期日
php 简单 下载图片 程序
function getimg($remoteUrl, $savePath, $saveName){
$formats = array('.gif', '.jpg','.png','.bmp');
$extension = strrchr($remoteUrl, '.');
if(!in_array($extension, $formats)) return false;
$fileName = $savePath . $saveName . $extension;
$image = file_get_contents($remoteUrl);
$fp = @fopen($fileName, 'a');
fwrite($fp, $image);
fclose($fp);
return $fileName;
}
2008年12月8日星期一
PHP 从m个数中任取n个数的排列组合算法
从m个数中任取n个数的排列组合算法!
加添一个快上N倍的算法:
再提供一下比快 N倍更快十倍的方法:
$n = array(1,2,3,4,5,6,7,8,9,10);
//$n = array(1,2,3,4);
/**
$n 数据数组
$m 组合串的长度
$s 用于缓存中间量
**/
function permutation($n, $m = 0, $s = ''){
static $results = array();
if($m == 0) {
$results[] = substr($s,1);//如果长度够了则赋值
}else {
for($i=0; $i < count($n); $i++) {
//echo "==$i===>".$s."\n";
permutation($n, $m-1, $s.','.$n[$i]);
}
}
return $results;
}
$t1 = microtime(true);
$rst = permutation($n, 2);
echo microtime(true) - $t1 ."\n";
//print_r($rst);
//////////////////
function combination($params){
foreach($params as $key => $val) {
$tmpArr = explode(',', $val);
if( 1 == count(array_unique($tmpArr))) {
continue;
}
sort($tmpArr);
$results[] = implode(',', $tmpArr);
}
$results = array_unique($results);
return $results;
}
$s = combination($rst);
print_r($s);
//exit;
function getCombinationCount($n, $k) {
//fscanf(STDIN,"%d,%d",$n,$k);
$r = 1;
while($k) $r *= $n--/$k--;
return $r;
}
echo count($s) . "===========" . getCombinationCount(10, 2);
exit;
加添一个快上N倍的算法:
var_dump(c(range(1,5), 2));
function c($ar,$n){
$c = count($ar);
if ($n>$c) return false; // parameter wrong
if ($c>50) return false; // too big array :)
$r = array();
$code = "";
$list = array();
for($i=1;$i<=$n;$i++){
$list[] = '$v'.$i;
$code .= 'foreach($ar as $k'.$i.'=>$v'.$i.'){';
if($i!=$n) $code .= 'unset($ar[$k'.$i.']);';
}
$code .= '$t = array('.join(',',$list).');';
$code .= 'sort($t);';
$code .= '$r[] = join(",",$t);';
for($i=$n-1;$i>0;$i--){
$code .= '}$ar[$k'.$i.']=$v'.$i.';';
}
$code .= '}';
/*
foreach($ar as $k1=>$v1){
unset($ar[$k1]);
foreach($ar as $k2=>$v2){
unset($ar[$k2]);
foreach($ar as $k3=>$v3){
$t = array($v1,$v2,$v3);
sort($t);
$r[] = join(',',$t);
}
$ar[$k2] = $v2;
}
$ar[$k1] = $v1;
}
*/
eval($code);
return array_values(array_unique($r));
}
再提供一下比快 N倍更快十倍的方法:
function array_combination(array $elements, $chosen)
{
$result = array();
for ($i = 0; $i < $chosen; $i++) { $vecm[$i] = $i; }
for ($i = 0; $i < $chosen-1; $i++) { $vecb[$i] = $i; }
$vecb[$chosen - 1] = count($elements) - 1;
$result[] = $vecm;
$mark = $chosen - 1;
while (true) {
if ($mark == 0) {
$vecm[0]++;
$result[] = $vecm;
if ($vecm[0] == $vecb[0]) {
for ($i = 1; $i < $chosen; $i++) {
if ($vecm[$i] < $vecb[$i]) {
$mark = $i;
break;
}
}
if (($i == $chosen) && ($vecm[$chosen - 1] == $vecb[$chosen - 1])) { break; }
}
} else {
$vecm[$mark]++;
$mark--;
for ($i = 0; $i <= $mark; $i++) {
$vecb[$i] = $vecm[$i] = $i;
}
$vecb[$mark] = $vecm[$mark + 1] - 1;
$result[] = $vecm;
}
}
return $result;
}
ini_set('memory_limit', '328M');
$n = 640 ; $m =2; $elements = range(1, $n);
$begin = microtime(TRUE);
$result = array_combination($elements, $m);
$end = microtime(TRUE);
echo "count: ".count($result) . PHP_EOL;
echo "time: ". 1000*($end-$begin) . " ms" . PHP_EOL;
echo '';
//print_r($result);
echo '
';
/* output result
foreach($result as $indexes) {
foreach ($indexes as $index) {
echo $elements[$index] . "\t";
}
echo PHP_EOL;
}
*/
2008年11月13日星期四
上载文件表单的实现 -- 实例
<html><head>
<title>上载文件表单</title></head>
<body>
<form enctype="multipart/form-data" action="" method="post">
请选择文件: <br>
<input name="upload_file" type="file"><br>
<input type="submit" value="上传文件">
</form>
</body>
</html>
<?
$upload_file=$_FILES['upload_file']['tmp_name'];
$upload_file_name=$_FILES['upload_file']['name'];
if($upload_file){
$file_size_max = 1000*1000; // 1M限制文件上传最大容量(bytes)
$store_dir = "d:/"; // 上传文件的储存位置
$accept_overwrite = 1; //是否允许覆盖相同文件
// 检查文件大小
if ($upload_file_size > $file_size_max) {
echo "对不起,你的文件容量大于规定";
exit;
}
// 检查读写文件
if (file_exists($store_dir . $upload_file_name) && !$accept_overwrite) {
echo "存在相同文件名的文件";
exit;
}
//复制文件到指定目录
if (!move_uploaded_file($upload_file,$store_dir.$upload_file_name)) {
echo "复制文件失败";
exit;
}
}
//客户端机器文件的原名称。
echo "<p>你上传了文件:" . $_FILES['upload_file']['name'] .'<br>';
//文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。
echo "文件的 MIME 类型为:" . $_FILES['upload_file']['type'] . '<br>';
//已上传文件的大小,单位为字节。
echo "上传文件大小:" . $_FILES['upload_file']['size'] . '<br>';
//文件被上传后在服务端储存的临时文件名。
echo "文件上传后被临时储存为:" . $_FILES['upload_file']['tmp_name'] . '<br>';
print_r($_FILES['upload_file']);
$Erroe=$_FILES['upload_file']['error'];
switch($Erroe){
case 0:
echo "上传成功"; break;
case 1:
echo "上传的文件超过了 php.ini 中 upload_max_filesize 选项限制的值."; break;
case 2:
echo "上传文件的大小超过了 HTML 表单中 MAX_FILE_SIZE 选项指定的值。"; break;
case 3:
echo "文件只有部分被上传";break;
case 4:
echo "没有文件被上传";break;
}
?>
如果使用 Curl 实现远程请求 实例
下面一个实例子,希望对大家有所帮助:
也可参考另一文章:curl_setopt($ch, CURLOPT_RETURNTRANSFER,1) 使用
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL , 'ghxter.blogbot.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER , 1);
curl_setopt($ch, CURLOPT_TIMEOUT , 5);
curl_setopt($ch, CURLOPT_USERAGENT , $_SERVER['HTTP_USER_AGENT']);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
var_dump($info);
var_dump($response)
?>
也可参考另一文章:curl_setopt($ch, CURLOPT_RETURNTRANSFER,1) 使用
2008年11月8日星期六
PHP 纯粹分页类 超强 超好用 有范例
<?php
class Pager {
private $_perPage; //每一页记录数
private $_totalItems; //总记录数
private $_totalPages; //总共页数
private $_currentPage; // 当前页序号
private $_listStart; //当前头条记录ID
private $_listEnd; //当前最后条记录ID
private $_pageStart; //第一页
private $_pageEnd; //最后页
private $_listPage; //循环显示当前分页列表
private $_listItems; //循环显示当前分页列表条数
private $_pageData; //当前要显示的记录
private $_linkData; //页面传递的变量
private $_startId; //从数据库读出的启始id
public function __construct($totalItems, $perPage, $linkData){
$this->_listItems = 11;
$this->_currentPage = max((int)$_REQUEST['pageId'], 1); //当前的页序号
$this->_perPage = $perPage; //每一页记录数
$this->_totalItems = $totalItems; //总记录数
$this->_totalPages = ceil($totalItems / $perPage); //总页数
$this->_listStart = ($this->_currentPage - 1) * $perPage + 1; //当前头条记录ID
$this->_listEnd = ($this->_currentPage != $this->_totalPages) ? $this->_currentPage * $perPage : $totalItems;//当前最后条记录ID
$this->_startId = $this->_listStart; //从数据库读出的启始id
$this->_linkData = $_SERVER['PHP_SELF'] . $linkData; //传递的变量
}
public function startId(){ //从数据库读出的启始id
return $this->_startId;
}
public function totalItems(){ //总记录数
return $this->_totalItems;
}
public function totalPages(){ //总页数
return $this->_totalPages;
}
public function listStart(){ //当前头条记录ID
return $this->_listStart;
}
public function listEnd(){ //当前最后条记录ID
return $this->_listEnd;
}
public function currentPage(){ //当前页
return $this->_currentPage;
}
public function linkData() { //传递的变量
return $this->_linkData;
}
public function pageStart(){ //第一页
return $this ->_pageStart = '<a href="'.$this->_linkData.'&pageId=1"><FONT title="首页" face="webdings">9</FONT></a>';
}
public function pageEnd(){ //最后页
return $this ->_pageEnd = "<a href=".$this->_linkData."&pageId=".$this->_totalPages."><FONT title=尾页 face=webdings>:</FONT></a>";
}
public function upPage(){ //上一页
$upPage = '';
if($this->_currentPage > 1 && $this->_currentPage <= $this->_totalPages){
$up = $this->_currentPage-1;
$upPage = "<a href=".$this->_linkData."&pageId=".$up."><FONT title=上页 face=webdings>7</FONT></a>";
}
return $upPage;
}
public function downPage(){ //下一页
$downPage = '';
$down = $this->_currentPage+1;
if($this->_currentPage < $this->_totalPages) {
$downPage = "<a href=".$this->_linkData."&pageId=".$down."><FONT title=下页 face=webdings>8</FONT></a>";
}
return $downPage;
}
public function listPage(){ //循环显示当前分页列表
$middlePage = ceil($this->_listItems/2);
if($this->_currentPage <= $middlePage && $this->_currentPage != ""){ //当前页面小于等于中间页,
$start = 1 ;
if($this->_totalPages < $this->_listItems) { $end = $this->_totalPages; }
else {$end = $this->_listItems;}
}elseif(($this->_currentPage + $middlePage) > $this->_totalPages){ // 中间到最后页之间
if($this->_totalPages < $this->_listItems) { $start = 1 ; }
else { $start = $this->_totalPages - $this->_listItems + 1; }
$end = $this->_totalPages;
}else{
$start = $this->_currentPage - $middlePage + 1 ;
$end = $this->_currentPage + $middlePage - 1 ;
}
// 显示列表
for($i = $start; $i <= $end; $i++){
if ($this->_currentPage == $i) { $this->_listPage .= "<strong> ".$i." </strong> "; }
else { $this->_listPage .= "<a href=".$this->_linkData."&pageId=".$i.">".$i."</a> "; }
}
return $this->_listPage;
}
public function jumpPage(){
$jumpPage = '<div><select name="pageId" onchange="location=\''.$this->_linkData.'&pageId=\'+this.value;">'; //页面跳转
for($i = 1; $i <= $this->_totalPages; $i++){
if($i == $this->_currentPage) $selected = ' selected';
$jumpPage .= '<option value="' . $i .'" '.$selected.'>'.$i.'</option>';
unset($selected);
}
return $jumpPage .= '</select> 页</div>';
}
}
///范例
$totalItems = 100; //总记录
$perPage = 7;
$page = new Pager($totalItems, $perPage ,"?a=b&c=6");
//for($i = $page->startId(); $i <= $page->startId() + $perPage; $i++){
for($i = $page->startId(); $i <= $page->listEnd(); $i++){
$data[] = array($i,$i+1);
}
echo "当前开始ID:".$listStart = $page->listStart();echo "<br>";
echo "当前结束ID:".$listEnd = $page->listEnd();echo "<br>";
echo "第一页:".$pageStart = $page->pageStart();echo "<br>";
echo "最后页:".$pageEnd = $page->pageEnd();echo "<br>";
echo "上一页:".$upPage = $page->upPage();echo "<br>";
echo "下一页:".$downPage = $page->downPage();echo "<br>";
echo "列表显示:".$listPage = $page->listPage();echo "<br>";
echo "跳转页:".$jumpPage = $page->jumpPage();echo "<br>";
//echo $page->linkData();
//print_r($data);
echo "<table border=1 width=100><tr><td align=center>N</td><td align=center>N+1</td></tr>";
foreach ($data as $key0 => $value0) {
echo "<tr>";
foreach ($value0 as $key1 => $value1) {
echo "<td align=center>$value1</td>";
}
echo "</tr>";
}
echo "</table>";
?>
2008年11月6日星期四
$_SERVER['SCRIPT_NAME'] 与 $_SERVER['PHP_SELF'] 有什么区别?
首先看一下手册:
“PHP_SELF”
当前正在执行脚本的文件名,与 document root 相关。举例来说,在 URL 地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。 如果 PHP 以命令行方式运行,该变量在 PHP 4.3.0 之前无效。
“SCRIPT_NAME”
包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。
用个例子比较容易理解:
其中(/abc.php) 它是不存在的.
另外还有一个,我没有测试过:
“PHP_SELF”
当前正在执行脚本的文件名,与 document root 相关。举例来说,在 URL 地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。 如果 PHP 以命令行方式运行,该变量在 PHP 4.3.0 之前无效。
“SCRIPT_NAME”
包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。
用个例子比较容易理解:
http://127.0.0.1/test/scripts/phpinfo.php/abc.php?sourc=asdfa&sadf-asdf=asdf
_SERVER["SCRIPT_NAME"] /shopping/scripts/phpinfo.php
_SERVER["PHP_SELF"] /shopping/scripts/phpinfo.php/abc.php
其中(/abc.php) 它是不存在的.
另外还有一个,我没有测试过:
通常在本机测试 $_SERVER['SCRIPT_NAME'] 跟 $_SERVER['PHP_SELF'] 大概看不出有什么不同,但是放到某些虚拟主机上就不一样了.
以 DreamHost 上的 PHP 是以 CGI 方式执行,二者就有明显不同的差异。
echo $_SERVER['SCRIPT_NAME']; // 输出/cgi-system/php.cgi
echo $_SERVER['PHP_SELF']; // 输出 /admin/gg.php
看出有什么不同了吧? ^^
注意$_SERVER['PHP_SELF']可能引起的跨站攻击.
通常我们使用
来获得当前运行脚本的路径。但是在做一些URL拼合的过程中可能引发XSS跨站攻击。
示例:
触发方式:http://localhost/script.php/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E
解决方法:
注解:使用http://localhost/script.php/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E执行脚本时,$_SERVER['SCRIPT_NAME']值为/script.php,未包含恶意的脚本。另外,即使最终使用的是$_SERVER['PHP_SELF']的值,也会被htmlspecialchars转义。
资料来源:http://www.sebug.net/vulndb/2748
$PHP_SELF = $_SERVER['PHP_SELF'] ? $_SERVER['PHP_SELF'] : $_SERVER['SCRIPT_NAME'];
来获得当前运行脚本的路径。但是在做一些URL拼合的过程中可能引发XSS跨站攻击。
示例:
<?php
$PHP_SELF = $_SERVER['PHP_SELF'] ? $_SERVER["PHP_SELF"] : $_SERVER["SCRIPT_NAME"];
echo '<a href="' . $PHP_SELF . '">aaa</a>';
触发方式:http://localhost/script.php/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E
解决方法:
$_SERVER['SCRIPT_NAME'] ? $_SERVER["SCRIPT_NAME"] : htmlspecialchars($_SERVER["PHP_SELF"]);
注解:使用http://localhost/script.php/%22%3E%3Cscript%3Ealert('lib3rt3')%3C/script%3E执行脚本时,$_SERVER['SCRIPT_NAME']值为/script.php,未包含恶意的脚本。另外,即使最终使用的是$_SERVER['PHP_SELF']的值,也会被htmlspecialchars转义。
资料来源:http://www.sebug.net/vulndb/2748
2008年10月31日星期五
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1) 使用
使用方法如下:
解说一下其中库什么使用:CURLOPT_RETURNTRANSFER 选项:
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
如果成功只将结果返回,不自动输出任何内容。
如果失败返回FALSE
curl_setopt($ch, CURLOPT_RETURNTRANSFER,0); 或着不使用这个选项:
如果成功只返回TRUE,自动输出返回的内容。
如果失败返回FALSE
function getXmlContent($requestUri) {
$agent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$timeout = 10;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $requestUri);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
$response = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
return $response;
}
解说一下其中库什么使用:CURLOPT_RETURNTRANSFER 选项:
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
如果成功只将结果返回,不自动输出任何内容。
如果失败返回FALSE
curl_setopt($ch, CURLOPT_RETURNTRANSFER,0); 或着不使用这个选项:
如果成功只返回TRUE,自动输出返回的内容。
如果失败返回FALSE
2008年10月25日星期六
Zend Framword 下载地址
Zend Framwork Scriptsdwonloads:
http://framework.zend.com/download/latest
ZendFramwork Document dwonloads:
http://framework.zend.com/download/latest
http://framework.zend.com/download/latest
ZendFramwork Document dwonloads:
http://framework.zend.com/download/latest
zend studio 6.1 下载 注册码
zend studio 6.1 官方http下载地址:
令我略微感到有些担忧的是,Zend Studio的独立版本就到5.5.1终结了么?
同以往的版本一样,Zend Studio For Eclipse 6.1版本依然拥有3个发行包,分别适用于mac osx,windows,linux操作系统。
1、适用于Mac_OS_X的DMG安装格式
http://downloads.zend.com/studio-eclipse/6.1.0/ZendStudioForEclipse-6.1.0.dmg
2、适用于windows的EXE安装格式
http://downloads.zend.com/studio-eclipse/6.1.0/ZendStudioForEclipse-6_1_0.exe
3、适用于linux的GZ、zip安装格式
http://downloads.zend.com/studio-eclipse/6.1.0/ZendStudioForEclipse-6_1_0.tar.gz
注册机,keymaker,keygen看这里:
Zend Studio 6.x 在线注册机
大家也可以使用下面的注册码:
User: rock_guo
Key: DC4EE431286666810000
令我略微感到有些担忧的是,Zend Studio的独立版本就到5.5.1终结了么?
同以往的版本一样,Zend Studio For Eclipse 6.1版本依然拥有3个发行包,分别适用于mac osx,windows,linux操作系统。
1、适用于Mac_OS_X的DMG安装格式
http://downloads.zend.com/studio-eclipse/6.1.0/ZendStudioForEclipse-6.1.0.dmg
2、适用于windows的EXE安装格式
http://downloads.zend.com/studio-eclipse/6.1.0/ZendStudioForEclipse-6_1_0.exe
3、适用于linux的GZ、zip安装格式
http://downloads.zend.com/studio-eclipse/6.1.0/ZendStudioForEclipse-6_1_0.tar.gz
注册机,keymaker,keygen看这里:
Zend Studio 6.x 在线注册机
大家也可以使用下面的注册码:
User: rock_guo
Key: DC4EE431286666810000
2008年10月17日星期五
CSS中position的absolute和relative的应用
之前老弄不明白,只能凭借一点短期内“虐出来的经验”制作需要的效果,后来仔细研究了一下Hutia的XScroller,并且仔细看了文档,才知道这个position属性其实是指本体对上级的定位。如果这么理解,就好办了。
默认的属性值都是static,静态。就不用多说了。最关键的是
relative(相对)以及absolute(绝对)。
往往我们如果是COPY别人的代码,会把absolute属性与left、top配合起来制作相关的“悬浮层”效果。然而有时候我们需要针对某一个容器的悬浮效果,而不是针对窗口的。这时候通过高度、宽度的计算不但麻烦,而且几乎无法完美实现效果。我一开始也无能为力,后来发现只要把其上一级的样式属性 position设置为relative就可以了。
也就是说,position的属性值的效果,直接受其容器样式中position属性值影响。
例如如下A-B的嵌套结构
当A的position为relative时,B的position为absolute才有效。这时候left:0、top:0就不再针对窗口文档,而是针对id为A的这个div了。
这样在开发一些基于B/S应用程序的时候,就能很方便的添加一些UI元素,例如某一个活动层的关闭按钮等。
本文来自:http://www.awflasher.com/blog/archives/731
默认的属性值都是static,静态。就不用多说了。最关键的是
relative(相对)以及absolute(绝对)。
往往我们如果是COPY别人的代码,会把absolute属性与left、top配合起来制作相关的“悬浮层”效果。然而有时候我们需要针对某一个容器的悬浮效果,而不是针对窗口的。这时候通过高度、宽度的计算不但麻烦,而且几乎无法完美实现效果。我一开始也无能为力,后来发现只要把其上一级的样式属性 position设置为relative就可以了。
也就是说,position的属性值的效果,直接受其容器样式中position属性值影响。
例如如下A-B的嵌套结构
<div id="A">
<div id="B">
</div>
</div>
当A的position为relative时,B的position为absolute才有效。这时候left:0、top:0就不再针对窗口文档,而是针对id为A的这个div了。
这样在开发一些基于B/S应用程序的时候,就能很方便的添加一些UI元素,例如某一个活动层的关闭按钮等。
本文来自:http://www.awflasher.com/blog/archives/731
2008年10月11日星期六
最新版本 PHP CHM 中文手册/英文手册 (081011整合)
PHP手册之整合最新评论CHM版 (HonestQiao 整合)
最新版本:php_manual_zh.docs.chm.20080319(因官方原因暂停更新)
下载地址:http://smarttemplate.yi.org/phpdocs/php_manual_zh.docs.chm(下载后请从鼠标右键查看属性解锁)
最新EN版本:php_manual_en.docs.chm.20081011 (HonestQiao 整合)
>>>>>下载地址:暂时没有找到空间可以存放,如果有谁想的话,可以留言我发到大家邮箱。
HonestQiao 整合特点:
*最新的帮助内容javascript:void(0)
*最新的评论信息
*每周自动下载最新帮助内容和评论信息打包为CHM
*所有内容聚集于一个CHM文件
*接受建议改进,方便大家为己任
最新版本:php_manual_zh.docs.chm.20080319(因官方原因暂停更新)
下载地址:http://smarttemplate.yi.org/phpdocs/php_manual_zh.docs.chm(下载后请从鼠标右键查看属性解锁)
最新EN版本:php_manual_en.docs.chm.20081011 (HonestQiao 整合)
>>>>>下载地址:暂时没有找到空间可以存放,如果有谁想的话,可以留言我发到大家邮箱。
HonestQiao 整合特点:
*最新的帮助内容javascript:void(0)
*最新的评论信息
*每周自动下载最新帮助内容和评论信息打包为CHM
*所有内容聚集于一个CHM文件
*接受建议改进,方便大家为己任
2008年10月8日星期三
PHP 路径定义好习惯
定义和路径,目录相关的常量时:
好习惯:
_PATH 最后以 DIRECTORY_SEPARATOR 结尾。
EG: define('ROOT_PATH', dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR);
_DIR 最后不用 . DIRECTORY_SEPARATOR结尾。
EG: define('ROOT_DIR', dirname(dirname(__FILE__));
好习惯:
_PATH 最后以 DIRECTORY_SEPARATOR 结尾。
EG: define('ROOT_PATH', dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR);
_DIR 最后不用 . DIRECTORY_SEPARATOR结尾。
EG: define('ROOT_DIR', dirname(dirname(__FILE__));
2008年9月20日星期六
PHP 能做什么?
PHP 能做任何事情,PHP主要用服务器端的脚本程序,因此可以用PHP来完成其它任何CGI程序完成的工作。 比如:收集表单数据,生成动态网页,发送/接收COOKIE,等等。PHP的功能不仅限于这些,还有其它好多功能。
PHP脚本主要用于下面三大领域:
1、服务端脚本
2、命令行脚本
3、编写桌面应用程序
服务端脚本。这是 PHP 最传统,也是最主要的目标领域。开展这项工作需要具备以下三点:PHP 解析器(CGI 或者服务器模块)、web 服务器和 web 浏览器。需要在运行 web 服务器时,安装并配置 PHP,然后,可以用 web 浏览器来访问 PHP 程序的输出,即浏览服务端的 PHP 页面。如果只是实验 PHP 编程,所有的这些都可以运行在自己家里的电脑中。请查阅安装一章以获取更多信息。
命令行脚本。可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它。通过这种方式,仅仅只需要 PHP 解析器来执行。这种用法对于依赖 cron(Unix 或者 Linux 环境)或者 Task Scheduler(Windows 环境)的日常运行的脚本来说是理想的选择。这些脚本也可以用来处理简单的文本。请参阅 PHP 的命令行模式以获取更多信息。
编写桌面应用程序。对于有着图形界面的桌面应用程序来说,PHP 或许不是一种最好的语言,但是如果用户非常精通 PHP,并且希望在客户端应用程序中使用 PHP 的一些高级特性,可以利用 PHP-GTK 来编写这些程序。用这种方法,还可以编写跨平台的应用程序。PHP-GTK 是 PHP 的一个扩展,在通常发布的 PHP 包中并不包含它。如果对 PHP-GTK 感兴趣,请访问其» 网站以获取更多信息。
PHP 能够用在所有的主流操作系统上,包括 Linux、Unix 的各种变种(包括 HP-UX、Solaris 和 OpenBSD)、Microsoft Windows、Mac OS X、RISC OS 等。今天,PHP已经支持了大多数的 web 服务器,包括 Apache、Microsoft Internet Information Server(IIS)、Personal web Server(PWS)、Netscape 以及 iPlant server、Oreilly Website Pro Server、Caudium、Xitami、OmniHTTPd 等。对于大多数的服务器,PHP 提供了一个模块;还有一些 PHP 支持 CGI 标准,使得 PHP 能够作为 CGI 处理器来工作。
综上所述,使用 PHP,可以自由地选择操作系统和 web 服务器。同时,还可以在开发时选择使用面对过程和面对对象,或者两者混和的方式来开发。尽管 PHP 4 不支持 OOP 所有的标准,但很多代码仓库和大型的应用程序(包括 PEAR 库)仅使用 OOP 代码来开发。PHP 5 弥补了 PHP 4 的这一弱点,引入了完全的对象模型。
使用 PHP,并不局限于输出 HTML。PHP 还能被用来动态输出图像、PDF 文件甚至 Flash 动画(使用 libswf 和 Ming)。还能够非常简便的输出文本,例如 XHTML 以及任何其它形式的 XML 文件。PHP 能够自动生成这些文件,在服务端开辟出一块动态内容的缓存,可以直接把它们打印出来,或者将它们存储到文件系统中。
PHP 最强大最显著的特性之一,是它支持很大范围的数据库。用户会发现利用 PHP 编写数据库支持的网页简单得难以置信。目前,PHP 支持如下数据库:
Adabas D
dBase
Empress
FilePro(只读)
Hyperwave
IBM DB2
Informix
Ingres
InterBase
FrontBase
mSQL
Direct MS-SQL
MySQL
ODBC
Oracle(OCI7 和 OCI8)
Ovrimos
PostgreSQL
SQLite
Solid
Sybase
Velocis
Unix dbm
同时还有一个叫做 PDO 的数据库抽象扩展库使得可以自由地使用该扩展库支持的任何数据库。另外,PHP 还支持 ODBC,即 Open Database Connection Standard(开放数据库连接标准),因此可以连接任何其它支持该世界标准的数据库。
PHP 还支持利用诸如 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows 环境)等不计其数的协议的服务。还可以开放原始网络端口,使得任何其它的协议能够协同工作。PHP 支持和所有 web 开发语言之间的 WDDX 复杂数据交换。关于相互连接,PHP 已经支持了对 Java 对象的即时连接,并且可以将他们自由的用作 PHP 对象。甚至可以用我们的 CORBA 扩展库来访问远程对象。
PHP 具有极其有效的文本处理特性,支持从 POSIX 扩展或者 Perl 正则表达式到 XML 文档解析。为了解析和访问 XML 文档,PHP 4 支持 SAX 和 DOM 标准,也可以使用 XSLT 扩展库来转换 XML 文档。PHP 5 基于强健的 libxm2 标准化了所有的 XML 扩展,并添加了 SimpleXML 和 XMLReader 支持,扩展了其在 XML 方面的功能。
另外,还有很多其它有趣的扩展库。例如 mnoGoSearch 搜索引擎函数、IRC 网关函数、多种压缩工具(gzip、bz2、zip)、日历转换、翻译……
由于在这里无法列出 PHP 所有的特性和可提供的便利,请参阅安装以及函数参考有关章节以获取关于这里提到的扩展库更多的信息。
PHP脚本主要用于下面三大领域:
1、服务端脚本
2、命令行脚本
3、编写桌面应用程序
服务端脚本。这是 PHP 最传统,也是最主要的目标领域。开展这项工作需要具备以下三点:PHP 解析器(CGI 或者服务器模块)、web 服务器和 web 浏览器。需要在运行 web 服务器时,安装并配置 PHP,然后,可以用 web 浏览器来访问 PHP 程序的输出,即浏览服务端的 PHP 页面。如果只是实验 PHP 编程,所有的这些都可以运行在自己家里的电脑中。请查阅安装一章以获取更多信息。
命令行脚本。可以编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它。通过这种方式,仅仅只需要 PHP 解析器来执行。这种用法对于依赖 cron(Unix 或者 Linux 环境)或者 Task Scheduler(Windows 环境)的日常运行的脚本来说是理想的选择。这些脚本也可以用来处理简单的文本。请参阅 PHP 的命令行模式以获取更多信息。
编写桌面应用程序。对于有着图形界面的桌面应用程序来说,PHP 或许不是一种最好的语言,但是如果用户非常精通 PHP,并且希望在客户端应用程序中使用 PHP 的一些高级特性,可以利用 PHP-GTK 来编写这些程序。用这种方法,还可以编写跨平台的应用程序。PHP-GTK 是 PHP 的一个扩展,在通常发布的 PHP 包中并不包含它。如果对 PHP-GTK 感兴趣,请访问其» 网站以获取更多信息。
PHP 能够用在所有的主流操作系统上,包括 Linux、Unix 的各种变种(包括 HP-UX、Solaris 和 OpenBSD)、Microsoft Windows、Mac OS X、RISC OS 等。今天,PHP已经支持了大多数的 web 服务器,包括 Apache、Microsoft Internet Information Server(IIS)、Personal web Server(PWS)、Netscape 以及 iPlant server、Oreilly Website Pro Server、Caudium、Xitami、OmniHTTPd 等。对于大多数的服务器,PHP 提供了一个模块;还有一些 PHP 支持 CGI 标准,使得 PHP 能够作为 CGI 处理器来工作。
综上所述,使用 PHP,可以自由地选择操作系统和 web 服务器。同时,还可以在开发时选择使用面对过程和面对对象,或者两者混和的方式来开发。尽管 PHP 4 不支持 OOP 所有的标准,但很多代码仓库和大型的应用程序(包括 PEAR 库)仅使用 OOP 代码来开发。PHP 5 弥补了 PHP 4 的这一弱点,引入了完全的对象模型。
使用 PHP,并不局限于输出 HTML。PHP 还能被用来动态输出图像、PDF 文件甚至 Flash 动画(使用 libswf 和 Ming)。还能够非常简便的输出文本,例如 XHTML 以及任何其它形式的 XML 文件。PHP 能够自动生成这些文件,在服务端开辟出一块动态内容的缓存,可以直接把它们打印出来,或者将它们存储到文件系统中。
PHP 最强大最显著的特性之一,是它支持很大范围的数据库。用户会发现利用 PHP 编写数据库支持的网页简单得难以置信。目前,PHP 支持如下数据库:
Adabas D
dBase
Empress
FilePro(只读)
Hyperwave
IBM DB2
Informix
Ingres
InterBase
FrontBase
mSQL
Direct MS-SQL
MySQL
ODBC
Oracle(OCI7 和 OCI8)
Ovrimos
PostgreSQL
SQLite
Solid
Sybase
Velocis
Unix dbm
同时还有一个叫做 PDO 的数据库抽象扩展库使得可以自由地使用该扩展库支持的任何数据库。另外,PHP 还支持 ODBC,即 Open Database Connection Standard(开放数据库连接标准),因此可以连接任何其它支持该世界标准的数据库。
PHP 还支持利用诸如 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows 环境)等不计其数的协议的服务。还可以开放原始网络端口,使得任何其它的协议能够协同工作。PHP 支持和所有 web 开发语言之间的 WDDX 复杂数据交换。关于相互连接,PHP 已经支持了对 Java 对象的即时连接,并且可以将他们自由的用作 PHP 对象。甚至可以用我们的 CORBA 扩展库来访问远程对象。
PHP 具有极其有效的文本处理特性,支持从 POSIX 扩展或者 Perl 正则表达式到 XML 文档解析。为了解析和访问 XML 文档,PHP 4 支持 SAX 和 DOM 标准,也可以使用 XSLT 扩展库来转换 XML 文档。PHP 5 基于强健的 libxm2 标准化了所有的 XML 扩展,并添加了 SimpleXML 和 XMLReader 支持,扩展了其在 XML 方面的功能。
另外,还有很多其它有趣的扩展库。例如 mnoGoSearch 搜索引擎函数、IRC 网关函数、多种压缩工具(gzip、bz2、zip)、日历转换、翻译……
由于在这里无法列出 PHP 所有的特性和可提供的便利,请参阅安装以及函数参考有关章节以获取关于这里提到的扩展库更多的信息。
订阅:
博文 (Atom)