《PHP开发不能违背的安全规则 外部数据提交的处理4686.docx》由会员分享,可在线阅读,更多相关《PHP开发不能违背的安全规则 外部数据提交的处理4686.docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、规则 11:绝不不要信任任外部数数据或输输入关于于 Weeb 应应用程序序安全性性,必须须认识到到的第一一件事是是不应该该信任外外部数据据。外部部数据(outtsidde ddataa) 包包括不是是由程序序员在 PHPP 代码码中直接接输入的的任何数数据。在在采取措措施确保保安全之之前,来来自任何何其他来来源(比比如 GGET 变量、表表单 PPOSTT、数据据库、配配置文件件、会话话变量或或 coookiie)的的任何数数据都是是不可信信任的。例如如,下面面的数据据元素可可以被认认为是安安全的,因因为它们们是在 PHPP 中设设置的。清单 11. 安安全无暇暇的代码码1. 以下为引引用的内
2、内容: 2. $myUUserrnamme=tmmyerr;3. $arrrayUUserrs=arrrayy(tmmyerr,toom,ttommmy);4. defiine(GRREETTINGG,heelloothheree.$mmyUssernnamee);5. ? 但是是,下面面的数据据元素都都是有瑕瑕疵的。清单单 2. 不安安全、有有瑕疵的的代码1. 以下为引引用的内内容: 2. $myUUserrnamme=$_POSSTussernnamee;/taiinteed! 3. $arrrayUUserrs=arrrayy($myyUseernaame,ttom,ttommmy);/
3、taaintted! 4. defiine(GRREETTINGG,heelloothheree.$mmyUssernnamee);/ttainntedd! 5. ?为什什么第一一个变量量 $mmyUssernnamee 是有有瑕疵的的?因为为它直接接来自表表单 PPOSTT。用户户可以在在这个输输入域中中输入任任何字符符串,包包括用来来清除文文件或运运行以前前上传的的文件的的恶意命命令。您您可能会会问,“难难道不能能使用只只接受字字母 AA-Z 的客户户端(JJavaascrrptt)表单单检验脚脚本来避避免这种种危险吗吗?”是是的,这这总是一一个有好好处的步步骤,但但是正如如在后面面会看到
4、到的,任任何人都都可以将将任何表表单下载载 到自自己的机机器上,修修改它,然然后重新新提交他他们需要要的任何何内容。解决决方案很很简单:必须对对 $_POSSTuseernaame 运运行清理理代码。如如果不这这么做,那那么在使使用 $myUUserrnamme 的的任何其其他时候候(比如如在数组组或常量量中),就就可能污污染这些些对象。对用用户输入入进行清清理的一一个简单单方法是是,使用用正则表表达式来来处理它它。在这这个示例例中,只只希望接接受字母母。将字字符串限限制为特特定数量量的字符符,或者者要求所所有字母母都是小小写的,这这可能也也是个好好主意。清单单 3. 使用用户输入入变得安安全
5、1. 以下为引引用的内内容: 2. $myUUserrnamme=clleannInpput($_PPOSTTussernnamee);/clleann! 3. $arrrayUUserrs=arrrayy($myyUseernaame,ttom,ttommmy);/clleann! 4. defiine(GRREETTINGG,heelloothheree.$mmyUssernnamee);/ccleaan! 5. funcctioonccleaanInnputt($iinpuut)$clleann=strrtolloweer($innputt); 6. $cleean=ppregg_ree
6、plaace(/a-z/,$clleann); 7. $cleean=ssubsstr($clleann,0,12);reeturrn$clleann; 8. 9. ?规则 22:禁用用那些使使安全性性难以实实施的 PHPP 设置置已经经知道了了不能信信任用户户输入,还还应该知知道不应应该信任任机器上上配置 PHPP 的方方式。例例如,要要确保禁禁用 rregiisteer_gglobbalss。如果果启用了了 reegissterr_gllobaals,就就可能做做一些粗粗心的事事情,比比如使用用 $vvariiablle 替替换同名名的 GGET 或 PPOSTT 字符符串。通通过禁用用这
7、个设设置,PPHP 强迫您您在正确确的名称称空间中中引用正正确的变变量。要要使用来来自表单单 POOST 的变量量,应该该引用 $_PPOSTTvvariiablle。这样样就不会会将这个个特定变变量误会会成 ccookkie、会会话或 GETT 变量量。 规则 33:如果果不能理理解它,就就不能保保护它一些些开发人人员使用用奇怪的的语法,或或者将语语句组织织得很紧紧凑,形形成简短短但是含含义模糊糊的代码码。这种种方式可可能效率率高,但但是如果果您不理理解代码码正在做做什么,那那么就无无法决定定如何保保护它。例如如,您喜喜欢下面面两段代代码中的的哪一段段?清单 44. 使使代码容容易得到到保护
8、1. 以下为引引用的内内容: 2. /obbfusscattedcodde 3. $inpput=(issset($_PPOSTTussernnamee)?$_PPOSTTussernnamee:); 4. /unnobffusccateedccodee 5. $inpput=; 6. if(issset($_PPOSTTussernnamee) 7. $inpput=$_POOSTussernnamee; 8. elsse 9. $inpput=; 10. 11. ?在第第二个比比较清晰晰的代码码段中,很很容易看看出 $inpput 是有瑕瑕疵的,需需要进行行清理,然然后才能能安全地地处理。
9、规则 44:“纵纵深防御御” 是是新的法法宝本教教程将用用示例来来说明如如何保护护在线表表单,同同时在处处理表单单的 PPHP 代码中中采用必必要的措措施。同同样,即即使使用用 PHHP rregeex 来来确保 GETT 变量量完全是是数字的的,仍然然可以采采取措施施确保 SQLL 查询询使用转转义的用用户输入入。纵深深防御不不只是一一种好思思想,它它可以确确保您不不会陷入入严重的的麻烦。既然然已经讨讨论了基基本规则则,现在在就来研研究第一一种威胁胁:SQQL 注注入攻击击。防止止 SQQL 注注入攻击击在 SQLL 注入入攻击 中,用用户通过过操纵表表单或 GETT 查询询字符串串,将信信
10、息添加加到数据据库查询询中。例例如,假假设有一一个简单单的登录录数据库库。这个个数据库库中的每每个记录录都有一一个用户户名字段段和一个个密码字字段。构构建一个个登录表表单,让让用户能能够登录录。1. 2. 3. Loggin4. 5. 6. 7. Useernaame8. 9. 10. Passswoord11. 12. 13. 14. 15. 16. 这个个表单接接受用户户输入的的用户名名和密码码,并将将用户输输入提交交给名为为 veeriffy.pphp 的文件件。在这这个文件件中,PPHP 处理来来自登录录表单的的数据,如如下所示示:清单单 6. 不安安全的 PHPP 表单单处理代代码1
11、. 以下为引引用的内内容: 2. 3. cttr=11) 11. /theeyrreookayytooennterrthheaappllicaatioon! 12. $ookayy=1; 13. 14. 15. if($okkay) 16. $_SSESSSIONNlooginnokaay=truue; 17. heaaderr(iindeex.pphp); 18. elsse 19. heaaderr(llogiin.pphp); 20. 21. ?这段段代码看看起来没没问题,对对吗?世世界各地地成百(甚至成成千)的的 PHHP/MMySQQL 站站点都在在使用这这样的代代码。它它错在哪哪里
12、?好好,记住住 “不不能信任任用户输输入”。这这里没有有对来自自用户的的任何信信息进行行转义,因因此使应应用程序序容易受受到攻击击。具体体来说,可可能会出出现任何何类型的的 SQQL 注注入攻击击。例如如,如果果用户输输入 ffoo 作为用用户名,输输入 orr 11=1 作作为密码码,那么么实际上上会将以以下字符符串传递递给 PPHP,然然后将查查询传递递给 MMySQQL:1. 以下为引引用的内内容: 2. 3. 这个查询询总是返返回计数数值 11,因此此 PHHP 会会允许进进行访问问。通过过在密码码字符串串的末尾尾注入某某些恶意意 SQQL,黑黑客就能能装扮成成合法的的用户。解 决这个
13、个问题的的办法是是,将 PHPP 的内内置 mmysqql_rreall_esscappe_sstriing() 函函数用作作任何用用户输入入的包装装器。这这个函数数对字符符串中的的字符进进行转义义,使字字符串不不可能传传递撇号号等特殊殊字符并并让 MMySQQL 根根据特殊殊字符进进行操作作。清单单 7 展示了了带转义义处理的的代码。清单单 7. 安全全的 PPHP 表单处处理代码码1. 以下为引引用的内内容: 2. 3. cttr=11) 11. /theeyrreookayytooennterrthheaappllicaatioon! 12. $ookayy=1; 13. 14. 15.
14、 if($okkay) 16. $_SSESSSIONNlooginnokaay=truue; 17. heaaderr(iindeex.pphp); 18. elsse 19. heaaderr(llogiin.pphp); 20. 21. ?使用用 myysqll_reeal_esccapee_sttrinng() 作为为用户输输入的包包装器,就就可以避避免用户户输入中中的任何何恶意 SQLL 注入入。如果果用户尝尝试通过过 SQQL 注注入传递递畸形的的密码,那那么会将将以下查查询传递递给数据据库:1. 以下为引引用的内内容: 2. 3. seleectcouunt(*)ascctrfroomuuserrswwherreuuserrnamme=foooanddpassswoord=orr1=1limmit1