设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 编程开发 >> 网络编程 >> PHP教程 >> 确保PHP安全,不能违反的四条安全规则
精品推荐
PHP教程点击TOP10
·十天学会php之第一天
·绝对简单易学的PHP入门教程
·PHP 和 MySQL 基础教程(一)
·十天学会php之第二天
·详细讲解PHP编程中分页显示的制作
·PHP新手上路(一)
·十天学会php之第三天
·十天学会php之第四天
·十天学会php之第七天
·实例研究PHP函数isset和empty的区别
网络编程点击TOP10
·ASP.NET 程序中常用的三十三种代码
·从零开始学ASP.NET(基础篇)
·『原创』C#中TreeView类操作全攻略:建立树,新增节点,删除节点,修改节点,拖动节点,与Oracle数据库交互操作(一)
·C#编写的windows计算器-源代码
·官方水晶报表 .NET 应用程序实例下载 (C#、Visual C++.NET)
·VS.net 2005 Beta 下载地址(Express Edition)
·ASP.NET2.0下含有DropDownList的GridView编辑、删除的完整例子!
·c#操作word表格
·.NET 初 级 读 本
·用C#实现木马程序
精选专题

确保PHP安全,不能违反的四条安全规则

作者: 来源:http://www.xgdown.com/ 时间:2007-8-29 8:12:38

确保PHP安全,不能违反的四条安全规则(3)     header("index.php");
}else{
    header("login.php");
}
?>

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

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

<?php
$sql = "select count(*) as ctr  from users where username='foo' and password='' or '1'='1' limit 1";
?>

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

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

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

<?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 注入传递畸形的密码,那么会将以下查询传递给数据库:

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

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

但是,还有几个安全漏洞需要堵住。下一项是操纵 GET 变量。

防止用户操纵 GET 变量

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

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

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

清单 8. 示例 template.php

<?php

共9页 9 7 [1] [2] [3] [4] [5] [6] [7] [8] [98 :>

确保PHP安全,不能违反的四条安全规则 相关文章:
确保PHP安全,不能违反的四条安全规则 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com