手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表2010年11月的文章

Yiiframework(Yii框架)开发笔记:续二

继续我的笔记
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打开就成了。。烂桔建议

PHP代码
  1. 'log'=>array(  
  2.     'class'=>'CLogRouter',  
  3.     'routes'=>array(  
  4.         array(  
  5.             'class'=>'CFileLogRoute',  
  6.             'levels'=>'error, warning',  
  7.         ),  
  8.         array(  
  9.             'class' => 'CWebLogRoute',  
  10.             'levels' => 'profile,trace',  
  11.         ),  
  12.         array(  
  13.             'class' => 'CProfileLogRoute',  
  14.             'levels' => 'profile',  
  15.         ),  
  16.     ),  
  17. ),  
于是在页面执行完后,trace信息就全部打开了,当然正式上线后不能这样操作的。。要关掉的,只要开CFileLogRoute就成了

3、DB,由于trace打开后,如果用了bindParam的话,显示的SQL可能是这样的:

SQL代码
  1. select xx,xx,xx from table where id IN (:yad1,:yad2,:yad3) and id = :id  
看不到实际绑定的值是否正确,这时候最担心的是enum的值传递给SQL是字符串还是INT值。所以,在DB那一块,加上

'enableParamLogging'=>true,

然后在trace里面就可以看到,在显示的SQL后面,多了一个类似bindValue的值。你可以对应着查看一下,传入的值是否与你实际相对应

 

 

Tags: yii, 开发笔记, framework

Yiiframework(Yii框架)开发笔记:续一

续:
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查看)

待续

Tags: yii, framework, 开发笔记, gii

Yiiframework(Yii框架)开发笔记

一点小小的笔记
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后面吧。。

 

Tags: yii, 开发笔记, framework

linux filename xss攻击

看到这篇文章的时候是在晚上,然后就觉得好郁闷,不过也挺佩服淘宝QA那些人的奇思怪想,看看他们是怎么说的吧。

一、关于文件名
大家都知道在 windows 下面文件名是有规则,定义了一些保留的字符,他们分别是:

< (less than)
> (greater than)
: (colon)
" (double quote)
/ (forward slash)
\ (backslash)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

而linux下面是没有对这些大部分字符进行限制的,可以随意定义的,那么,我们就可以将 XSS Pyload 存储在文件名中,如图所示:
大小: 13.74 K
尺寸: 318 x 231
浏览: 1896 次
点击打开新窗口浏览全图
我们可以看到可以成功将 xss pyload 存储在文件名当中了。
二、利用攻击
很多时候,由于代码的各种环境,让我们的攻击成为可能,查看以下PHP上传文件代码:

PHP代码
  1. <?php  
  2. if ($_FILES["file"]["error"] > 0)  
  3.   {  
  4.   echo "Error: " . $_FILES["file"]["error"] . "<br />";  
  5.   }  
  6. else  
  7.   {  
  8.   echo "Upload: " . $_FILES["file"]["name"] . "<br />";  
  9.   echo "Type: " . $_FILES["file"]["type"] . "<br />";  
  10.   echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";  
  11.   echo "Stored in: " . $_FILES["file"]["tmp_name"];  
  12.   }  
  13. ?>  
  14. <html>  
  15. <body>  
  16. <form action="" method="post" enctype="multipart/form-data">  
  17. <label for="file">Filename:</label>  
  18. <input type="file" name="file" id="file" />  
  19. <br />  
  20. <input type="submit" name="submit" value="Submit" />  
  21. </form>  
  22. </body>  
  23. </html>  
当文件上传成功,程序将文件信息进行输出。而此时没有对文件名进行任何处理,那么,如果将我们定义好的特殊字符的文件名进行上传,然后经过程序输出,就可以攻击了,如图所示:

大小: 39.65 K
尺寸: 500 x 226
浏览: 2216 次
点击打开新窗口浏览全图

可以看到,我们确实可以攻击成功了!那么,并不是所有的上传地方都存在,要满足以下条件才可以:
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,虽然这个条件很苛刻,但毕竟还是存在被注入的可能啊,而且这种注入真的很妖。

Tags: linux, xss, php

Mysql: 'reading initial communication packet'

在虚拟机上装了一个mysql,然后在自己的机器上连接的时候出现这个错误: 'reading initial communication packet',找了一下资料发现原来默认的my.cnf中,对SERVER的IP进行了简单的绑定,只要去掉绑定即可

于是先whereis mysql,知道了mysql配置文件的位置在/etc/mysql下,然后
vim /etc/mysql/my.cnf
找到:
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address           = 127.0.0.1

将bind-address前加上注释即可,然后/etc/init.d/mysql restart ,OK一切都搞定了。
做个笔记

Tags: mysql, remote, bind

Records:30123456