Gitlib Gitlib
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)

Ravior

以梦为马,莫负韶华
首页
  • 分类
  • 标签
  • 归档
  • Golang开发实践万字总结
  • MySQL核心知识汇总
  • Redis实践总结
  • MQ实践万字总结
  • Docker数据持久化总结
  • Docker网络模式深度解读
  • 常用游戏反外挂技术总结
  • 读书笔记
  • 心情杂货
  • 行业杂谈
  • 友情链接
关于我
GitHub (opens new window)
  • PHP

    • PHP-FPM使用指南
    • PHP7新特性总结
    • PHP安全编程
      • 1. SQl注入
      • 2. 跨站脚本攻击XSS
      • 3. 跨站请求伪造(CSRF)
      • 4. 全局变量漏洞
      • 5. 文件上传漏洞
      • 6. 文件包含
      • 7. 总结
    • PHP安全配置总结
    • PHP变量的值类型和引用类型
    • PHP标准规范PSR
    • PHP操作Zookeeper实践
    • PHP错误和异常处理机制详解
    • PHP的Session运行机制
    • PHP底层运行机制和原理
    • PHP反射模拟实现注解路由
    • PHP高级用法总结
    • PHP开发常用文档总结
    • PHP开发入门:Memcached扩展安装
    • PHP开发入门:PHP7安装部署
    • PHP开发入门:Redis扩展安装
    • PHP开发SPL总结
    • PHP框架常见URL模式
    • PHP扩展开发入门
    • PHP垃圾回收机制
    • PHP类的自动加载
    • PHP输入输出流
    • PHP微服务开发指南
    • PHP协程
    • PHP写时拷贝技术
    • PHP性能优化之Opcache
    • PHP依赖注入和控制反转
    • PHP运行模式(SAPI)
    • PHP中file_get_contents与curl区别
    • RPC的简单实现
    • Protobuf:高效数据结构化工具
    • P3P协议详解
    • Laravel之集合(Collection)总结
    • Laravel实践总结
    • Laravel之ORM总结
    • 中高级PHP实践总结
    • PHP Socket编程实战
  • Golang

  • Python

  • Javascript

  • 其他语言

  • 编程语言
  • PHP
Ravior
2016-02-07
目录

PHP安全编程

# 1. SQl注入

漏洞原理:

  • 使用用户的参数直接拼接sql语句
  • 参数改变了原有sql语句的结构

注入方式:

  • 回显注入
  • 报错注入
  • 盲注
  • 宽字节注入

防御方法:

  • 整数类处理:intval
  • 字符串转义:addslashes
<?php
$str = "Is your name O'reilly?";

// 输出: Is your name O\'reilly?
echo addslashes($str);
?>
1
2
3
4
5
6
  • 字符串转义:mysql_real_escape_string

注意:在PHP5及之前,magic_quotes_gpc默认是开启的,PHP6、PHP7的php.ini里没有magic_quotes_gpc的选项,实际呈关闭状态。当PHP magic_quotes_gpc=off,必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出 。

# 2. 跨站脚本攻击XSS

漏洞类型:

  • js攻击

漏洞危害:

  • 信息泄露,冒用身份,伪造钓鱼

防御方法:

  • 常规过滤

    • 参数接受格式检查,邮箱,手机号,主键id
    • 入库时需转义格式,htmlentities() htmlspecialchars()
    <?php
    $str = "A 'quote' is <b>bold</b>";
    
    
    // 输出: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
    echo htmlentities($str);
    
    // 输出: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
    echo htmlentities($str, ENT_QUOTES);
    ?>
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
  • 内容输出检查过滤,返回内容是否合格

# 3. 跨站请求伪造(CSRF)

漏洞原理:

  • 服务请错把"浏览器发起的请求" 当 "用户发起的请求"
  • 已登录的浏览器,打开恶意网址后,被执行了相应操作

防范措施:

  • referer
  • token
  • 图片验证码

# 4. 全局变量漏洞

PHP中的变量不需要事先声明,它们会在第一次使用时自动创建,它们的类型根据上下文环境自动确定。从程序员的角度来看,这无疑是一种极其方便的处理方法。一旦一个变量被创建了,就可以在程序中的任何地方使用,这个特点导致的结果就是程序员很少初始化变量。

很显然,基于PHP的应用程序的主函数一般都是接受用户的输入(主要是表单变量,上载文件和Cookie等),然后对输入数据进行处理,然后把结果返回到客户端浏览器。为了使PHP代码访问用户的输入尽可能容易,实际上PHP是把这些输入数据看作全局变量来处理的。

<form method="GET" action="test.php">
  <input type="text" name="hello">
  <input type="submit">
</form>
1
2
3
4

这会显示一个文本框和提交按钮。当用户点击提交按钮时,"test.php"会处理用户的输入,当"test.php"运行时,"Tex parse error! hello"被创建,"$setup"也被创建了。 下面的用户认证代码暴露了PHP的全局变量所导致的安全问题:

<?php
if ($pass == "hello")
$auth = 1;
...
if ($auth == 1)
echo "some important information";
?>
1
2
3
4
5
6
7

上面的代码首先检查用户的密码是否为"hello",如果匹配的话,设置"$auth"为"1",即通过认证。之后如果"$suth"为"1"的话,就会显示一些重要信息。

这段代码假定"$auth"在没有设置值的时候是空的,但是攻击者可以创建任何全局变量并赋值,通过类似"http://server/test.php?auth=1"的方法,我们完全可以欺骗这段代码,使它相信我们是已经认证过的。

因此,为了提高PHP程序的安全性,我们不能相信任何没有明确定义的变量。如果程序中的变量很多的话,这可是一项非常艰巨的任务。

注意:register_globals模式是关闭状态。

# 5. 文件上传漏洞

在网站的运营过程中,不可避免地要对网站的某些页面或者内容进行更新,比如用户需要上传头像,发帖需要上传附件,商品需要上传照片等。 如果不对上传的文件进行限制或者限制被绕过,该功能便有可能被利用于上传可执行文件,脚本到服务器,进而进一步导致服务器沦陷。

漏洞类型:

  • 客户端验证
  • 服务端绕过

防范措施:

  • 目录不可执行,如果web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身不会受影响,因此这一点至关重要
  • 在判断文件类型时,可以结合MIME TYPE,后缀检查等方式,在文件类型检查中,强烈推荐白名单方式,因为黑名单的方式非常不可靠,能被攻击者轻易的绕过; 对于图片的处理,可以使用压缩函数或者resize函数,处理同时破坏图片中包含的恶意代码
  • 使用随机数改写文件名和路径,文件上传如果要执行代码,则需要用户能够访问到这个文件,在某些环境中,用户能上传,但不能访问。

# 6. 文件包含

漏洞原理:

开发者希望代码更加灵活,很多时候会将被包含的文件设置为变量,用来进行动态调用,不过会造成文件包含漏洞的可能。 文件包含漏洞在PHP Web Application中居多,而在JSP,ASP,.NET程序中却非常少,甚至没有包含漏洞的存在。

  • 本地文件包含
  • 远程文件包含
  • 资源文件输出

防范方式:

  • 参数验证:限制参数的文件名,限制参数中的路径,预先设置参数格式
  • open_basedir:配置PHP中open_basedir可以限制PHP只能打开特定目录,例如 open_basedir = /home/wwwroot/[www.test.localhost](http://www.test.localhost/),在windows下多个目录应当用分号隔开,在linux下则用冒号隔开
  • 关闭远程文件加载

# 7. 总结

  • 别相信输入

    • 过滤参数:传入参数类型/长度/格式校验/转义(addslash(),htmlentities())
    • 过滤上传:校验上传文件格式、大小、权限(只读的或读写的,永远不能被执行)
  • 别暴露自己

    • 关闭线上PHP提示错误功能
    • 敏感系统/接口网络隔离
  • 管好自己

    • 严格控制文件权限
    • 禁用远程代码执行
#PHP
上次更新: 2022/12/02, 22:04:34
PHP7新特性总结
PHP安全配置总结

← PHP7新特性总结 PHP安全配置总结→

最近更新
01
常用游戏反外挂技术总结
11-27
02
Golang开发实践万字总结
11-11
03
Redis万字总结
10-30
更多文章>
Theme by Vdoing | Copyright © 2011-2022 Ravior | 粤ICP备17060229号-3 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式