OGX-3 | 妳木有小雞雞

死亡不是无知,而是不表态。

Archive for the ‘php’ tag

用reCAPTCHA保護您的網站,防止垃圾郵件

with 2 comments

本來早已經睡覺了,可從兩個地方看到reCAPTCHA,不得不花點時間重新瞭解一下。

顯示從帕兰映像的一篇文章“9個php庫簡介和下載”看到這個庫,做為排行第一的肯定是要打開親自看看。

我就直接引用原文:

The reCAPTCHA 库让你可以为网站创建高级的 CAPTCHA 系统,这个系统其实是用来生成验证信息的,甚至包括语音验证。当然还有 reCAPTCHA 服务可以使用,其提供易用的免费 API,值得在你的网站试试。

當粗略看完他的doc後(Quickstart),收郵件又從google webMaster的blog看到類似的文章,也是有關介紹reCAPTCHA。不過我稍微看仔細了一點,發現了一句:

You can easily take advantage of this technology on your own site by using reCAPTCHA, a free service owned by Google. One unique aspect of reCAPTCHA is that data collected from the service is used to improve the process of scanning text, such as from books or newspapers. By using reCAPTCHA, you’re not only protecting your site from spammers; you’re helping to digitize the world’s books.

重點是這句:
a free service owned by Google.
速度還真快,在之前還在想,這麼好用的東西,google應該會收入麾下吧~結果還……

不過郵件是下午17點左右發的,至於reCAPTCHA是不是google自己的還是收購的,這種問題就不討論了。有free的用就很不錯,如果有空的話,能研究一下,生活就有趣了。

———–很久沒有使用的分割線———————-
網絡新名詞:費燈。

Written by beiwei

一月 28th, 2010 at 1:08 上午

Posted in 关乎饭碗的算是个事

Tagged with

飞机@:zend framework

without comments

很早就耳闻zend  framework 功能如何强大,今天终于让我见识一回。

显示sql语句的组合,强大的以致都没办法去分析它的效率。方便是不少,可是当需要的东西太多碰到多表联合,他出来的语句看的我头晕。看样子偷懒不是个好办法。

功能太强,引入文件太多,跑起来太慢,构建大型的应用绝对可以,但对中小型网站绝对不是一个很好的选择。如果非要选,可以选CodeIgniter或者fleaphp/qeephp,如果是商业性比较强的公司可以用自己的框架。

呃。。好像下午发现的就这两个问题,等我看完再继续。

以上只代表我个人片面的看法,如果你有不同意见,可以和我讨论和研究。

---------懒惰的分割线--------

呜呜。周末真的不好过啊。诚征能喝酒的女友一位。

Written by beiwei

三月 31st, 2009 at 1:09 上午

Posted in 关乎饭碗的算是个事

Tagged with ,

mysql 分表

without comments

web機這兩天負載有點偏高,在處理不到5K個請求時,訪問就有點慢了。但error日志卻沒查到什么,后來看mysql進程,發現大量的select和update消息表,造成鎖表。原來是db拖慢的原因。

消息表需要實時更新和查詢,但還要保證數據的準確性。想了一下,根據消息的狀態,對消息表進行縱向切分,這樣的話,把消息就可以放在兩張表,可以分開查和更新,不會影響很多。

花了半天時間修改,花半天時間測試和觀察,到目前為止發現,兩臺機器的負載降了60%,還有部分sql語句沒有優化。

這些問題在最初就已經講過,竟然沒人理。

寫自動執行程序,用循環、用in、跑回圈,最后被一句搞定:

  1. SELECT MAX(action_id),MAX(id) FROM table_name FORCE INDEX (action_time) WHERE action_time < ‘{$dateLimit}’

唯一不足的是使用強制索引,否則不會使用索引。

做程序員,別做代碼工。

---------我是分割線----------

電腦壞了,突然黑屏。拿到維修中心,推測出兩個問題:主板或者液晶屏。前天送去的,今天下午就好了,服務還不錯,就不知道修好沒有!

Written by beiwei

三月 19th, 2009 at 8:18 下午

Posted in 工作以外的那点破事

Tagged with ,

飞机@:链表

without comments

今天做图片排序时碰到一个问题,每次操作完都需要重新遍历和排序。这样就得不停的操作数据,但也没有什么好的方法可以走捷径。经过半个多小时思考后,终于想明白当时网易和国内一些大型论坛中帖子列表操作的那个视频。

记得当时那个牛人将了网易论坛帖子列表采用链表,解决文章删除编辑等操作所带来大量更新操作,就草草介绍一下,当时还真没想到。

当把图片排序做完後,发现原来重点是在于把指针的概念和数据表联系起来,这样的话,列表操作就变得简单起来。

大致思路:表里面多增加两个字段,一个用来保存前一条记录的主键,另外一个则保存后面记录的主键。这样的话,就可以按照双向链表的操作来操作这个表,并且数据保留还是删除都随你自己。也不会给数据库造成很大的压力。

链表(Linked list)(台湾称为连结串列)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表:顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。

详情请见http://zh.wikipedia.org/w/index.php?title=链表&variant=zh-cn

双链表的操作请见http://www.hiahia.org/datastructure/xianxingbiao/xianxingbiao2.3.3.htm

------懒惰的分割线-------

呜呜,周六喝酒喝的太多,弄破裤子和膝盖~睡到下午5点起床,发现半死不活的,好在出去打羽毛球,又慢慢活过来了。

Written by beiwei

三月 17th, 2009 at 12:18 上午

Posted in 关乎饭碗的算是个事

Tagged with ,

飞机@:imagemagick 缩图

with one comment

以前做项目,缩图使用GD,后来有了Imagemagick于是改用magickwand. 今天因为需求,试着又改写了缩图的类,加多两个方法,一个按照百分比压缩,另外一个取压缩后图片的大小,基本都没什么技术含量

  1. /**
  2. * 獲取裁剪後的圖片大小
  3. *
  4. * @param Source
  5. * @return Int (KB)
  6. **/
  7. public function getOpearteAfterImageSize($srcImage)
  8. {
  9. $obj = NewMagickWand();
  10. MagickReadImage($obj,$srcImage);
  11. $imageSize = ceil(MagickGetImageSize($obj) / 1024);
  12. return $imageSize;
  13. }
  1. /**
  2. * 切圖
  3. *
  4. * @param Source $srcImage
  5. * @param float $float
  6. *
  7. * @return magickWand Obj
  8. **/
  9. public function cutThumbImage($srcImage,$float = ’0.62′)
  10. {
  11. $obj = NewMagickWand();
  12. MagickReadImage($obj,$srcImage);
  13. $width = MagickGetImageWidth($obj);
  14. $height = MagickGetImageHeight($obj);
  15.  
  16. // 按照比例缩放
  17. $w = ceil($width * $float);
  18. $h = ceil($height * $float);
  19. MagickScaleImage($obj,$w,$h);
  20.  
  21. // 合成一個新的圖片
  22. $ndw = NewDrawingWand();
  23. DrawComposite($ndw,MW_AddCompositeOp,0,0,$w,$h,$obj);
  24. $res = NewMagickWand();
  25. // 添加一個設定寬高背景色的新空白圖像
  26. MagickNewImage($res,$w,$h,$black);
  27. // 上色
  28. MagickDrawImage($res,$ndw);
  29. MagickSetImageFormat($res,MagickGetImageFormat($obj));
  30.  
  31. return $res;
  32. }

Written by beiwei

三月 13th, 2009 at 2:56 上午

Posted in 关乎饭碗的算是个事

Tagged with

Open Flash Chart For PHP

without comments

之前做测试插件,要生成饼图。但一直不了解相关的知识,事隔好久,今天才找到这个好用的东东。

支持柱状,饼图,曲线等统计图表。名字叫OFC,官方网址http://teethgrinder.co.uk/open-flash-chart-2/

这可以下载他支持php的类

http://teethgrinder.co.uk/open-flash-chart/perl-python.php

看在线demo

http://teethgrinder.co.uk/open-flash-chart-2/adv-js-2-charts.php

---------分割线----------

一般先发表文章再收钱的,叫文章。先收钱再发表文章的,叫软文。发表了文章收不到钱的,叫博客。

Written by admin

三月 9th, 2009 at 1:04 上午

Posted in 关乎饭碗的算是个事

Tagged with ,

飞机@: php正则匹配

without comments

昨天在php.net看到使用ereg匹配的一个方法,这里记录一下,日后备用!

  1. <?php
  2.  
  3. function isValid($type,$var) {
  4.  
  5. $valid = false;
  6.  
  7. switch ($type) {
  8.  
  9. case "IP":
  10.  
  11. if (ereg(‘^([0-9]{1,3}\.){3}[0-9]{1,3}$’,$var)) {
  12.  
  13. $valid = true;
  14.  
  15. }
  16.  
  17. break;
  18.  
  19. case “URL”:
  20.  
  21. if (ereg("^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu)$",$var)) {
  22.  
  23. $valid = true;
  24.  
  25. }
  26.  
  27. break;
  28.  
  29. case “SSN”:
  30.  
  31. if (ereg("^[0-9]{3}[- ][0-9]{2}[- ][0-9]{4}|[0-9]{9}$",$var)) {
  32.  
  33. $valid = true;
  34.  
  35. }
  36.  
  37. break;
  38.  
  39. case “CC”:
  40.  
  41. if (ereg("^([0-9]{4}[- ]){3}[0-9]{4}|[0-9]{16}$",$var)) {
  42.  
  43. $valid = true;
  44.  
  45. }
  46.  
  47. break;
  48.  
  49. case “ISBN”:
  50.  
  51. if (ereg("^[0-9]{9}[[0-9]|X|x]$",$var)) {
  52.  
  53. $valid = true;
  54.  
  55. }
  56.  
  57. break;
  58.  
  59. case “Date”:
  60.  
  61. if (ereg("^([0-9][0-2]|[0-9])\/([0-2][0-9]|3[01]|[0-9])\/[0-9]{4}|([0-9][0-2]|[0-9])-([0-2][0-9]|3[01]|[0-9])-[0-9]{4}$",$var)) {
  62.  
  63. $valid = true;
  64.  
  65. }
  66.  
  67. break;
  68.  
  69. case “Zip”:
  70.  
  71. if (ereg("^[0-9]{5}(-[0-9]{4})?$",$var)) {
  72.  
  73. $valid = true;
  74.  
  75. }
  76.  
  77. break;
  78.  
  79. case "Phone":
  80.  
  81. if (ereg("^((\([0-9]{3}\) ?)|([0-9]{3}-))?[0-9]{3}-[0-9]{4}$",$var)) {
  82.  
  83. $valid = true;
  84.  
  85. }
  86.  
  87. break;
  88.  
  89. case “HexColor”:
  90.  
  91. if (ereg(‘^#?([a-f]|[A-F]|[0-9]){3}(([a-f]|[A-F]|[0-9]){3})?$’,$var)) {
  92.  
  93. $valid = true;
  94.  
  95. }
  96.  
  97. break;
  98.  
  99. case “User”:
  100.  
  101. if (ereg("^[a-zA-Z0-9_]{3,16}$",$var)) {
  102.  
  103. $valid = true;
  104.  
  105. }
  106.  
  107. break;
  108.  
  109. }
  110.  
  111. return $valid;
  112.  
  113. }
  114.  
  115. #Example:
  116.  
  117. $phone = "789-1234";
  118.  
  119. if (isValid("Phone",$phone)) {
  120.  
  121. echo "Valid Phone Number";
  122.  
  123. } else {
  124.  
  125. echo "Invalid Phone Number";
  126.  
  127. }
  128.  
  129. ?>

Written by beiwei

三月 5th, 2009 at 1:00 下午

Posted in 关乎饭碗的算是个事

Tagged with

十分钟临时邮箱[奇谈]

without comments

周末两天,注册会员有1600多人,未激活的不到70人,激活率高达99%.太不可思议了.

登录后台发现有部分马甲,并且mail都是合法的.难道是程序出问题了?还是注册流程不对?有漏洞?

检查完程序后也没有发现什么问题.于是就看这些会员的mail,大部分是以spamcorptastic.com结尾的邮件地址.处于好奇点开发现地址转到了http://10minutemail.com/,看名字已经大概知道是什么原因.

但对于接收邮件的实时性和准确性怎么保证呢?于是随便拿了一个10分钟后过期的mail注册,不出1分钟就收到系统发来的确认信件.md,太…..了

想了半天,用户没错,mail也没错.我没有理由把他们封掉,只好使用程序控制,只要是spamcorptastic.com的邮件地址,不允许注册.

  1. $mail = filter($_REQUIST['mail'];
  2. $needStr = strtolower(substr($mail,strpos($mail,’@')+1,strpos(substr($mail,strpos($mail,’@')+1),’.')));
  3. if (‘spamcorptastic’ == $needStr) {
  4. // 禁止注册
  5. }

这样算暂时搞定,可是没过两个小时又发现另外一个类似的网站.nowmymail.com

@@
然后继续重复上面的步骤.

最后算是简单的解决了,但如果以后类似的网站越来越多,该怎么办呢?我也没有发任何垃圾邮件~~

很佩服台湾网友的执着,封了上面两个网站后,他们就不停的注册yahoo帐号.然后继续回来

@@

Written by beiwei

三月 2nd, 2009 at 9:46 下午

Posted in 关乎饭碗的算是个事

Tagged with

確保php應用的安全性

without comments

貼個簡單的php中最常見也最多犯的錯誤:

sql注入、操縱get和post變量、緩沖區溢出攻擊、跨站點腳本攻擊、瀏覽器內的數據操控、遠程表單的遞交。

1 sql注入:

使用php自帶的函數mysql_real_escape_string()過濾不安全的字符。

2 防止用戶操縱變量

使用正則表達式,比如一個整型,可以這樣設置:

$pid = $_GET['pid'];
if (!ereg("^[0-9]+$",$pid)) {
// throw error
}

3 緩沖區溢出攻擊,比如數據庫字段長度5,但輸入一個超過5的變量。所以要做數據合法性驗證的同時,還要驗證長度。

if (!ereg("^[0-9]+&",$pid) && strlen($pid) > 5) {
// throw error
}

4 跨站腳本的攻擊,php自帶strip_tags()函數可以過濾掉部分。然后再使用htmlspecialchars()。
5 瀏覽器內的數據操作。
會員會經常使用一些輔助工具來瀏覽表單或者我們隱藏的字段和值,然后猜sql語句。對于這些,建議使用簡寫或者把一些重要的字段加密,然后在php端解密。
6表單的遠程遞交
建議使用令牌機制,服務器端設置令牌即可。

$_SESSION['token'] = md5(time());
$token = $_SESSION['token'];

在客戶端輸出$token,然后判斷即可。

Written by beiwei

二月 26th, 2009 at 8:21 下午

Posted in 关乎饭碗的算是个事

Tagged with

輕量級數據庫sqlite學習

with 2 comments

在看phprpc相關資料時發現有一個取級聯菜單的例子,于是想拿過來自己測試一下,順便學習一下php5 新帶的sqlite.

1 什么是sqlite

SQLite的官方网站上是这样定义SQLite的:

SQLite是一个软件库,用于实现自包含非服务式零配置事务化的SQL数据库引擎。
SQLite 是一个嵌入式SQL数据库引擎,与其它大多数SQL数据库不同的是,SQLite没有独立的服务进程。SQLite直接读写原始的磁盘文件,一个拥有多个 表、索引、触发器和视图的完整SQL数据库就包含在一个独立的磁盘文件中。数据库文件的格式是跨平台的,你可以在32位和64位系统之间、甚至在Big-EndianLittle-Endian(译者注:这是两种不同的字节排序方式,Big-Endian是指一个word中的高位Byte是放在内存word区域的低地址处,而Little-Endian则与之相反)两种不同的架构间自由地拷贝数据库,这一特性让SQLite成为应用文件格式的一种流行选择。SQLite不能替代Oracle,但可以考虑作为fopen()的替代方法。
SQLite已经是世界上布署得最广泛的SQL数据库引擎,被用在无以计数的桌面电脑应用中,还有消费电子设备中,如移动电话、掌上电脑和MP3播放器等。SQLite的源码就放在公有领域(即WikiPedia的public domain)中。

Read the rest of this entry »

Written by admin

十一月 15th, 2008 at 5:53 下午

Posted in 关乎饭碗的算是个事

Tagged with ,