PHP手册整理 - 安全【参数过滤、防止SQL 注入、隐藏PHP信息等】

客户端提交的参数过滤:

// 不严谨的示例代码:
$file = $_GET['file'];  // "../../etc/passwd"
if ( file_exists('/home/wwwrun/' . $file . '.php' )) {
     include  '/home/wwwrun/' . $file . '.php' ;
}

// 因此,任何用于操作文件系统的字符串(译注:特别是程序外部输入的字符串)都必须经过适当的检查。
// 以下是上述例子的改进版本: 

// 验证输入的正确做法,对字符串进行白名单检查
$file  =  $_GET [ 'file' ]; 
switch ( $file ) {
	case  'main' :
	case  'foo' :
	case  'bar' :
		include  '/home/wwwrun/include/' . $file . '.php' ;
		break;
	default:
		include  '/home/wwwrun/include/main.php' ;
}

设计数据库:

--用户权限分配
1、所有者(或超级用户)才有权对数据库中的对象进行任意操作,在项目中尽量不要使用数据库所有者
或超级用户帐号来连接数据库,因为这些帐号可以执行任意的操作,比如说修改数据库结构(例如删除
一个表)或者清空整个数据库的内容。
2、根据不同的业务需求创建不同的数据库帐号,仅分配给能完成其功能所需的权限,尽量避免同一个用户
可以完成另一个用户的事情,这样即使攻击者利用程序漏洞取得了数据库的访问权限,也最多只能做到和
该账号一样的影响范围。

--连接数据库
尽量使用内网IPSSL加密技术。

--加密存储模型
1PHP有几个扩展库可以完成这个工作,比如说 Mcrypt 和 hash 等,它们包含多种加密运算法则,
脚本在插入数据库之前先把数据加密,以后提取出来时再解密。
2、对某些真正隐蔽的数据,如果不需要以明文的形式存在(即不用显示),可以考虑用散列算法。使用散
列算法最常见的例子就是把密码经过 MD5 加密后的散列存进数据库来代替原来的明文密码。

防止SQL 注入:

// 存储密码散列
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');", pg_escape_string($username), md5($password));
$result = pg_query($connection, $query);

// 发送请求来验证用户密码
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';", pg_escape_string($username), md5($password));
$result = pg_query($connection, $query);

if (pg_num_rows($result) > 0) {
    echo 'Welcome, $username!';
} else {
    echo 'Authentication failed for $username.';
}

/*
1、使用数据库特定的敏感字符转义函数(比如 mysql_escape_string() 和 sql_escape_string())把
用户提交上来的非数字数据进行转义。
2、如果数据库没有专门的敏感字符转义功能的话 addslashes() 和 str_replace() 可以代替完成这个工作。
3、仅在查询的时候加上引号是不够的,查询很容易被攻破,使用数据库转移机制或者prepared语句来取代魔术
引号功能才是最佳的选择。

--用户提交的数据,需要思考的几个问题 
1、此脚本是否只能影响所预期的文件?  
2、非正常的数据被提交后能否产生作用?  
3、此脚本能用于计划外的用途吗?  
4、此脚本能否和其它脚本结合起来做坏事?  
5、是否所有的事务都被充分记录了?
*/

隐藏PHP信息:

在 php.ini 文件里设置 expose_php = off ,HTTP响应头隐藏PHP版本信息。

URL伪静态:

使PHP看上去像未知的文件类型,无论是通过 .htaccess 文件还是 Apache 的配置文件,都可以设置能误导
攻击者的文件扩展名:AddType application/x-httpd-php .bop .foo .133t

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值