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

drupal的db_query安全过滤

这篇 文章已经是07年的了,不过,我一直没有关注过drupal的db类,所以对于这方面我也根本 就没有在意过。8过,我在我的siterpc中,我也是采用了sprintf的写法,不是为了安全,而是为了格式化。因为在siterpc里我们几乎不接受外部变量,所有的变量都是由我们自己传入,所以对于安全方便忽略了很多。但还是用sprintf来格式化SQL语句了。

因此看到这篇drupal的db_query安全过滤,突然发现,可以让我的代码少写很多了。(参数可变时请使用vsprintf)

以下是原文 :

Drupal通过C风格的字符串输出格式实现了对sql语句的安全过滤。
使用方法:

PHP代码
  1. db_query("SELECT n.nid FROM {node} n WHERE n.type = '%s'"$type);//正确做法  
  2. //这不等于以下语句,使用sprintf并不能避免mysql注入。  
  3. db_query(sprintf("SELECT n.nid FROM {node} n WHERE n.type = '%s'"$type)); //不正确  
drupal db_query核心代码如下:
PHP代码
  1. /** 
  2.  * Indicates the place holders that should be replaced in _db_query_callback(). 
  3.  */  
  4. define('DB_QUERY_REGEXP''/(%d|%s|%%|%f|%b)/');  
  5.   
  6. /** 
  7.  * Runs a basic query in the active database. 
  8.  * 
  9.  * User-supplied arguments to the query should be passed in as separate 
  10.  * parameters so that they can be properly escaped to avoid SQL injection 
  11.  * attacks. 
  12.  * 
  13.  * @param $query 
  14.  *   A string containing an SQL query. 
  15.  * @param ... 
  16.  *   A variable number of arguments which are substituted into the query 
  17.  *   using printf() syntax. Instead of a variable number of query arguments, 
  18.  *   you may also pass a single array containing the query arguments. 
  19.  
  20.  *   Valid %-modifiers are: %s, %d, %f, %b (binary data, do not enclose 
  21.  *   in '') and %%. 
  22.  * 
  23.  *   NOTE: using this syntax will cast NULL and FALSE values to decimal 0, 
  24.  *   and TRUE values to decimal 1. 
  25.  * 
  26.  * @return 
  27.  *   A database query result resource, or FALSE if the query was not 
  28.  *   executed correctly. 
  29.  */  
  30. function db_query($query) {  
  31.   $args = func_get_args();  
  32.   array_shift($args);  
  33.   $query = db_prefix_tables($query);  
  34.   if (isset($args[0]) and is_array($args[0])) { // 'All arguments in one array' syntax  
  35.     $args = $args[0];  
  36.   }  
  37.   _db_query_callback($args, TRUE);  
  38.   $query = preg_replace_callback(DB_QUERY_REGEXP, '_db_query_callback'$query);  
  39.   return _db_query($query);  
  40. }  
  41.   
  42. /** 
  43.  * Helper function for db_query(). 
  44.  */  
  45. function _db_query_callback($match$init = FALSE) {  
  46.   static $args = NULL;  
  47.   if ($init) {  
  48.     $args = $match;  
  49.     return;  
  50.   }  
  51.   
  52.   switch ($match[1]) {  
  53.     case '%d'// We must use type casting to int to convert FALSE/NULL/(TRUE?)  
  54.       return (int) array_shift($args); // We don't need db_escape_string as numbers are db-safe  
  55.     case '%s': 
  56.       return db_escape_string(array_shift($args)); 
  57.     case '%%':  
  58.       return '%'; 
  59.     case '%f': 
  60.       return (float) array_shift($args); 
  61.     case '%b': // binary data  
  62.       return db_encode_blob(array_shift($args));  
  63.   }  
  64. }  
简单的对一些输入做了处理。参考: http://drupal.org/node/101496

原文来自于:http://www.luochunhui.com/id/315

Tags: drupal, php, escape_string

phpchina活动-echo谈xhprof,cache and long-polling

pea的活动除了这次外,我是真没有参加过,不过在与会的同时听文峰说也好多时间没办了,所以也没有感觉啥。这次的内容主讲是蛋定工作室www.jt-tech.net的echo,讲了xhprof ,cache,以及long-polling的一些应用及讲解,因为对xhprof以及long-polling有点兴趣,所以就参加了。当然还有另外的原因:echo在群里研究session的时候,非常透彻,也想看看他平时用啥工具之类的;另外就是想看看11爷、四爷以及逍遥等人长啥样。
好象以前在drupal研讨会的时候见过文峰,应该也是4年前了吧,那时候好象他非常胖,也曾经找过我让我谈谈有没有什么 经验可谈的。
值此今天这一课,发现我还是离专业差的很远,都是走的野路子啊。果然是人不学习就要退步,野路子能走一时,是走不了一世的。
看着echo(蛋定工作室)的PPT上那些工具,发现,我除了x-debug外,真是一个都没有用过。丢人,不过想想也没啥,在篱笆的时候性能啥的都扔给运维了,当然他们也没有查出啥问题来,可能还是篱笆的访问量不大的原因吧?现在想想那样垃圾的代码都没有跑出问题而java的一跑就嗝屁了,也真是意外。
谈了很多废话,还是讲讲今天的内容吧,比较有印象的当然也正是我想了解和关注的xhprof以及long-polling。web client cache这玩意还真没有什么 可讲的,对着yahoo的14条军规慢慢查,慢慢改吧。【后来变22条军规了】
xhprof,是facebook提交的pecl库(好象Echo是这么说的),可以在运行时候查看效率,这点其实才是我最关注的。echo说xhprof对于那些只针对某些人出现问题,而其他用户死活折腾不出、故障BUG无法重现的性能优化、log记录非常有用。在看了他给出的wikimedia的图片,以及他实际项目中的代码片段后,觉得果然是非常有意义。对于性能的影响好象也不是很大。
xhprof,在这里我就不多介绍了,google搜索的第一条就是老王的笔记:体验XHProf_老王的技术手册_百度空间,想看的可以移步去参观一下,过两天我也会转到博客上来,毕竟这东西确实值得试一下,特别是想用在wordpress上,看看性能瓶颈到底在哪里,是否可以进行优化。

这张图真的很吸引我,可以让我检查页面中哪些地方消耗的资源最大:
大小: 145.67 K
尺寸: 374 x 376
浏览: 1757 次
点击打开新窗口浏览全图

long-polling,对于做WEB的人来说,特别是SNS的人,用的地方就多了。目前最多的用途可能就是用来检测是否有系统消息提示,如果一直用ajax,那么你会发现定期polling的时候,很耗资源。如果不信,你可以看一下thinksns,他取信息等 资料就是这样的处理。但其实long-polling也能算是用ajax在获取信息,但他连接后并不能算是断开,由服务器一直在while(true)循环。echo也给了一些测试代码。当然,其实这方面很早就研究和接触过,不过仅限于表面,因为我没有理解当并发非常大时候,这个性能如何处理。echo是说通过ulimit -n 来调整最大用户数和最大进程数来增加,因为理论上都是根据内存大小和利用率来控制,说白了,你没内存,代码再好也经不起折腾。并发也永远上不去。

很多东西,一时间可能用语言无法表达,但总算是有收获,最后抽奖的时候,报数时,号码是13,哦,原来我还是可以装 13的。over
看下一次是否再有收获。上大课确实不如上小课,有时候人多了并不一定能够讲得出话。
听说echo要把PPT放出来,到时候可以看看。
最后说一下web client cache。关于这个玩意,对于if-modified这东西等等,现在用的真是少了,以前在做垃圾网站时,都是强行指定e-tag,内容页的e-tag永远不变,首页、列表表的e-tag一天变一次,以保证性能的最大体现。其实,抛开用户登录,如果内容页是ajax的widget,那真的是可能永远不变的。不过现在都是为了更好的吸引用户,在cms中的相关文章、推荐文章、推广文章等 都是实时更新的,所以效率也相对下降一点点喽。不过,可以考虑e-tag为一天,这样对于当天频繁访问的用户速度会明显增加,但,不知道对搜索引擎会怎么样。
杂谈而己

Tags: phpchina, pea, xhprof, cache, long-polling

使用PHP_UML生成代码的UML图

不得不说,我很郁闷。事实上,我很少使用PEAR库,几乎是从来也不,所以看到这篇 文章的时候,我尝试了一下,同时也安装了pear库。并按照教程所说的,一步步的做了下去。

OK,先上文章,再说郁闷。

在读别人代码的时候, 在没有详细文档的时候, 如何快速的看清整个代码的结构(类结构), 就成为了一个现实的问题.
今天我就介绍一种, 自动生成UML图的方法.
假设, 我有一个项目文件夹:laruence, 在这个文件夹上有一个文件Root.php(事实上, 无论多级目录, 多个文件, 都可以).

PHP代码
  1. <?php  
  2.    
  3. abstract class Root {  
  4.     private $instance;  
  5.     abstract public function Hi();  
  6. }  
  7.    
  8. interface Intro {  
  9.     public function Say();  
  10. }  
  11.    
  12. class Sub extends Root implements Intro {  
  13.     private $instance;  
  14.     public function Say() {  
  15.         echo "I am Laruence";  
  16.     }  
  17.     public function Hi() {  
  18.         echo "Hello!";  
  19.     }  
  20. }  
  21. ?>  

 

首先, 我们要使用PHP_UML(PHP_UML)根据代码生成XMI.
使用方法比较简单, 在安装PHP_UML以后, 运行:

XML/HTML代码
  1. phpuml laruence/ -o laruence.xmi -n laruence -f xmi --pure-object --no-deployment-view --no-component-view --no-docblocks  

 

会得到一个laruence.xmi文件, phpuml的具体参数可以通过phpuml –help了解.
有了xmi以后, 如何转成UML图呢?
Visio2007不支持导入XMI, 我找到了另外的一个工具:Altova MapForce, 这个工具可以支持XMI到UML图的转换, 需要注册, 不过提供了30天的使用许可(大家要是有更好的替换方案, 欢迎补充).
在Mapforce导入laruence.xmi以后 ,生成UML图, 就得到了如下的PNG:

大小: 14.05 K
尺寸: 473 x 376
浏览: 1602 次
点击打开新窗口浏览全图

是不是很方便呢?
另外PHP_UML还可以生成html格式, 做为一种doc gen工具也不错. 更可以通过xmi生成PHP文件.

--EOF--上文来自http://www.laruence.com/2010/05/14/1473.html【风雪之隅】

郁闷的事情是这样发生的,我直接进行我的命令行,OK,进入php目录,直接运行pear.bat,因为目录下有这个文件。但是告诉我不对,所以我准备重装pear,怎么装呢?官方告诉我,下载一个go-pear.php文件,用PHP执行一下就可以了。
下载好go-pear.php文件后,拷到php目录下,运行:php go-pear.php,然后就一步一步的往下安装PEAR了。装的时候请选择system而不是local。安装完毕后生成一个REG文件,这是让你执行一下,把PHP的环境变量加到系统中。

这时候,就可以运行pear install PHP_UML-1.5.2了,第一件郁闷的事情就发生了,系统提示,php_uml需要xsl的支持,因为我用的是绿色版的,所以我修改了一下我的php.ini后,继续执行时,仍然提示需要xsl,不是特别明白的时候,我看了一下我的php.ini,确认是加载了。但再次运行又是提示,最后我运行php --ini,才发现,原来命令行下用的php.ini居然是在c:\windows下面,而不是我绿色版中配置的php.ini文件。我把php.ini拷贝到c:\windows下后,程序可以顺利执行,安装完毕php_uml了。

第二件郁闷的事情接踵而至,按照上文的程序方式,我生成了xmi文件,却发现无法打开,怎么办?按照 文件提示下载了那个Altova MapForce【我还是翻墙下载的呢,这么辛苦都没有搞定,真郁闷,40多M啊】,结果还是无法打开xmi文件,悲剧就是这样产生的。反正我是白搞了这玩意了。因为我平时不用UML,所以也不知道如何打开xmi文件。郁闷,直到现在。。。

Tags: pear, phpuml, uml, xmi

表单提交按钮input和button的取舍

这篇文章我一直在纠结,是否要摘录过来,但我还是最终决定放上来了。
其实大家都知道,在网页中,可见的按钮有三种,一种是input,一种是button,最后一种,其实也不能管是按钮,它是由img转化而来的。最最常用的还是input和button,在以前的日子里,大家都习惯于用input,因为他直接拥有type=submit,而button没有,它更适合于表达button。
然而。。。

XML/HTML代码
  1. 首先,在IE6里,如果一个表单里有多个button形式的提交按钮,那么不管你点击其中哪个按钮,所有的button按钮都会被提交,而在IE7,8里则点击哪个按钮,才提交哪个button按钮。此时,如果想在服务端判断用户点击了哪个按钮,只能使用Javascript来处理。  

这点,在不同浏览器对回车提交表单的处理办法已经提过,但老王说的这个是变量的传递,以及在指定name的时候,POST变量的值的变化。不废话看原文:
最近写代码,处理很多表单,里面的Submit按钮有两种形式,分别是input和button,有点区别,做个试验:

先创建一个php文件demo.php, 用来接收表单数据:

<?php
var_dump($_POST);
?>

再创建一个html文件demo.html, 用来显示表单:

<form method="post" action="demo.php">
<input type="submit" name="foo" value="提交">
<input type="submit" name="bar" value="保存">
</form>

<form method="post" action="demo.php">
<button type="submit" name="foo" value="foo_value">提交</button>
<button type="submit" name="bar" value="bar_value">保存</button>
</form>

使用Firefox依次浏览,就能看到input和button的区别:input提交按钮显示的文字就是value,而button提交按钮显示的文字 和value是独立的,从这个意义上来看,button更有表现力,是更值得推荐的提交按钮实现方式。

可惜IE总是拖后腿,使用IETester里的 IE6,7,8分别浏览,就会发现button提交按钮在IE下有Bug:

首先,在IE6里,如果一个表单里有多个button形式的提交按钮,那么不管你点击其中哪个按钮,所有的button按钮都会被提交,而在IE7,8里 则点击哪个按钮,才提交哪个button按钮。此时,如果想在服务端判断用户点击了哪个按钮,只能使用Javascript来 处理。

另外,在IE6,7,8里,button形式的按钮在提交后,value属性都失效了,显示文字取代了value。

总结:从理论上来看,button形式的提交按钮优于input形式的提交按钮。但如果考虑浏览器通用性,很多时候还是只能使用input形式的提交按 钮。

参考:http://www.w3.org/TR/html401/interact/forms.html
老王的文章在:表 单提交按钮input和button的取舍

Tags: form, input, button

ySlow的计算公式

来自于hello,JavaScript的收藏,我也小小的收藏一下:

http://www.beiju123.cn/blog/?p=513
  1. F = 8×{100-[4×(JS文件数-3)+4×(CSS文件数-2)+3×(CSS背景图连接数-6) ] }  
  2.     +6×(100-10×未使用CDN的连接个数)  
  3.     +10×[100-11×(Expire时间小于172800秒的连接个数) ]  
  4.     +8×[100-11×(文件大小大于500字节且 未使用gzip的连接个数)]  
  5.     +4×[body中没有CSS连接 ? 100∶ (99-10×body中的CSS连接数) ]  
  6.     +4×(100-5×head中的JavaScript连接数)  
  7.     +3×[不存在CSS表达式 ?100: (90-2×CSS表达式数目) ]  
  8.     +3×[100-5×(域名数-4)]  
  9.     +4×(100-10×未精简的CSS与JS个数)  
  10.     +4×(100-10×Redirect个数)  
  11.     +4×[100-5×(重复的JavaScript个数+重复的CSS个数) ]  
  12.     +2×(100-11×未使用Etag的连接个数)  
  13.     +4×(100-5×未缓存或者缓存时间不足3600秒的AJAX请求个数)  
  14.     +3×(100-5×请求方式不是GET的AJAX个数)  
  15.     +3×{DOM元素数量<MaxDOM ?100∶ [99-10×⌈((DOM元素数量-900))/250⌉ ] }  
  16.     +4×(100-5×状态为404的连接个数)  
  17.     +3×[cookie大小不超过1000字节 ?100∶ (99-10×⌊页面cookie的大小/1000⌋ ) ]  
  18.     +3×(100-5×不满足cookie free要求的链接个数)  
  19.     +4×[100-(2×使用hack的filter个数+5×未使用hack的filter个数) ]  
  20.     +3×(100-5×在HTML代码中设定width和height的图片数)  
  21.     +2×[100-(favicon不可缓存或缓存时间小于3600秒 ? 5∶0)-(favicon大小超过2000字节? 5∶0)]  
  22.   
  23. Score = F / 89 

 

Tags: yslow