易栈网-膘叔

浏览模式: 标准 | 列表 | 图文

Linux关机命令 shutdown命令

LINUX的关机与WINDOWS不一样,不能象WIN那样强关,如果强关可能会导致一些数据丢失,所以。。。

shutdown
1.作用
shutdown命令的作用是关闭计算机,它的使用权限是超级用户。

2.格式
shutdown [-h][-i][-k][-m][-t]

3.重要参数
-t:在改变到其它运行级别之前,告诉init程序多久以后关机。
-k:并不真正关机,只是送警告信号给每位登录者。
-h:关机后关闭电源。
-c:cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数,但是可以输入一个用来解释的讯息,而这信息把会送到每位使用者。
-F:在重启计算机时强迫fsck。
-time:设定关机前的时间。
-m: 把系统改为单用户模式。
-i:关机时显示系统信息。

4.命令说明
shutdown 命令可以安全地把系统关机。有些用户会使用直接断掉电源的方式来关闭Linux系统,这是十分危险的。因为Linux与Windows不同,其后台运行着 许多进程,所以强制关机可能会导致进程的数据丢失,使系统处于不稳定的状态,甚至在有的系统中会损坏硬件设备(硬盘)。在系统关机前使用 shutdown命令,系统管理员会通知所有登录的用户系统把要关闭,并且login指令会被冻结,即新的用户不能再登录。

pktmandy:php ajax开发中的字符集

pktmandy:php ajax开发中的字符集

最近在作一个uchome的小应用(只有两个input),为了增加体验要用到ajax,结果一折腾就是好几天,光调字符集问题就花了两天,以 前写asp,jsp时从来没费这么大劲.由于DW3中的default encoding没有GBK选项,用UTF-8写到库里是乱码,只能用GB2312.ajax总是在参数是中文时返回错误的结果(MySQL的 Connection是GBK,php页面用的是GB2312;header,meta,ajax的setRequestHeader也是 GB2312).
1.GBK和GB2312的不同
用FireFox的FireBug看到参数发送时是乱码,但在被请求页中返回的请求参数是正常的!就没有往字符集上想.就理所认为GBK ==GB2312,我从MSDN上看到的也验证了这个结果。让我们一起去看看:
8b50fae6afae6ea157b6c9fdbec7fbd8
b0f0c10ac63100d18aacccb59b43b536
折腾了2个多小时没想明白!去搜索一下吧:
以下来自:CSDN:http://blog.csdn.net/gashero/archive/2007/02/17/1511435.aspx

也许大家已经看惯了书上说的GBK是对GB2312的扩充,就是说,GB2312字符集中的所有字符都可以在GBK 字符集中找到。(by gashero)可是最近在一次调试Python爬虫的过程中就发现了一些字符的不同。同时大家也应该注意一些网页的默认编码字符集了。

当时正在分析的一个网页的默认编码字符集是GB2312,其中含有一个符号"·",这个常作为项目符号。在使用 GB2312进行解码时,得到的unicode字符是\u30fb,然后使用系统默认编码GBK进行打印时就提示了编码错误。即字符串"\xa1 \xa4"无法使用GB2312解码为unicode字符后再编码为GBK编码显示。(by gashero)实际测试中只要不会交换编码,那么使用同一种编码进行编码和解码就不会出问题。

后来查找得知,字符\u30fb是一种特殊的unicode字符,是一种不允许显示的字符,所以在GBK编码中就没有它的位置(by gashero)。而字符串"\xa1\xa4"使用GBK解码时得到的是\u00b7。

至此得知,虽然网页的默认编码是GB2312,但是实际上使用的是GBK编码,也使用了一些在GB2312和GBK之间不同的编码字符。所以也就导致了这个错误。

建议以后编程序的时候,遇到默认编码为GB2312的大可以直接使用GBK进行解码为unicode字符串。

明白了,我把所有有关字符集设置的地方都换成:GBK.这时通过FF的FireBug看到的请求参数正常了.问题解决了.

2.都有哪些地方要设置字符集呢?为什么要统一呢?

[原文中作者在此是引用他在csdn中的文字,我将他复制回来了,最后几段代码可看性不强,所以没有贴。。。http://blog.csdn.net/xiaofanku/archive/2008/06/25/2584856.aspx]

最近在学php,由于项目的需要!想在php中用ajax来完成一些体验(减少业务处理的单页压力).发现最近也有一位朋友为此苦恼不已.不废话了!
1.注意几个编码地方
1.1表单所在的网页的:meta
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

1.2XMLHTTPRequest GET的编码
httpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
此处设置不对!responseText会返回empty(没有内容),如果您有FireFox并装有FireBug组件的话,点击状态栏的绿色箭头打开控件面板(非OS的,FireBug的),选中Console会看到Response选项是:
Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (latin1_swedish_ci,COERCIBLE) for operation '=
当然如果是连接数据库的话也可能跟下面的(1.4)有关系.

1.3ajax GET请求的页面(.php)header
header("Content-Type:text/html;charset=UTF-8");

1.4数据连接的编码
mysql_query("SET CHARACTER SET UTF8");

如果你的数据库是GBK的或其它的字符集,为了统一编码还要与以上三个统一起来.下面我的示例用的数据库也是GBK,从昨天开始我一起把它设成:
mysql_query("SET CHARACTER SET GBK");
可还是有时发现会返回空(empty 我用的是ResponseText),千万不要写成UTF-8噢,数据库的字符集是没有中间的"-"

2.如果还是返回空或无效的值

例如:a.html中有表单,a用XMLHTTPRequest和b.php通讯.
首先要保证b.php可以正确运行,例b.php?param=value打印出来的是你期望的值
如果a.html打印b.php返回的结果(ajax)与上面的(单独运行b.php)执行结果有出入.可以删除b.php中的空行试试!我想应该不会出现这种情况,但我有几次作demo删除后和删除前确实有出入

pengyuan xu:把几个任意格式的图片合成一个GIF动画的方法

pengyuan xu:把几个任意格式的图片合成一个GIF动画的方法

一大早pengyuan就和我说了一些用多张图片合并成一个GIF的方案,他使用了我前段时间博客里提到的imagick的组件。

然后把代码贴给我看了一下。
这是他第一次的代码:

<?php
$animation = new Imagick();
$animation->setFormat( "gif" );
for ($i=1; $i<4; $i++) {
$thisimage = new Imagick();
$thisimage->readImage($i.'.png');
$thisimage->setImageFormat( "gif" );
$animation->addImage($thisimage);
$animation->setImageDelay(1000);
}
header( "Content-Type: image/gif" );
echo $animation->getImagesBlob();

然后,他发现图片怎么也没有动,于是有了第二次的代码:

<?php
$image=new Imagick();
$animation = new Imagick(); //建立一个对象。
$animation->setFormat( "gif" ); //设置它的类型。
$delay = 30; //设置播放速度。

for ($i=1; $i<4; $i++) {
$thisimage = new Imagick();
$thisimage->readImage($i.'.jpg'); //我有三个图片分别叫:1.jpg,2.jpg,3.jpg 就是要合成他们三个。
$thisimage->setFormat( "gif" ); //把他们都转成GIF格式。
$animation->addImage($thisimage); //加入到刚才建立的那个gif imagick对象之中。
$animation->setImageDelay( $delay ); //设置好播放速度。
}

header( "Content-Type: image/gif" );
$animation->writeImages("9.gif",true); //文件存储。

在这样的情况下,他发现GIF图片可以动了。看来保存成功了。

根据他写的代码,我作了一个小小的测试:

<?php
$filelist = array(
'1.jpg',
'2.jpg',
'3.jpg'
);

$animation = new Imagick(); //create animation object
$animation->setFormat('gif'); // set file type

foreach ( $filelist as $file ){
$image = new Imagick();
$image->readImage( $file );
$animation->addImage( $image );
$animation->setImageDelay(60);
unset( $image );
}
header( "Content-Type: image/gif" );
echo( $animation->getImagesBlob() );
//$animation->writeImages( time().".gif" ,true );

代码几乎没变,除了在readImage行下面那个setFormat函数去掉了。同样生成了GIF图片,现在我把问题和解决情况和大家说一下,也希望大家少走点弯路吧

1、在animation里设置好setFormat为gif后,其他地方可以不需要设,因为最终都是通过 $animation->addImage 进入载入图片的,所以载进来肯定是GIF了
2、$animation->setImageDelay( 60 ) ,这个设置帧数的设定只能在每次AddImage后才能设定,否则会报错:没有加载图片时不能设定帧数
3、$animation->writeImages函数,不能使用writeImage,因为是多帧的,它会认为是多张图片
4、至于为什么在使用header设定文件头和echo 输出后图片没有动,我目前怀疑这是浏览器的设定关系,因为,你右键点击生成的图片另存下来时,图片是可以正常的跳动的。

解决完毕。感谢pengyuan的代码

另类的想法:用imagick把pdf转成png图片格式

另类的想法:用imagick把pdf转成png图片格式

原文:http://hi.baidu.com/dream621/blog/item/7f60de82781b37b96d81196d.html

/**
* 简单的用imagick把pdf转为png图片,需要调整图片内容大小的改120这个值
* 作者:lazy
* 版权:无,可随意使用.可以的话请保留作者跟出处
* 参数:
* $PDF是pdf的路径,pdf文件要存在否则无法处理
* $Path是要保存的图片路径,注意要有写权限
* 返回值:图片的路径(数组)
* 其它:
* 要加水印啥的请自己添加.
* 怎么安装imagick扩展可以看php手册或者google;
* http://cn2.php.net/manual/en/class.imagick.php

*/
function pdf2png($PDF,$Path){
if(!extension_loaded('imagick')){
return false;
}
if(!file_exists($PDF)){
return false;
}
$IM = new imagick();
$IM->setResolution(120,120);
$IM->setCompressionQuality(100);
$IM->readImage($PDF);
foreach ($IM as $Key => $Var){
$Var->setImageFormat('png');
$Filename = $Path.'/'.md5($Key.time()).'.png';
if($Var->writeImage($Filename) == true){
$Return[] = $Filename;
}
}
return $Return;
}
主要是思路不错就转发了
种玉堂:让代码越变越美

种玉堂:让代码越变越美

本文很长,来自于博客园,并不是说文章内容很有深意,但是因为作者在介绍的时候的step by step,也能让人体会到了代码复用并非全部是用在服务端的OO,对于客户端其实也能够做到OO。

原文网址:http://www.cnblogs.com/KenBlove/archive/2009/03/16/1413746.html

内容摘抄:(太多了,仅摘抄部份原话)

大家都知道,客户端检测不单可以让用户获得更好的体验,而且可以通过校验数据大大减少客户端和服务器端的往返次数,减少服务器负担。在这里,小弟打算回顾一下自己在客户端检测方面的学习历程和采用方法,如果大家有什么更好的方法或者建议,欢迎提出来共享!共同进步!

第一阶段是:续项强写
每个人都基本会经过这个阶段,就是对检测内容每个都手工校验。

第二阶段:集中消灭
相信不少初学者现在还是处于这个阶段,这阶段的同学们已经被第一阶段折磨怕了。很快就想出了集中消灭相同类型检测的方法。就是写检测函数

第三阶段:链式的威力
看着一大堆if else总是心里觉得不舒服,对吧?一串串的又不是羊肉串,虽然不能吃,也要消灭它们!这时候,是Javascript的prototype出场的时候了。通过扩展prototype,可以获得简洁优雅的代码

第四阶段:自定义属性

第五阶段:可配置

作者最后还附上了源码,建议全文查看

DBANOTES:学习 HeroKu 的架构设计

网址:

以上是作者和原文的信息。因为可能会布置一台服务器,所以对这方面就有点想法,作者是在对RUBY方面的架构进行学习和分析,但我想,对于PHP方面,应该也会有参考价值。已经开始有想法转硬件了,哈哈。说说而己……

原文如下:

这几天给我印象比较深的是 HeroKu ,提供 Ruby 快速部署环境并提供托管能力,他们的架构图做得十分漂亮,一幅图胜过千言万语,要是对 Web 架构感兴趣,都别问架构师了,看看 HeroKu 的架构估计就明白个差不多了 :)

概览图

好的架构图是画出来的,好的架构未必是设计出来的,最后架构好不好,还要看持续的改进能力。

HeroKu Overview.jpg


HTTP 反向代理

使用 Nginx , 这一层只进行 HTTP-level 的处理。Nginx 现在是不二选择。

HeroKu Reverse Proxy.jpg


HTTP Cache

对于静态内容,使用 Varnish 进行缓存。如果你在 Squid 和 Varnish 之间作选择,这里已经投了一票。

HeroKu HTTP cache.jpg


路由网(Routing Mesh)

用 Erlang 实现的架构组件,路由寻址,用以提升可用性和扩展性。

HeroKu Routing Mesh.jpg


动态网格(Dyno Grid)

用户部署的代码运行在这里,可以简单看成是应用服务器集群环境,只是粒度更小一点而已。

HeroKu Dyno Grid.jpg

对于 Dyno Grid 的进一步信息:

HeroKu Dyno Grid Arch.jpg

服务器操作系统是 Debian ;Ruby VM 是 MRI ,开源,C 写的;App Server 用的 Thin,他们说 Thin 比 Mongrel 更精炼;Rack,应用服务器接口;Rack 中间件,可选组件;框架,任何 Rack 兼容的都成;最后是客户托管的代码。

数据库

PostgreSQL,也可以采用远程数据库。

HeroKu Database.jpg


Memory Cache

Memcached ,居家旅行架构必备。

HeroKu Memcached.jpg

这几张图看下来,多少算是对 Ruby 环境有了一些感性认识。可以进一步查看 HeroKu 提供的文档,包含了一些代码实现上的准则。

部署是基于 Git 的。不知道大家有没有注意到 Git 在最近一年来的爆发? 超过 SVN 或许不是不可能的。

国内热炒"云计算"的,跟人家学学吧,与其整天帮着客户开发定制软件,还不如给客户提供一些弹性应用托管环境,起码看起来靠谱一些。

HeroKu ,不读 Hero-Ku, 读作 Her-oh-koo, 挺有趣

--EOF--

图的来源:HeroKu Platform Architecture

基于JQUERY制作的仿GOOGLE自动完成插件

基于JQUERY制作的仿GOOGLE自动完成插件

本例子来自博客园,其实关于Autocompleted的例子,用jquery的话,是很多很多,但那都是国外的,难得有国内的例子,看到了就复制回来一份,呵呵

原文:http://www.cnblogs.com/cntlis/archive/2009/03/14/1412144.html

数据采用JSON,格式为{keylist:[{'keyname':关键字1,'keyextend':扩展文字(譬如说结果数目)},{'keyname':关键字2,'keyextend':扩展文字(譬如说结果数目)}]}

/**//*
* jQuery AutoComplete
*
* Author: cntlis
* http://blog.csdn.net/cntlis
*
* Licensed like jQuery, see http://docs.jquery.com/License
*
* 作者:cntlis
* QQ:8112857
*/
$.fn.AutoComplete = function(url,option){
var me= this;
var strKey= $(me).val();
var strKeyBak= "";
var isShow = false;
var doption={
iwidth: '0px', //下拉框的宽度
iLengthLower: 1, //当表单的长度大于iLengthLower小于iLengthUpper时才开始执行搜索
iLengthUpper: 50,
strPara: "Keyword", //变量名称
zIndex: 1, //提示框的Z-INDEX值
hasscroll: 0, //是否出现滚动条0无1有
hasclose: 1, //是否拥有关闭窗口
desfun:function(){}
};

$.extend(doption,option);
var iLengthLower= doption.iLengthLower;
var iLengthUpper= doption.iLengthUpper;
var strPara= doption.strPara;
if ($("#autocomplete").length<1){$("body").append("<div id='autocomplete' class='autocompletefloor'></div>");}
$("#autocomplete").hide();

$(me).keyup(function(e){keysearch(e.keyCode);});
$(me).keydown(function(e){LineSelect(e.keyCode);});
$(me).bind("blur",function(){
strKeyBak= $("#autocomplete ul .selected .keyname").text(); //为click事件增加处理
if (strKeyBak.length>0 && strKeyBak!=$(me).val()){
$(me).val(strKeyBak);
doption.desfun();
};
floorHide();
});

var encode=function(v){//如果包含中文就escape,避免重复escape)
return escape(v).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');
}

function floorHide(){
$("#autocomplete").hide().html("");
strKey= "";
isShow = false;
}

function floorShow(){
var p= $(me).offset();
var w= (doption.iwidth == "0px") ? $(me).width()+2 : doption.iwidth;
$("#autocomplete").css({
'z-index:':doption.zIndex,
width:w,
top:parseInt(p.top+$(me).outerHeight())+"px",
left:parseInt(p.left)+"px"
}).show();
strKey= "";
isShow = true;
}

function keysearch(code){
var strKeyNow=$(me).val();
if(code == 38 || code == 40 || code == 13 || code == 27 || code == 9) return; //TAB/回车、ESC、向上、向下
if((strKey == "" || strKeyNow != strKey) && strKeyNow.length >= iLengthLower && strKeyNow.length <= iLengthUpper){
$.ajax({
type: "Get",
dataType: "json",
url: url,
data: strPara != "" ? strPara + "=" + encode(strKeyNow) : "",
success: function(json){
jsonjson=json.keylist;
if (json.length>0){
//获取搜索数据
var strContent= "<ul>";
$.each(json, function(i, n){
if(n.keyname.length>0){ //如果
//alert(n.keyname);
strContent+= '<li class="keyinfo"><span class="keyname">'+n.keyname+'</span>';
try{
if (n.keyextend.length>0){strContent+='<span class="keyextend">'+n.keyextend+'</span>';}
}catch(E){};
strContent+= '</li>';
};
});
if (doption.hasclose==1){
strContent+= '<li class="close"><span>关闭</span></li>';
}
strContent+='</ul>';
$("#autocomplete").html(strContent);
$("#autocomplete .keyinfo").mouseover(function(){$("#autocomplete .selected").removeClass("selected");$(this).removeClass("unselected").addClass("selected");}).mouseout(function(){$(this).removeClass("selected").addClass("unselected");}).click(function(){if(strKeyBak.length()>0){$(me).val(strKeyBak);}});
floorShow();
}else{
//没有搜索数据
floorHide();
return;
}
}
});
strKey=$(me).val();
}
if(strKey.length == 0 || strKey.length <= iLengthLower || strKey.length >= iLengthUpper) floorHide();
}

function LineSelect(code){
if(code == 27){floorHide();};//回车键、ESC键
if(code == 13){floorHide();doption.desfun();};
if(!isShow) return;
ObjSelected=$("#autocomplete ul .selected");
if (ObjSelected.length>0){ //如果已经有选定
//alert('dasfdas');
if(code == 38){ //向上键
if(ObjSelected.prev().text() != ""){ //如果不是第一个数据
ObjSelected.removeClass("selected").addClass("unselected").prev().removeClass("unselected").addClass("selected");
$(me).val($("#autocomplete ul .selected .keyname").text());
}else{
ObjSelected.removeClass("selected").addClass("unselected");
$("#autocomplete .keyinfo:last").removeClass("unselected").addClass("selected");
$(me).val($("#autocomplete ul .selected .keyname").text());
}
}else if (code == 40){ //向下键
if(ObjSelected.next().text() != ""){ //如果不是第一个数据
ObjSelected.removeClass("selected").addClass("unselected").next().removeClass("unselected").addClass("selected");
$(me).val($("#autocomplete ul .selected .keyname").text());
}else{
ObjSelected.removeClass("selected").addClass("unselected");
$("#autocomplete .keyinfo:first").removeClass("unselected").addClass("selected");
$(me).val($("#autocomplete ul .selected .keyname").text());
}
}
}else if(code == 38){
$("#autocomplete .keyinfo:last").removeClass("unselected").addClass("selected");
$(me).val($("#autocomplete .keyinfo:last .keyname").text());
}else if(code == 40){
$("#autocomplete .keyinfo:first").removeClass("unselected").addClass("selected");
$(me).val($("#autocomplete .keyinfo:first .keyname").text());
}
}
}
#autocomplete{}{ border: 1px solid #000; position: absolute; }
/**//*每行的格式*/
#autocomplete li{}{ display: block; text-align: left; height: 20px; line-height: 20px; background-color: #fff; cursor: default; padding: 0 5px; clear: both; }
/**//*鼠标选中时的格式*/
#autocomplete .selected{}{ background-color: #565da9; color: #fff; overflow: hidden; }
/**//*鼠标离开时代格式*/
#autocomplete .unselected{}{ background-color: #fff; color: #666; }
/**//*关键字信息*/
#autocomplete .keyname{}{ display: block; float: left; }
/**//*关键字扩展信息*/
#autocomplete .keyextend{}{ display: block; float: right; color: green; }
#autocomplete .unselected .keyextend{}{ color: green; }
#autocomplete .selected .keyextend{}{ color: #fff; }
/**//*关闭*/
#autocomplete .close{}{ text-align: right; }
#autocomplete .close span{}{ color: blue; cursor: pointer; text-decoration: underline; }

调用范例

$("#Keyword").AutoComplete("search.asp");


是不是很简单的?只是search.asp返回的数据要是上面所提供的格式,对于PHP来说就太方便了,只要生成相应的数组,然后json_encode一下就全出来了,呵呵

淘宝QA上关于XSS的两篇文章(据说还有后续)

淘宝QA上关于XSS的两篇文章(据说还有后续)

不说啥了,直接上原文:
两篇文章的地址分别为:http://rdc.taobao.com/blog/qa/?p=857

http://rdc.taobao.com/blog/qa/?p=882

什么是xss漏洞

XSS又叫CSS英文缩写为Cross Site Script
中文意思为跨站脚本攻击
具体内容指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,
嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的.

xss的漏洞危害

  • 获取用户cookie
  • 修改页面信息
  • 浏览器劫持
  • 与其他漏洞结合(如:csrf漏洞)
  • 其他

xss漏洞实例演示

  • 略(在这里放貌似不太合适)

xss漏洞是如何产生的

以下Velocity模板VM中常见的代码

  • <span>$!productName</span>
  • <script>var from = ‘$!rundata.Parameters.getString(’from’)';</script>

对于第一种类型的代码我们可以输入变量为

<iframe src=http://hacker.com></iframe>

第一种类型的代码将变为

<span><iframe src=http://hacker.com></iframe></span>

对于第二种类型的代码我们可以输入变量为

‘;hackerFunction(document.cookie);’

第二种类型的代码将变为

<script>var from = ”;hackerFunction(document.cookie);”; </script>

以上两种类型的代码都轻易的被植入了恶意的脚本,也就是说产生了传说中的xss漏洞。

xss漏洞如何预防

1. 对于非富文本针对入参进行转义

可通过escapeHtml和JavaScript进行转义。

转义过后上面的代码将会变成

<span>&ltiframe&nbspsrc&equalshttp&colon&sol&solhacker&periodcom&gt&lt&soliframe&gt</span>

转义后用户输入的恶意脚本代码就不会被执行从而达到了预防和修复的目的。

2. 对于富文本入参进行过滤

略。

总结

本篇简要介绍了什么是xss漏洞,xss漏洞在代码中是如何产生的,简单介绍了如何去预防和修复xss漏洞。

黑盒手动测试

  • 有输入框的页面测试

对于非富文本在输入框中输入特殊字符 <”tiehua ‘> 提交

在提交后的页面查看源代码根据关键字tiehua查找源代码中的tiehua前后的<”>’是否已经被转义成

&lt&quot&gt&apos 如果未被转义说明这个输入框存在xss漏洞的嫌疑(提交bug)。

对于富文本输入框输入<img onerror=”alert(123)” src=http://xxx.com>提交页面

如果页面有出现排版问题或者js错误说明这个输入框存在xss漏洞的嫌疑(提交bug)。

  • 页面链接参数的测试

链接带参数的如:

http://mall.taobao.com/?ad_id=&am_id=&cm_id=&pm_id=

该链接包含了4个参数,对于这种的测试方法和输入框测试方法一样只不过把参数当成你的输入框进行

提交。如:

http://mall.taobao.com/?ad_id=<”tiehua’>&am_id=&cm_id=&pm_id=

另:可能大家会说光这点不足以说服开发修改bug,很可惜本文旨在说明如何找到xss漏洞并不是说明

如何利用xss漏洞,感兴趣的看情况线下交流呵呵。

黑盒工具测试

推荐工具

  • Paros(免费)
  • Acunetix.Web.Vulnerability.Scanner (商业工具)

白盒代码扫描测试

在上一篇中我们讲到了xss漏洞产生的代码原因和解决方法如:

<span>$!productName</span>

此类的非富文本代码我们可以强制要求规范为:

<span> $!stringEscapeUtil.escapeHtml ($!productName)</span>

对于富文本的我们可以强制要求代码规范为通过过滤层过滤。

根据以上的两条规则,我们可以从白盒代码上去进行静态扫描代码是否按照规范编写来预防和筛选xss漏洞。

PHP处理中文二三例

PHP处理中文二三例

在网上看到一个贴子,是说利用16进制输出所有中文,例子如下:

<?php
$begin = hexdec ( " 4e00 " ); // 16进制转化为10进制
$end = hexdec ( " 9fa5 " );
$a = '["' ;
for ( $i = $begin ; $i <= $end ; $i ++ ) {
$a .= ' \u ' . dechex ( $i );
if ( $i % 10 == 0 ) {
$a .= " <br> " ;
}
}
$a .= ' "] ' ;
print_r (json_decode( $a ));
?>

看到这个例子,相信也能看得出了,那两个数字是不是与网上那种正则判断中文的很象啊。

由于json_encode转换中文时会把中文全部转换成16进制,这样在输出的时候就不会因为浏览器的字符集不支持而出现问题。所以同样的,利用decode也就相当于把这些16进制转换成中文了。其实并不需要这么复杂,只要在前面加上&#后面加上;就可以输出中文了。

看到这样的代码后想起昨天一个根据.net程序改的读取中文字的拼音的程序。

<?php


$strVal = array(
-20319,-20317,-20304,-20295,-20292,-20283,-20265,-20257,-20242,-20230,-20051,-20036,
-20032,-20026,-20002,-19990,-19986,-19982,-19976,-19805,-19784,-19775,-19774,-19763,
-19756,-19751,-19746,-19741,-19739,-19728,-19725,-19715,-19540,-19531,-19525,-19515,
-19500,-19484,-19479,-19467,-19289,-19288,-19281,-19275,-19270,-19263,-19261,-19249,
-19243,-19242,-19238,-19235,-19227,-19224,-19218,-19212,-19038,-19023,-19018,-19006,
-19003,-18996,-18977,-18961,-18952,-18783,-18774,-18773,-18763,-18756,-18741,-18735,
-18731,-18722,-18710,-18697,-18696,-18526,-18518,-18501,-18490,-18478,-18463,-18448,
-18447,-18446,-18239,-18237,-18231,-18220,-18211,-18201,-18184,-18183, -18181,-18012,
-17997,-17988,-17970,-17964,-17961,-17950,-17947,-17931,-17928,-17922,-17759,-17752,
-17733,-17730,-17721,-17703,-17701,-17697,-17692,-17683,-17676,-17496,-17487,-17482,
-17468,-17454,-17433,-17427,-17417,-17202,-17185,-16983,-16970,-16942,-16915,-16733,
-16708,-16706,-16689,-16664,-16657,-16647,-16474,-16470,-16465,-16459,-16452,-16448,
-16433,-16429,-16427,-16423,-16419,-16412,-16407,-16403,-16401,-16393,-16220,-16216,
-16212,-16205,-16202,-16187,-16180,-16171,-16169,-16158,-16155,-15959,-15958,-15944,
-15933,-15920,-15915,-15903,-15889,-15878,-15707,-15701,-15681,-15667,-15661,-15659,
-15652,-15640,-15631,-15625,-15454,-15448,-15436,-15435,-15419,-15416,-15408,-15394,
-15385,-15377,-15375,-15369,-15363,-15362,-15183,-15180,-15165,-15158,-15153,-15150,
-15149,-15144,-15143,-15141,-15140,-15139,-15128,-15121,-15119,-15117,-15110,-15109,
-14941,-14937,-14933,-14930,-14929,-14928,-14926,-14922,-14921,-14914,-14908,-14902,
-14894,-14889,-14882,-14873,-14871,-14857,-14678,-14674,-14670,-14668,-14663,-14654,
-14645,-14630,-14594,-14429,-14407,-14399,-14384,-14379,-14368,-14355,-14353,-14345,
-14170,-14159,-14151,-14149,-14145,-14140,-14137,-14135,-14125,-14123,-14122,-14112,
-14109,-14099,-14097,-14094,-14092,-14090,-14087,-14083,-13917,-13914,-13910,-13907,
-13906,-13905,-13896,-13894,-13878,-13870,-13859,-13847,-13831,-13658,-13611,-13601,
-13406,-13404,-13400,-13398,-13395,-13391,-13387,-13383,-13367,-13359,-13356,-13343,
-13340,-13329,-13326,-13318,-13147,-13138,-13120,-13107,-13096,-13095,-13091,-13076,
-13068,-13063,-13060,-12888,-12875,-12871,-12860,-12858,-12852,-12849,-12838,-12831,
-12829,-12812,-12802,-12607,-12597,-12594,-12585,-12556,-12359,-12346,-12320,-12300,
-12120,-12099,-12089,-12074,-12067,-12058,-12039,-11867,-11861,-11847,-11831,-11798,
-11781,-11604,-11589,-11536,-11358,-11340,-11339,-11324,-11303,-11097,-11077,-11067,
-11055,-11052,-11045,-11041,-11038,-11024,-11020,-11019,-11018,-11014,-10838,-10832,
-10815,-10800,-10790,-10780,-10764,-10587,-10544,-10533,-10519,-10331,-10329,-10328,
-10322,-10315,-10309,-10307,-10296,-10281,-10274,-10270,-10262,-10260,-10256,-10254
);
$strPy = array(
"A","Ai","An","Ang","Ao","Ba","Bai","Ban","Bang","Bao","Bei","Ben",
"Beng","Bi","Bian","Biao","Bie","Bin","Bing","Bo","Bu","Ba","Cai","Can",
"Cang","Cao","Ce","Ceng","Cha","Chai","Chan","Chang","Chao","Che","Chen","Cheng",
"Chi","Chong","Chou","Chu","Chuai","Chuan","Chuang","Chui","Chun","Chuo","Ci","Cong",
"Cou","Cu","Cuan","Cui","Cun","Cuo","Da","Dai","Dan","Dang","Dao","De",
"Deng","Di","Dian","Diao","Die","Ding","Diu","Dong","Dou","Du","Duan","Dui",
"Dun","Duo","E","En","Er","Fa","Fan","Fang","Fei","Fen","Feng","Fo",
"Fou","Fu","Ga","Gai","Gan","Gang","Gao","Ge","Gei","Gen","Geng","Gong",
"Gou","Gu","Gua","Guai","Guan","Guang","Gui","Gun","Guo","Ha","Hai","Han",
"Hang","Hao","He","Hei","Hen","Heng","Hong","Hou","Hu","Hua","Huai","Huan",
"Huang","Hui","Hun","Huo","Ji","Jia","Jian","Jiang","Jiao","Jie","Jin","Jing",
"Jiong","Jiu","Ju","Juan","Jue","Jun","Ka","Kai","Kan","Kang","Kao","Ke",
"Ken","Keng","Kong","Kou","Ku","Kua","Kuai","Kuan","Kuang","Kui","Kun","Kuo",
"La","Lai","Lan","Lang","Lao","Le","Lei","Leng","Li","Lia","Lian","Liang",
"Liao","Lie","Lin","Ling","Liu","Long","Lou","Lu","Lv","Luan","Lue","Lun",
"Luo","Ma","Mai","Man","Mang","Mao","Me","Mei","Men","Meng","Mi","Mian",
"Miao","Mie","Min","Ming","Miu","Mo","Mou","Mu","Na","Nai","Nan","Nang",
"Nao","Ne","Nei","Nen","Neng","Ni","Nian","Niang","Niao","Nie","Nin","Ning",
"Niu","Nong","Nu","Nv","Nuan","Nue","Nuo","O","Ou","Pa","Pai","Pan",
"Pang","Pao","Pei","Pen","Peng","Pi","Pian","Piao","Pie","Pin","Ping","Po",
"Pu","Qi","Qia","Qian","Qiang","Qiao","Qie","Qin","Qing","Qiong","Qiu","Qu",
"Quan","Que","Qun","Ran","Rang","Rao","Re","Ren","Reng","Ri","Rong","Rou",
"Ru","Ruan","Rui","Run","Ruo","Sa","Sai","San","Sang","Sao","Se","Sen",
"Seng","Sha","Shai","Shan","Shang","Shao","She","Shen","Sheng","Shi","Shou","Shu",
"Shua","Shuai","Shuan","Shuang","Shui","Shun","Shuo","Si","Song","Sou","Su","Suan",
"Sui","Sun","Suo","Ta","Tai","Tan","Tang","Tao","Te","Teng","Ti","Tian",
"Tiao","Tie","Ting","Tong","Tou","Tu","Tuan","Tui","Tun","Tuo","Wa","Wai",
"Wan","Wang","Wei","Wen","Weng","Wo","Wu","Xi","Xia","Xian","Xiang","Xiao",
"Xie","Xin","Xing","Xiong","Xiu","Xu","Xuan","Xue","Xun","Ya","Yan","Yang",
"Yao","Ye","Yi","Yin","Ying","Yo","Yong","You","Yu","Yuan","Yue","Yun",
"Za", "Zai","Zan","Zang","Zao","Ze","Zei","Zen","Zeng","Zha","Zhai","Zhan",
"Zhang","Zhao","Zhe","Zhen","Zheng","Zhi","Zhong","Zhou","Zhu","Zhua","Zhuai","Zhuan",
"Zhuang","Zhui","Zhun","Zhuo","Zi","Zong","Zou","Zu","Zuan","Zui","Zun","Zuo"
);

function getPy ( $string )
{
global $strVal,$strPy;
$py = '';
$strLen = strLen( $string );
for ( $ii = 0; $ii < $strLen; $ii++ ){
$s = ord( $string[$ii] );
if ( $s > 160 ){
$ii++;
$ss = ord( $string[$ii] );
$_ss = $s * 256 + $ss - 65536;
if ( $_ss == -9254 ){
$py .= "Zhen";
}else{
foreach ( $strVal as $_k => $_v ){
$_index = $_v > $_ss ? ($_k-1) : ($_v == $_ss ? $_k : 0 );
if ( $_index ){
$py .= $strPy[$_index];
break;
}
}
}
}else{
$py .= " {$string[$ii]} ";
}
}
return $py;
}
这是根据网上的例子改写而来,其实BUG不少,作业的作,是认不出的。还有GBK的字符也是认不出拼音的(好象GBK里的一些特殊字符的拼音规则和上面的数组并不一致)

不过,这些都算是我的备份吧。呵呵,同样,如果对拼音要求不高的朋友也可以拿来用用。

CNBETA:Google Reader更新,支持评论

CNBETA:Google Reader更新,支持评论

在没有使用google reader订阅RSS前,我一直使用 GreatNews,但是我不可能在单位和家庭两处都同时订阅和查看RSS吧?所以改用网络版了。

基于国内的网络,我也曾经有过多个选择,但最终还是使用google reader,目前,我订阅的RSS已经超过了100个,虽然有很多是我一带而过的看看的,其实只是扫一遍,但至少我确信,这里面有一些RSS源的内容还是我非常喜欢看的。

以前的READER永远让我只是孤独的欣赏,虽然有share功能。今天看到cnbeta上写着:

Google Reader team刚刚公布了一项新的特性,这一网络上最流行的feed阅读器开始支持评论.
这意味着您的朋友们可以开始评论您订阅的内容,但想看到他们的评论需要切换到评论模式才可以,当用户有评论时,他们的头像会显示一个评论气泡,点击就可以看到,这一功能也开始在移动版本的Google Reader上出现.

很开心,但是有人回复说中文版不支持,不过,对于我这样的IB青年来说,当然我是使用英文版的GOOGLE READER的,可惜现在这个功能,只支持在:friend shared items栏目里。不是朋友共享的,就无法评论。

我觉得象这种,应该是共享有相同的RSS的源的人,可以提供一下COMMENT,试想一下,如果有这个功能,对于WEB网站来说,是不是会损失流量呢?哈哈