PHP安全 [安全编码]

目录

数据库安全(SQL注入)

命令执行 

XSS 

资源泄露 

本地文件包含

任意文件上传 


文件系统安全

源码

<?php 
//从用户目录中删除指定的文件
$username = $_POST['user_submitted_name'];
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$userfille";
unlink ("$homedir/$userfile");
echo "The file has been deleted!";
?>

如果攻击者恶意构造如下:

user_submitted_name="../etc"
user_submitted_filename="passwd"

因为源码是直接拼接的,所以上述执行会直接把/etc/passwd文件执行删除操作。(属于越权行为)

安全编码

  1. 不允许用户有拼接权限。
  2. 对用户输入进行完整的校验。

校验源码(白名单):

<?php 
$username = $_SERVER('REMOTE_USER'); //使用认证机制
$userfile = $_POST['user_submitted_filename'];
$homedir = "/home/$username";

$filepath = "$homedir/$userfile";
if(!ctype_alnum($username) || !preg_match('/^(?:[a-z0-9_-]|\.(?!\.))+$/iD',userfile)){
    die("Bad username/filename");
}
...
?>

ctype_alnum():做字母和数字字符检测

( : ?         非捕获分组,仅仅匹配

( ?  ! \. )   匹配非.的内容

分析:

  1. ../etc 在上述正则会导致die,即 ..开头的文件不允许
  2. /符号会导致die
  3. 根据操作系统的不同,存在着各种各样需要注意的文件,包括联系到系统的设备( /dev/或者COM1)、配置文件(/ect/文件和.ini文件)、常用的存储区域(/home/ 或者My Documents )等等。由于此原因,建立一个策略禁止所有权限而只开放明确允许的通常更容易些

数据库安全(SQL注入)

恶意输入:

尽量避免直接的数据库查询语句的拼接,无论数据库种类。

<?php 
$query = "SELECT * FROM products WHERE id LIKE '%$prod%'";
$result = mssql_query($query);
?>

a%' exec master..xp_cmdshell 'net user test testpass /ADD'

<?php
$query = "SELECT * FROM products WHERE id LIKE '%a%' exec master..xp_cmdshell 'net user test testpass /ADD'--";
$result = mssql_query($query);
?>

 错误输出:

尽量避免直接输出原本的数据库错误信息,而自行构造。

<?php
$sql = "SELECT * FROM movies WHERE title LIKE '%" . sqli($title) . "%'";
    $recordset = mysql_query($sql,$link);
    if(!$recordset)
    {
        die("ERROR!");
    }
}

在使用数据库时候,对于敏感信息加密存储:

  • md5($pass)
  • md5($salt.md5($pass))
  • SHA-1
  • SHA-2(SHA-224,SHA-256,SHA-384和SHA-512)
  • 推荐使用:
  • md5($salt.md5($pass))与SHA-256

命令执行 

源码:

$targetUrl = $_POST["target"];
switch ($targetUrl) {
    case "www.target.com": echo "" . shell_exec("nslookup www.target.com");
        break;
    case "web.target.com": echo "" . shell_exec("nslookup web.target.com");
        break;
    ...
    default:echo "" . shell_exec("nslookup www.target.com");
    }
}

如果命令执行不可缺少,使用白名单的形式,并且硬编码禁止拼接。

XSS 

<?php 

    //用户可控数据不需存储直接响应的,应编码输出。
echo $this->securityUtil->encodeForHTML($data);
echo $this->securityUtil->encodeForJavaScript($data);

    //用户可控数据需存储响应,应过滤字符。
$this->securityUtil->purifier($_GET["data"]);

}

注释 

资源泄露 

<?php 

$file = fopen("temp.txt","w") or die ("Unable to open file!");
fclose($file);

本地文件包含

<?php 

$filename = $_GET["filename"];
switch ($filename){
    case "file.txt":include("./file.txt");
        break;
    default:include("./readme.txt");
}

当必须要接受外部文件名的时候,同样是白名单。

任意文件上传 

<?php 

$config = array('limit'=>5 * 1024 *1024,  //允许上传的文件最大大小
                'type'=>array(            //允许的上传文件后缀及MIME
                        "gif"=>"image/gif",
                        "jpg"=>"image/jpeg",
                        "png"=>"image/png")
);

$title = $_FILES["file"];
$data = $this->securityUtil->verifyUploadFile($file,$config);
if($data['flag']!=true){
    returun; //上传失败
}

对文件的大小,后缀名以及MIME进行验证。对上传的路径,文件名以及它的权限进行限制,甚至对文件内容进行验证。 

安全编码细则

  1. 所有输入的数据都是有害的(直接或者间接由用户输入的)
  2. 不依赖运行环境的安全配置
  3. 安全控制措施落实在最后执行阶段
  4. 最小化
  5. 失败终止

总则

绝对安全的系统是不存在的。最好的安全机制应该能在不防碍用户,并且不过多地增加开发难度的情况下做到能满足需求。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目 录 1 PHP接口安全 4 1.1 指定公布给外部的资源,客户端只能访问允许访问的资源 4 1.1.1 说明 4 1.1.2 应对 4 1.1.3 举例 4 1.2 定义所有接口的参数,并做严格的检查 5 1.2.1 说明 5 1.2.2 应对 5 1.2.3 举例 5 1.3 不能让客户端看到任何不友好的错误信息 5 1.3.1 说明 5 1.3.2 应对 5 1.3.3 举例 5 二、PHP编码安全 6 2.1 POST/GET参数传值/字符串输入/数据入库等严格的危险字符过滤处理 6 2.1.1 说明 6 2.2.2 应对 6 2.2.3 举例 6 2.2 相关PHP的I/O操作,需要注意限制权限,文件名或目录名或内容都要做好过滤处理 8 2.2.1 说明 8 2.2.2 应对 8 2.2.3 举例 8 2.3 敏感信息(如PASSWORD/银行帐号等)不要依赖COOKIE,SESSION,最好读表,并尽量缓存读表数据 8 2.3.1 说明 8 2.3.2 应对 9 2.3.3 举例 9 2.4 注意对网站根目录及下面所有子目录及文件的权限控制与保护,不要让配置文件/系统信息等文件暴露 10 2.4.1 说明 10 2.4.2 应对 10 2.4.3 举例 10 2.5 屏蔽或定制化出错信息 10 2.5.1 说明 10 2.5.2 应对 11 2.5.3 举例 11 2.6 数据库的读取等操作、POST/GET传值需要做频率限制与Token校验 11 2.6.1 说明 11 2.6.2 应对 11 2.6.3 举例 11 2.7 有类似文件下载/或文本流下载等功能的,尽量避免使用URL直接调用目标文件地址的方式 12 2.7.1 说明 12 2.7.2 应对 12 2.7.3 举例 12 2.8 MYSQL 的用户最好分开,不要用ROOT用户来连接MYSQL 13 2.8.1 说明 13 2.8.2 应对 13 2.8.3 举例 13 3 参考内容 13
java,c/c++,php,c#安全编码规范,从代码层面避免被入侵 1 业务安全编码规范 6 1.1 输入验证和数据合法性校验 6 1.1.1 避免SQL注入 6 1.1.2 避免XML注入 6 1.1.3 避免跨站点脚本(XSS) 7 1.1.4 避免跨站请求伪造(CSRF) 8 1.1.5 避免敏感信息泄露 12 1.2 安全框架 12 1.2.1 Apache Shiro安全框架 12 1.2.2 webSecrity安全框架 13 1.2.3 Enterprise Security API 13 2 基础安全编码规范 15 2.1 声明和初始化 15 2.1.1 避免类初始化的相互依赖 15 2.2 表达式 16 2.2.1 不可忽略方法的返回值 16 2.2.2 不要引用空指针 16 2.2.3 使用Arrays.equals()来比较数组的内容 16 2.3 数字类型和操作 17 2.3.1 防止整数溢出 17 2.3.2 避免除法和取模运算分母为零 18 2.4 类和方法操作 18 2.4.1 数据成员声明为私有,提供可访问的包装方法 18 2.4.2 敏感类不允许复制 18 2.4.3 比较类的正确做法 19 2.4.4 不要硬编码敏感信息 19 2.4.5 验证方法参数 19 2.4.6 不要使用过时、陈旧或低效的方法 20 2.4.7 数组引用问题 20 2.4.8 不要产生内存泄露 20 2.5 异常处理 21 2.5.1 不要忽略捕获的异常 21 2.5.2 不允许暴露异常的敏感信息 21 2.5.3 不允许抛出RuntimeException, Exception,Throwable 22 2.6 多线程编程 23 2.6.1 确保共享变量的可见性 23 2.6.2 确保共享变量的操作是原子的 24 2.6.3 不要调用Thread.run(),不要使用Thread.stop()以终止线程 26 2.6.4 确保执行阻塞操作的线程可以终止 26 2.6.5 相互依存的任务不要在一个有限的线程池执行 27 2.7 输入输出 27 2.7.1 程序终止前删除临时文件 27 2.7.2 检测和处理文件相关的错误 27 2.7.3 及时释放资源 27 2.8 序列化 28 2.8.1 不要序列化未加密的敏感数据 28 2.8.2 在序列化过程中避免内存和资源泄漏 29 3 其他参考资料 30

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

carefree798

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值