当前位置:首页>网络学院>程序开发>PHP教程>文章内容

PHP程序开发过程应遵从的四条安全规则

[ 来源:http://www.it55.com | 作者: | 时间:2007-08-26 | 收藏 | 推荐 ] 【


    if ($data->ctr == 1){
        //they're okay to enter the application!
        $okay = 1;
    }
} http://www.it55.com/

if ($okay){
    $_SESSION['loginokay'] = true;
    header("index.php");
}else{
    header("login.php");
}
?> 免费壁纸下载http://www.it55.com

这 段代码看起来没问题,对吗?世界各地成百(甚至成千)的 PHP/MySQL 站点都在使用这样的代码。它错在哪里?好,记住 “不能信任用户输入”。这里没有对来自用户的任何信息进行转义,因此使应用程序容易受到攻击。具体来说,可能会出现任何类型的 SQL 注入攻击。 精美商业网页模版下载http://www.it55.com

例如,如果用户输入 foo 作为用户名,输入 ' or '1'='1 作为密码,那么实际上会将以下字符串传递给 PHP,然后将查询传递给 MySQL:

sflj http://www.it55.com kg^&fgd

<?php
$sql = "select count(*) as ctr  from users where username='foo' and password='' or '1'='1' limit 1";
?> http://www.it55.com/

这个查询总是返回计数值 1,因此 PHP 会允许进行访问。通过在密码字符串的末尾注入某些恶意 SQL,黑客就能装扮成合法的用户。 IT资讯之家 http://www.it55.com

解 决这个问题的办法是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义,使字符串不可能传递撇号等特殊字符并让 MySQL 根据特殊字符进行操作。清单 7 展示了带转义处理的代码。

精美商业网页模版下载http://www.it55.com

清单 7. 安全的 PHP 表单处理代码

http://www.it55.com在线教程

<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];

精美商业网页模版下载http://www.it55.com

$sql = "select count(*) as ctr from users where username='".mysql_real_escape_string($username)."' and password='". mysql_real_escape_string($pw)."' limit 1"; it55.com

$result = mysql_query($sql); vd;k;l http://www.it55.com rdfg

while ($data = mysql_fetch_object($result)){
    if ($data->ctr == 1){
        //they're okay to enter the application!
        $okay = 1;
    }
} vd;k;l http://www.it55.com rdfg

if ($okay){
    $_SESSION['loginokay'] = true;
    header("index.php");
}else{
    header("login.php");
}
?>

http://www.it55.com

使用 mysql_real_escape_string() 作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入。如果用户尝试通过 SQL 注入传递畸形的密码,那么会将以下查询传递给数据库:

免费网页模版下载http://www.it55.com

select count(*) as ctr from users where username='foo' and password='\' or \'1\'=\'1' limit 1"

http://www.it55.com在线教程

数据库中没有任何东西与这样的密码匹配。仅仅采用一个简单的步骤,就堵住了 Web 应用程序中的一个大漏洞。这里得出的经验是,总是应该对 SQL 查询的用户输入进行转义。 http://www.it55.com在线教程

但是,还有几个安全漏洞需要堵住。下一项是操纵 GET 变量。 http://www.it55.com

  免费网页模版下载http://www.it55.com


防止用户操纵 GET 变量

http://www.it55.com

在前一节中,防止了用户使用畸形的密码进行登录。如果您很聪明,应该应用您学到的方法,确保对 SQL 语句的所有用户输入进行转义。 http://www.it55.com/

但 是,用户现在已经安全地登录了。用户拥有有效的密码,并不意味着他将按照规则行事 —— 他有很多机会能够造成损害。例如,应用程序可能允许用户查看特殊的内容。所有链接指向 template.php?pid=33 或 template.php?pid=321 这样的位置。URL 中问号后面的部分称为查询字符串。因为查询字符串直接放在 URL 中,所以也称为 GET 查询字符串。

http://www.it55.com/

在 PHP 中,如果禁用了 register_globals,那么可以用 $_GET['pid'] 访问这个字符串。在 template.php 页面中,可能会执行与清单 8 相似的操作。

vd;k;l http://www.it55.com rdfg

清单 8. 示例 template.php

http://www.it55.com在线教程

<?php
$pid = $_GET['pid']; IT资讯之家 http://www.it55.com

//we create an object of a fictional class Page
$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page
?> 免费壁纸下载http://www.it55.com

  免费网页模版下载http://www.it55.com

这 里有什么错吗?首先,这里隐含地相信来自浏览器的 GET 变量 pid 是安全的。这会怎么样呢?大多数用户没那么聪明,无法构造出语义攻击。但是,如果他们注意到浏览器的 URL 位置域中的 pid=33,就可能开始捣乱。如果他们输入另一个数字,那么可能没问题;但是如果输入别的东西,比如输入 SQL 命令或某个文件的名称(比如 /etc/passwd),或者搞别的恶作剧,比如输入长达 3,000 个字符的数值,那么会发生什么呢?

精美商业网页模版下载http://www.it55.com

在这种情况下,要记住基本规则,不要信任用户输入。应用程序开发人员知道 template.php 接受的个人标识符(PID)应该是数字,所以可以使用 PHP 的 is_numeric() 函数确保不接受非数字的 PID,如下所示: http://www.it55.com

清单 9. 使用 is_numeric() 来限制 GET 变量

精美韩国模版下载http://www.it55.com

<?php
$pid = $_GET['pid'];

免费矢量图片素材下载http://www.it55.com

if (is_numeric($pid)){
    //we create an object of a fictional class Page
    $obj = new Page;
    $content = $obj->fetchPage($pid);
    //and now we have a bunch of PHP that displays the page
}else{
    //didn't pass the is_numeric() test, do something else!
}
?>

免费资源http://www.it55.com

这个方法似乎是有效的,但是以下这些输入都能够轻松地通过 is_numeric() 的检查: IT资讯之家 http://www.it55.com

100 (有效)
100.1 (不应该有小数位)
+0123.45e6 (科学计数法 —— 不好)
0xff33669f (十六进制 —— 危险!危险!) it55.com

那么,有安全意识的 PHP 开发人员应该怎么做呢?多年的经验表明,最好的做法是使用正则表达式来确保整个 GET 变量由数字组成,如下所示:

(编辑:IT资讯之家 www.it55.com

返回顶部
共5页: 上一页 [1] 2 [3] [4] [5] 下一页  

网友评论

[以下评论为网友观点,不代表本站。请自觉遵守互联网相关政策法规,所有连带责任均有评论者自负。]
[不超过250字]

图片文章