乱记一点事
1、cnbeta上说着饭否重开了。。。吃惊,大吃一斤啊。。
2、walker用postcommit对代码进行测试,居然还在页面最后显示了最后的版本号之类的
3、啊兴的g2ROM 2.2.5终于要发布了,这个ROM等了好久了。如果再没有,估计就要自己做了。
4、公司网站的初次改版基本完成,虽然性能不咋地,但总算还有点满意,虽然我在其中也没有做太多的事情。
5、老乡告诉我一些老家的网络电子商务市场等,很意外,这是一个市场,三线城市到了发展的时候了
膘叔的简单人生
乱记一点事
1、cnbeta上说着饭否重开了。。。吃惊,大吃一斤啊。。
2、walker用postcommit对代码进行测试,居然还在页面最后显示了最后的版本号之类的
3、啊兴的g2ROM 2.2.5终于要发布了,这个ROM等了好久了。如果再没有,估计就要自己做了。
4、公司网站的初次改版基本完成,虽然性能不咋地,但总算还有点满意,虽然我在其中也没有做太多的事情。
5、老乡告诉我一些老家的网络电子商务市场等,很意外,这是一个市场,三线城市到了发展的时候了
用UBUNTU桌面版挺长时间了,配置VPN也很久了,但从来没有连接成功过。
昨天因为要查资料需要翻越长城,所以找了一下ubuntu VPN客户端的资料,想找个客户端来上网,结果找到的资料都是使用内置的PPTP客户端就成了。
再找资料,发现,我不能启动的原因可能是:
要点上高级选项(Advance),选择Use-Point-To-Point-Encryption(MPPE)。
反正,我这么一设置后,就可以正确连接上VPN了。
续
今天我讲两件事,都是关于插件的,1、minify(@hightman的EClientScript) ,2、swfupload
1、EclientScript,这是hightman开发的插件,可以将要发布的css和JS进行合并,方便WEB开发。关于 clientScript,可以查看官方的guide,在性能优化这一节有介绍。但官方的手册上也说了,官方的scriptmap还是需要自己合并。而 eclientScript则实现了这样的功能了。一些使用方法我就不多了,我只说一些存在的问题,直接用代码说,我不说啥了:
<?php
$css = Yii::app()->clientScript;
$css->scriptMap = array();
$css->registerCoreScript('jquery'); //这个是核心的,yii框架里默认带了,你的系统中可以不必存在
$baseUrl = Yii::app()->request->baseURL ;
$css->registerScriptFile( $baseUrl . "/xxx/filepath");
$css->registerCssFile("filepath");
$baseUrl 这段我遇到的问题最多,开始的时候,我用的是Yii::app()->module->_assetUrl;,事实上我发现这样可以成功,但 生成到assets目录里后,文件就再也不变了(无论你怎么更改原始目录中的文件,assets里的文件都不会更改)。
最后,我是直接把目录扔到了assets的目录里。然后手动设置路径 ,由EclientScript来生成压缩后的css和script文件。(如果需要发布那就必须要用到assetManage)
之所以把目录扔到assets里,是因为我需要单独把assets目录最后用独立域名发布,【关于用独立域名发布,已经建议了hightman更新了,他也答应会更新】
我对eclientscript第二个更新是在输出的URL上加上了filemtime的时间戳。以保证用户可以下载到最新的css和script。
2、swfupload。我是准备把neatpic用Yii重写,而且很多人都想要文件上传功能,但自带的上传功能也只有2M(大多数情况下只有2M)。 在实际使用下来,觉得还成(因为还没有真正测试 phpsession的那个问题,即FF和IE的sessionId的问题)。
swfupload插件,居然把文件分成两个压缩包,没想通。。。如果只下载一个可是不行的哦。所幸,官方把测试用例还是写的较详细(对于flash上的 文字,可以通过widget的参数修改,handlers.js里面是一些completed的一些方式,建议根据自己的需要修改。)
后记:我是邀请了@walkerlee,想让他分享一下心得。他是答应了,所以可以考虑催他了
我一直想要苹果,但是,家里的财政大权不是我能管的。又想买一个黑苹果吧,但财政大臣那边还是不同意,认为买一个假玩意没意思。
虽然我一直想搞台笔记本,但目前好象还没有准备好,上级领导不批啊,所以看到素包子这篇文章就鸡动了一下。。。
素包子找了一些资料,大多不是介绍的最新的vmware7装最新的macos x,搜到了一个不错的安装介绍,参考着做完全没问题,而且很简单,感谢作者刘洪志和电脑报。5分钟搞定配置过程,接下来就是等待自动安装和重启了。
貌似可以升级到10.6.4,做了个snapshot,更新去了,一共700M左右。
(其中使用darwin.iso启动进行安装的步骤可以省略,可以直接使用OSXPCBETA_ArcticFox.10.6.3.iso启动安装。)
想偷懒并且对版本要求不高的同学可以下premade的vmware镜像,直接使用,大小10G,见BT种子,用迅雷离线下载瞬间完成,满水管下载。
原文在:http://baoz.net/install-macos-x-snow-leopard-10-6-3-in-vmware-7/
好象主要是那两张图:

用yii进行开发的时候,不可避免的就会使用其他的插件,当然也需要自己来为他作扩展,所以,Yii的这一章就一定要看了(http://www.yiiframework.com/doc/guide/1.1/zh_cn/extension.create)。
官方介绍了这些:
续
1、group by 的时候 count,这个字段默认是取不到的。即
$result = XXX:model()->findAll(
array(
'select'=>'userid,count(*) as cnt',
'group' => 'userid'
)
);
如果是上述代码,那么sql是对的,但永远取不到cnt这个属性值的,因为show columns的时候,没有cnt这个field,所以它永远不会存在于attributes这个变量里的。那么,怎么打印出这个cnt呢?官方也没有这样的介绍,不过搜索一下论坛,还是有答案的,比如有人就反问曾经一个提问者,did you have a public variable named ‘cnt’?,看到这个反问,我立刻到xxx类里加了一行 public $cnt,然后在获取结果后,用$reuslt->cnt就得到值了。。
后记,其实昨天bobby在测试的时候发现,如果映射到一个存在的字段也可以的。比如cid存在的情况下,count(*) as cid,也可以取到值 ,只是这样会让人很迷惘
2、widget,widget建立起来还算是比较方便的。比如我建一下如下的文件,LinksWidget.php,扔到components目录下,
内容如下:
class LinksWidget extends CWidget{
public function init(){
//相当于beginWidget
}
public function run(){
//相当于endWidget
}
}
如果在这里面用上了 $this->render('links');那么这个render调用的模版和默认的模版无关,它是widget专用的,当然方法都类似。只要你在Widget文件同目录下建一个views文件夹,把render调用的模版扔进去就OK了。(其实,路径可以通过$this->getViewPath()来获取,以便测试。。)
注:widget比较方便,比如说我现在有N个modules,但有一些内容是公用的,我又不想每个程序都写。当然widget是最方便的喽?举例:友情链接。。。。多方便呀
3、模版。。官方的Extenstion中有一些关于smarty的,但如果真的用的不多的话,自带的prado的viewrender就已经很简化了。比如我们常用的<?php echo $xxx ; ?>简化成了 <%= $xxx; %>,如果是<?php if(xxx){ xxx } ?>也可以用<% if():><% xxx ;%><% endif ;%>这样类似的方式来处理。。简化了好多,而且又和PHP语法非常相似。(可以看一下官方手册,介绍的较多。)
继续我的笔记
1、还是cdbcriteria,其实对于这个类,我在上面折腾了好久。比如:
$cdb = new CDbCriteria();
$cdb->select = 'a,b,c,de';
这时候,这个select中的字段只能是主表的字段,如果你都是*的话,当然无所谓,可以直接在查询后直接$result->joinname->attributes这样调用。但是如果你只想取几个字段,怎么办?
官方的GUIDE上没有相应的例子(是我没有仔细找到),后来,蜘蛛和烂桔告诉我了,一个是说scopes一个是说直接改with,于是我选择了更改with的方法(官方AR那一节,with都是用字符串来代替的。。。),于是就变成了这样
$cdb->with['relationname'] = array('select'=>'c,d,e');
2、这回是LOG。。在LOG中显示当前页面执行的SQL时,把LOG打开就成了。。烂桔建议
'log'=>array(
'class'=>'CLogRouter',
'routes'=>array(
array(
'class'=>'CFileLogRoute',
'levels'=>'error, warning',
),
array(
'class' => 'CWebLogRoute',
'levels' => 'profile,trace',
),
array(
'class' => 'CProfileLogRoute',
'levels' => 'profile',
),
),
),
于是在页面执行完后,trace信息就全部打开了,当然正式上线后不能这样操作的。。要关掉的,只要开CFileLogRoute就成了
3、DB,由于trace打开后,如果用了bindParam的话,显示的SQL可能是这样的:
select xx,xx,xx from table where id IN (:yad1,:yad2,:yad3) and id = :id
看不到实际绑定的值是否正确,这时候最担心的是enum的值传递给SQL是字符串还是INT值。所以,在DB那一块,加上
'enableParamLogging'=>true,
然后在trace里面就可以看到,在显示的SQL后面,多了一个类似bindValue的值。你可以对应着查看一下,传入的值是否与你实际相对应
续:
1、ID在where条件中如何被调用?原来的那个$criteria = new CDbCriteria();$creteria->addCondition()已经不能这样用了,需要使用$creteria->addInCondition("fieldname",$in);然后通过输出的SQL可以查看一下是否正常。
2、gii简化开发的作用十分明显,原来我在本机一切正常,但是移动到局域网后发现无法访问,一直显示404,咨询了群里@hightman,他把他的配置贴出来看了一下,发现多了一个ipFilters,于是加上
'ipFilters'=>array('192.168.*'),然后局域网中所有的访问都正常了。
3、CHttpException,这个其实算是2问题的扩展,因为gii不正常的时候,返回的都是nginx的404页面。还是@hightman说的,他说他在很多服务器上测试过,HTTP的状态头会被HTTP SERVER劫持,即使在config里配置了errorHandle也没用。因此他都是主动返回200状态(除了ajax操作)。了解了这个后,发现这玩意也是既好也不好。好处是当出现错误时,直接显示HTTPSERVER的错误页面,当rewrite的时候不容易被别人发现是用了什么framework。缺点是,就算是自己调试也看不到trace的信息了。。(只能通过LOG查看)
待续
一点小小的笔记
1、三表关联,一个用户有一个扩展信息表,也拥有一个商铺,于是relations方法是这样的
商铺:array('member'=>array(self::BELONGS_TO,'Member','member_id'))
用户:array('shop'=>array(self::HAS_ONE,'Shop','member_id'),'extends'=>array(self::HAS_ONE,'MemberExtends','member_id'))
扩展:array('member'=>array(self::BELONGS_TO,'Member','member_id'))
然后开始用Shop::model()->find("shop_id = 1");查询,理论上应该不会有错,但事实上还是错了,报CActiveFinder 758行错误。查了很久发现其实没有问题,但就是报错,一点点的修改也不行。然后问google,也查不出什么具体原因,然后根据报错的信息所在行猜测,因为他是foreach( $this->_pkAlias ....)这一行,说是foreach出错,那我想是不是因为主键问题?于是三个表一个个的查看结构,结果还真的发现了member_extends表,居然没有主键。哦,卖糕的。。。这种事情也有?于是给它把自增字段加上了主键索引,然后再调试。OK鸟。
我日,都自增字段了还不设主键?NND,折腾了我一下午啊。。。
2、获取attributes值
根据取回来的结果,当然要获取值喽,查看手册可以了解到,只要设了select,那么取回来的就是指定字段,多余的字段,虽然也存在于attributes数组中,但都是空值(只是觉得这样浪费了点空间。。。)
3、where条件
where条件是字符串。。如果需要加,那就用CDbCriteria吧,$criteria = new CDbCriteria(); $criteria->addCondition("a=:a");$criteria->params[':a']=$a;
主要是可能会有判断条件,所以参数变量跟在addCondition后面吧。。
看到这篇文章的时候是在晚上,然后就觉得好郁闷,不过也挺佩服淘宝QA那些人的奇思怪想,看看他们是怎么说的吧。
一、关于文件名
大家都知道在 windows 下面文件名是有规则,定义了一些保留的字符,他们分别是:
< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
而linux下面是没有对这些大部分字符进行限制的,可以随意定义的,那么,我们就可以将 XSS Pyload 存储在文件名中,如图所示:

我们可以看到可以成功将 xss pyload 存储在文件名当中了。
二、利用攻击
很多时候,由于代码的各种环境,让我们的攻击成为可能,查看以下PHP上传文件代码:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "Error: " . $_FILES["file"]["error"] . "<br />";
}
else
{
echo "Upload: " . $_FILES["file"]["name"] . "<br />";
echo "Type: " . $_FILES["file"]["type"] . "<br />";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
echo "Stored in: " . $_FILES["file"]["tmp_name"];
}
?>
<html>
<body>
<form action="" method="post" enctype="multipart/form-data">
<label for="file">Filename:</label>
<input type="file" name="file" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>
当文件上传成功,程序将文件信息进行输出。而此时没有对文件名进行任何处理,那么,如果将我们定义好的特殊字符的文件名进行上传,然后经过程序输出,就可以攻击了,如图所示:

可以看到,我们确实可以攻击成功了!那么,并不是所有的上传地方都存在,要满足以下条件才可以:
1、文件上传后保存前进行了一次原样输出。
2、直接按原文件名进行存储。
3、其他特定环境,看程序逻辑。
4、web server 为 linux。
5、上传攻击机器为 linux。
示例代码:http://code.google.com/p/madal-example-project/source/browse/trunk/controllers/image_uploader.php?r=2
更多的:http://code.google.com/query/#q=$_FILES[%22file%22][%22name%22]
线上攻击测试:http://www.woyigui.cn/fileupload.php
三、防范
1、存储时以随机文件名保存。
2、任意时候对文件名进行处理后输出,可以进行 html 编码后输出。
参考:
http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx
--EOF——
原文来自:http://qa.taobao.com/?p=10139,虽然这个条件很苛刻,但毕竟还是存在被注入的可能啊,而且这种注入真的很妖。