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

php中addslashes() ,mysql_real_escape_string() 和mysql_escape_string() 的区别

以前还真没有关注过这面的事情。自己在写的时候都是用了一个很简单的函数

PHP代码
  1. <?php  
  2. function escape($str){  
  3.     if(function_exists('mysql_escape_string')){  
  4.          return mysql_escape_string($str);  
  5.     }elseif( function_exists(...real_escape...)){  
  6.        //real_escape  
  7.     }else{  
  8.         if(MAGIC_QUOTER ....判断){  
  9.              return $str  
  10.         }else{  
  11.             return addslashes($str);  
  12.         }  
  13.     }  
  14. }  

但是这篇文章却告诉我,原来这三个函数的功能各有不同,前两个我当然知道,但如果没有加载mysql库,这两个功能是都用不上的,当然,现在有PDO的prepare然后setParam当然是很方便,mysqli函数也有这种功能。如果没有呢?怎么办?下面这篇文章告诉你上面三个函数的区别
来源:http://www.akii.org/2009-08/php-in-the-addslashes-mysql_real_escape_string-and-mysql_escape_string-the-difference-between/

SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。

为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加 上反斜杠\。

但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用。所以,我们还需要使用其它多种方法来防止SQL注入。

许多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有addslashes()、 mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符和可能引起数据库操作出错的字 符转义。那么这三个功能函数之间有什么却别呢?下面我们就来详细讲述下。

虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入,还是建议大家加强中文防止SQL注入的检查。addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会 被看作是单引号,所以addslashes无法成功拦截。

当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。

另外对于php手册中get_magic_quotes_gpc的举例:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}
最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[’lastname’]进行检查一下。

再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。

总结一下:

* addslashes() 是强行加\;
* mysql_real_escape_string()  会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集。

Tags: mysql, addslashes

几行代码实现文件打包下载

短短几行代码实现文件打包下载。。。

PHP代码
  1. /** 
  2.  * 没有写成class 或者 function ,需要的朋友自己写,就这么几行。。 
  3.  */  
  4. $filename = "./test/test.zip"//最终生成的文件名(含路径)  
  5. if(!file_exists($filename)){  
  6.     //重新生成文件  
  7.     $zip = new ZipArchive();//使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释  
  8.     if ($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE) {  
  9.         exit('无法打开文件,或者文件创建失败');  
  10.     }  
  11.     foreach$datalist as $val){  
  12.         $attachfile = $attachmentDir . $val['filepath'];    //获取原始文件路径  
  13.         if(file_exists($attachfile)){  
  14.             $zip->addFile( $attachfile , basename($attachfile));//第二个参数是放在压缩包中的文件名称,如果文件可能会有重复,就需要注意一下  
  15.         }  
  16.     }  
  17.     $zip->close();//关闭  
  18. }  
  19. if( !file_exists($filename)){  
  20.     exit("无法找到文件"); //即使创建,仍有可能失败。。。。  
  21. }  
  22. header("Cache-Control: public");   
  23. header("Content-Description: File Transfer");   
  24. header('Content-disposition: attachment; filename='.basename($filename)); //文件名  
  25. header("Content-Type: application/zip"); //zip格式的  
  26. header("Content-Transfer-Encoding: binary");    //告诉浏览器,这是二进制文件   
  27. header('Content-Length: 'filesize($filename));    //告诉浏览器,文件大小  
  28. @readfile($filename);         

Tags: php, 文件下载, zip压缩

关注张宴:利用开源的Gearman框架构建分布式图片处理平台

关注一下张宴的这篇【利用开源的Gearman框架构建分布式图片处理平台】,网址为:http://blog.s135.com/dips/

正如张宴一开始说的:
大小: 46.72 K
尺寸: 294 x 325
浏览: 1486 次
点击打开新窗口浏览全图

如何把这些闲置资源利用起来才是真的。之所以不转载,是因为,我目前还遇不到这类事情,但了解一下总是好的。。。
顺便转载了PPT和一些软件的安装
ksg_xoyo_dips.pdf



附1:Gearman分布式计算框架网址
http://gearman.org/

附2:PHP客户端Gearman扩展安装:

wget http://www.monkey.org/~provos/libevent-1.4.12-stable.tar.gz
tar zxvf libevent-1.4.12-stable.tar.gz
cd libevent-1.4.12-stable/
./configure --prefix=/usr
make && make install
/sbin/ldconfig
cd ../

wget http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz
tar zxvf gearmand-0.9.tar.gz
cd gearmand-0.9/
./configure
make
make install
/sbin/ldconfig
cd ../

wget http://pecl.php.net/get/gearman-0.5.0.tgz
tar zxvf gearman-0.5.0.tgz
cd gearman-0.5.0
/usr/local/webserver/php/bin/phpize
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-gearman
make
make install
cd ../



php.ini文件中增加:

extension = "gearman.so"


附3:Gearman调度器安装(JOB Server):

wget http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz
tar zxvf gearmand-0.9.tar.gz
cd gearmand-0.9/
./configure
make
make install
/sbin/ldconfig
cd ../



以守护进程启动:

gearmand -L 192.168.0.1 -p 4730  -u root -d

Tags: 分布式, php处理图片

Nio认为:php的curl库在生成cookie文件时要及时清除

Nio在http://www.nioxiao.com/archives/949里说到,php的CURL库生成cookie文件时,应当及时清除,否则会发生意料不到的事情

对于php的curl,我想,在我的博客上有一篇介绍校内狗狗的文章,是yhustc写的。他就用到了这个cookie文件。主要是phpcurl在访问时,会把当前的cookie全部写到这个文件里。如果是个人使用,当然是没问题。如果要提供服务给别人,估计就会发现cookie文件不停的写,而且内容都不一样【估计这就是nio遇到的问题吧】

bopo则改进了yhustc的http类,他用的是tmpnam函数,生成一个唯一的,不同的文件。只要在进程内。文件都不会变啦。呵呵

我当初是判断用户登录,每个用户分配一个cookie文件,保证不会和其他人产生冲突。。。HOHO

但看看Nio说的最后一句话,又不太像,他说:

http://www.nioxiao.com/archives/949
  1. 特别需要注意的是,在完成抓取之后,需要把 cookie 文件删除,否则下次抓取时会自动使用原有的 cookie 数据,从而导致一些预想不到的错误(我们今天就被这个问题折腾了很久 :( )。  

 

但,好象每次访问都会生成新的cookie内容的吧?除非确实需要清空?这个问题,我是没有遇到过,暂时先记录一下。。

 

RegexIterator匹配和修改迭代器的数据集

本文来自phpCq.com,没有测试,主要是看了一下,它可以对数据进行正则匹配,想来对那些写文本数据库的人很方便吧?
取出一堆数据,平时用strpos来定位来判断,现在可以直接用数组的正则匹配,直接判断好。呵呵

 

http://www.phpcq.com/id/116.html
  1. <?php  
  2. /** 
  3. * 初定义数组... 
  4. * @author:PHP博客-技术-资源-技术站-面向对象  
  5.  */  
  6.     $array = array('apple','avocado','orange','pineapple');  
  7.     /** 
  8.      * 创建迭代器 
  9.      */  
  10.     $arrIterator = new ArrayIterator($array);  
  11.     /** 
  12.      * 使用正则表达式模式来匹配和修改迭代器的数据 
  13.      */  
  14.     $iterator = new RegexIterator($arrIterator,'/^a/');  
  15.       
  16.     print_r(iterator_to_array($iterator));  
  17.     /** 
  18.      * 输出结果:Array ( [0] => apple [1] => avocado )  
  19.      */  
  20. ?>        

Tags: regexiterator, 迭代器