PHP安全 [安全编码]

目录

数据库安全(SQL注入)

命令执行 

XSS 

资源泄露 

本地文件包含

任意文件上传 


文件系统安全

源码

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

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

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

安全编码

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

校验源码(白名单):

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

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

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

分析:

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

数据库安全(SQL注入)

恶意输入:

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

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

 错误输出:

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

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

  • 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 

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

注释 

资源泄露 

本地文件包含

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

任意文件上传 

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. 失败终止

总则

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章