仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 781|回复: 19
打印 上一主题 下一主题

[学习教程] PHP网页编程之PHP开辟不克不及违反的平安划定规矩

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:30:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
即使你理解不了PHP,但是也必须先跟它混个脸熟,看,一遍遍的看,看的同时一边琢磨,一边按照它所教的打代码,即使你搞不清楚那些代码到底是干嘛的,但是起码你应该找找感觉。    作为PHP法式员,出格是老手,关于互联网的邪恶老是晓得的太少,关于内部的入侵有良多时分是素手无策的,他们基本不晓得黑客是若何入侵的、提交入侵、上传破绽、sql 注入、跨剧本进击等等。作为最根基的提防你需求注重你的内部提交,做好第一面平安机制处置防火墙。
   
  划定规矩 1:毫不要信赖内部数据或输出
  关于Web使用法式平安性,必需熟悉到的第一件事是不该该信赖内部数据。内部数据(outside data) 包含不是由法式员在PHP代码中直接输出的任何数据。在接纳办法确保平安之前,来自任何其他来历(好比 GET 变量、表单 POST、数据库、设置装备摆设文件、会话变量或 cookie)的任何数据都是不成信赖的。
  例如,上面的数据元素可以被以为是平安的,由于它们是在PHP中设置的。
复制代码

    1. 清单 1. 平安
      得空
      的代码  
    复制代码

  • $myUsername = ‘tmyer’;   
  • $arrayarrayUsers = array(‘tmyer’, ‘tom’, ‘tommy’);   
  • define(“GREETING”, ‘hello there’ . $myUsername);   
  • ?>  
  然而,上面的数据元素都是有瑕疵的。
复制代码

    1. 清单 2. 不平安
      、有瑕疵的代码  
    复制代码

  • $myUsername = $_POST['username']; //tainted!   
  • $arrayarrayUsers = array($myUsername, ‘tom’, ‘tommy’); //tainted!   
  • define(“GREETING”, ‘hello there’ . $myUsername); //tainted!   
  • ?>  
  为何第一个变量$myUsername 是有瑕疵的?由于它直接来自表单 POST。用户可以在这个输出域中输出任何字符串,包含用来排除文件或运转之前上传的文件的歹意号令。您能够会问,“岂非不克不及利用只承受字母 A-Z 的客户端(Javascrīpt)表单查验剧本来防止这类风险吗?”是的,这老是一个有优点的步调,然而正如在前面会看到的,任何人都可以将任何表单下载到本人的机械上,修正它,然后从头提交他们需求的任何内容。
  处理计划很复杂:必需对$_POST['username'] 运转清算代码。假如不这么做,那末在利用$myUsername的任何其他时分(好比在数组或常量中),便可能净化这些对象。对用户输出停止清算的一个复杂办法是,利用正则表达式来处置它。在这个示例中,只但愿承受字母。将字符串限制为特定命量的字符,或请求一切字母都是小写的,这能够也是个好主张。
复制代码

    1. 清单 3. 利用
      户输出
      变得平安
        
    复制代码

  • $myUsername = cleanInput($_POST['username']); //clean!   
  • $arrayarrayUsers = array($myUsername, ‘tom’, ‘tommy’); //clean!   
  • define(“GREETING”, ‘hello there’ . $myUsername); //clean!   
  • function cleanInput($input){   $clean = strtolower($input);   
  • $clean = preg_replace(“/[^a-z]/”, “”, $clean);   
  • $clean = substr($clean,0,12);return $clean;   
  • }   
  • ?>  
  划定规矩 2:禁用那些使平安性难以实行的PHP设置
  已晓得了不克不及信赖用户输出,还应当晓得不该该信赖机械上设置装备摆设 PHP 的体例。例如,要确保禁用 register_globals。假如启用了 register_globals,便可能做一些大意的工作,好比利用 $variable 交换同名的 GET 或 POST 字符串。经由过程禁用这个设置,PHP 强制您在准确的称号空间中援用准确的变量。要利用来自表单 POST 的变量,应当援用 $_POST['variable']。如许就不会将这个特定变量误解成 cookie、会话或 GET 变量。
  划定规矩 3:假如不克不及了解它,就不克不及回护它
  一些开辟人员利用奇异的语法,或将语句组织得很紧凑,构成冗长然而寄义恍惚的代码。这类体例能够效力高,然而假如您不睬解代码正在做甚么,那末就没法决意若何回护它。例如,您喜好上面两段代码中的哪一段?
复制代码

    1. 清单 4. 使代码轻易
      失掉
      回护
        
    复制代码

  • //obfuscated code   
  • $input = (isset($_POST['username']) ? $_POST['username']:”);   
  • //unobfuscated code   
  • $input ='';   
  • if (isset($_POST['username'])){   
  • $input = $_POST['username'];   
  • }else{   
  • $input ='';   
  • }  
  在第二个对照明晰的代码段中,很轻易看出 $input 是有瑕疵的,需求停止清算,然后才干平安地处置。
  划定规矩 4:“纵深进攻” 是新的宝贝
  本教程将用示例来讲明若何回护在线表单,同时在处置表单的 PHP 代码中采取需要的办法。一样,即便利用 PHP regex 来确保 GET 变量完整是数字的,依然可以接纳办法确保 SQL 查询利用本义的用户输出。纵深进攻不只是一种好思惟,它可以确保您不会堕入严重的费事。既然已会商了根基划定规矩,如今就来研讨第一种威逼:SQL 注入进击。
  ◆避免SQL注入进击
  在SQL注入进击中,用户经由过程把持表单或 GET 查询字符串,将信息添加到数据库查询中。例如,假定有一个复杂的登录数据库。这个数据库中的每一个纪录都有一个用户名字段和一个暗码字段。构建一个登录表单,让用户可以登录。
复制代码

    1. <html>
    复制代码

  • <head>  
  • <title>Login</title>  
  • </head>  
  • <body>  
  • <form action=”verify.php” method=”post”>  
  • <p><label for=’user’>Username</label>  
  • <input type=’text’ name=’user’ id=’user’/>  
  • </p> <p><label for=’pw’>Password</label>  
  • <input type=’password’ name=’pw’ id=’pw’/>  
  • </p> <p><input type=’submit’ value=’login’/></p>  
  • </form>  
  • </body>  
  • </html>  
  这个表单承受用户输出的用户名和暗码,并将用户输出提交给名为verify.php的文件。在这个文件中,PHP处置来自登录表单的数据,以下所示:
复制代码

    1. 清单 1. 平安
      得空
      的代码  1
    复制代码

  • <?php  
  • $okay = 0;   
  • $username = $_POST['user'];   
  • $pw = $_POST['pw'];   
  • $sql = “select count(*) as ctr from users where username=’”.$username.”‘ and password=’”. $pw.”‘ limit 1&Prime;;   
  • $result = mysql_query($sql);   
  • while ($data = mysql_fetch_object($result)){   
  • if ($data->ctr == 1){   
  • //they’re okay to enter the application!   
  • $okay = 1;   
  • }   
  • }   
  • if ($okay){   
  • $_SESSION['loginokay'] = true;   
  • header(“index.php”);   
  • }else{   
  • header(“login.php”);   
  • }   
  • ?>  
  这段代码看起来没成绩,对吗?世界各地成百(乃至成千)的 PHP/MySQL 站点都在利用如许的代码。它错在哪里?好,记住 “不克不及信赖用户输出”。这里没有对来自用户的任何信息停止本义,因而使使用法式轻易遭到进击。详细来讲,能够会呈现任何类型的SQL注入进击。例如,假如用户输出 foo 作为用户名,输出 ‘ or ’1&prime;=’1 作为暗码,那末实践上会将以下字符串传递给 PHP,然后将查询传递给 MySQL:
复制代码

    1. 清单 1. 平安
      得空
      的代码  3
    复制代码

  • $sql = “select count(*) as ctr from users where username=’foo’ and password=” or ’1&prime;=’1&prime; limit 1&Prime;;   
  • ?>  
  这个查询老是前往计数值 1,因而 PHP 会答应停止会见。经由过程在暗码字符串的末尾注入某些歹意 SQL,黑客就可以打扮成正当的用户。处理这个成绩的举措是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输出的包装器。这个函数对字符串中的字符停止本义,使字符串不成能传递撇号等特别字符并让 MySQL 依据特别字符停止操作。清单7展现了带本义处置的代码。
复制代码

    1. 清单 1. 平安
      得空
      的代码  5
    复制代码

  • <?php     
  • $okay = 0;     
  • $username = $_POST['user'];     
  • $pw = $_POST['pw'];     
  • $sql = "select count(*) as ctr from users where username='".mysql_real_escape_string($username)."' and password='". mysql_real_escape_string($pw)."' limit 1";      
  • $result = mysql_query($sql);     
  • while ($data = mysql_fetch_object($result)){         
  •         if ($data->ctr == 1){          //they're okay to enter the application!            
  •         $okay = 1;         
  •         }     
  •        }     
  •         if ($okay){         
  •             $_SESSION['loginokay'] = true;         
  •             header("index.php");     
  •             }   
  •          else{         
  •          header("login.php");     
  •        }     
  • ?>  
  利用 mysql_real_escape_string() 作为用户输出的包装器,就能够防止用户输出中的任何歹意 SQL 注入。假如用户测验考试经由过程 SQL 注入传递畸形的暗码,那末会将以下查询传递给数据库:
复制代码

    1. 清单 1. 平安
      得空
      的代码  7
    复制代码

  •    
看到好的帖子最好up一下,以使得更多的人得到分享。
活着的死人 该用户已被删除
沙发
发表于 2015-2-4 00:04:01 | 只看该作者
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
小魔女 该用户已被删除
板凳
发表于 2015-2-6 16:34:18 | 只看该作者
首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。
分手快乐 该用户已被删除
地板
发表于 2015-2-8 06:54:00 | 只看该作者
对于初学者来说不推荐去拿钱买的。当然如果一个网站你经常去用,而且里面的资料也比较有用,最好还是买个会员比较好,毕竟那些也是别人的工作成果。
再见西城 该用户已被删除
5#
发表于 2015-2-24 18:50:30 | 只看该作者
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
因胸联盟 该用户已被删除
6#
发表于 2015-3-7 12:57:16 | 只看该作者
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
柔情似水 该用户已被删除
7#
发表于 2015-3-12 03:46:53 | 只看该作者
你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-16 14:10:10 | 只看该作者
当然这种网站的会员费就几十块钱。
老尸 该用户已被删除
9#
发表于 2015-3-17 01:06:31 | 只看该作者
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
飘灵儿 该用户已被删除
10#
发表于 2015-3-17 06:12:34 | 只看该作者
php里的数组为空的时候是不能拿来遍历的;(这个有点低级啊,不过我刚被这个边界问题墨迹了好长一会)
灵魂腐蚀 该用户已被删除
11#
发表于 2015-3-17 12:09:35 | 只看该作者
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
莫相离 该用户已被删除
12#
发表于 2015-3-20 01:02:40 | 只看该作者
我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
精灵巫婆 该用户已被删除
13#
发表于 2015-3-27 01:21:52 | 只看该作者
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
第二个灵魂 该用户已被删除
14#
发表于 2015-4-11 08:10:08 | 只看该作者
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
变相怪杰 该用户已被删除
15#
发表于 2015-4-17 11:48:55 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
若相依 该用户已被删除
16#
发表于 2015-4-23 03:02:37 | 只看该作者
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
只想知道 该用户已被删除
17#
发表于 2015-4-28 17:53:53 | 只看该作者
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
小妖女 该用户已被删除
18#
发表于 2015-5-1 11:19:45 | 只看该作者
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的
再现理想 该用户已被删除
19#
发表于 2015-5-1 17:09:20 | 只看该作者
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。
金色的骷髅 该用户已被删除
20#
发表于 2015-6-6 13:01:51 | 只看该作者
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 13:34

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表