加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

PHP安全问题入门:10个常见安全问题+实例讲解

发布时间:2019-04-04 22:39:21 所属栏目:建站 来源:Charlie_Jade
导读:相对于其他几种语言来说, PHP 在 web 建站方面有更大的优势,即使是新手,也能很容易搭建一个网站出来。但这种优势也容易带来一些负面影响,因为很多的 PHP 教程没有涉及到安全方面的知识。 此帖子分为几部分,每部分会涵盖不同的安全威胁和应对策略。但

你如果使用 shell_exec 或是 exec 函数。让我们做一个小例子,允许用户简单的从服务器 Ping 不同的主机。

  1. <?php  
  2. $targetIp = $_GET['ip'];  
  3. $output = shell_exec("ping -c 5 $targetIp"); 

输出将包括对目标主机 Ping 5次。除非采用 sh 命令执行 Shell 脚本,否则攻击者可以执行想要的任何操作。

  1. ping.php?ip=8.8.8.8;ls -l /etc 

Shell 将执行 Ping 和由攻击者拼接的第二个命令,这显然是非常危险的。

感谢 PHP 提供了一个函数来转义 Shell 参数。

escapeshellarg 转义用户的输入并将其封装成单引号。

  1. <?php  
  2. $targetIp = escapeshellarg($_GET['ip']);  
  3. $output = shell_exec("ping -c 5 $targetIp"); 

现在你的命令应该是相当安全的,就个人而言,我仍然避免使用 PHP 调用外部命令,但这完全取决于你自己的喜好。

另外,我建议进一步验证用户输入是否符合你期望的形式。

8. XXE

XXE (XML 外部实体) 是一种应用程序使用配置不正确的 XML 解析器解析外部 XML 时,导致的本地文件包含攻击,甚至可以远程代码执行。

XML 有一个鲜为人知的特性,它允许文档作者将远程和本地文件作为实体包含在其 XML 文件中。

  1. <?xml version="1.0" encoding="ISO-8859-1"?>  
  2.  <!DOCTYPE foo [  
  3.    <!ELEMENT foo ANY >  
  4.    <!ENTITY passwd SYSTEM "file:///etc/passwd" >]>  
  5.    <foo>&passwd;</foo> 

就像这样, /etc/passwd 文件内容被转储到 XML 文件中。

如果你使用 libxml 可以调用 libxml_disable_entity_loader 来保护自己免受此类攻击。使用前请仔细检查 XML 库的默认配置,以确保配置成功。

9. 在生产环境中不正确的错误报告暴露敏感数据

[](https://secure.php.net/manual...,可能会在生产环境中因为不正确的错误报告泄露了敏感信息,例如:文件夹结构、数据库结构、连接信息与用户信息。

你是不希望用户看到这个的吧?

一般根据你使用的框架或者 CMS ,配置方法会有不同的变化。通常框架具有允许你将站点更改为某种生产环境的设置。这样会将所有用户可见的错误消息重定向到日志文件中,并向用户显示非描述性的 500 错误,同时允许你根据错误代码检查。

但是你应该根据你的 PHP 环境设置: error_reporting 与 display_errors.

10. 登录限制

像登录这样的敏感表单应该有一个严格的速率限制,以防止暴力攻击。保存每个用户在过去几分钟内失败的登录尝试次数,如果该速率超过你定义的阈值,则拒绝进一步登录尝试,直到冷却期结束。还可通过电子邮件通知用户登录失败,以便他们知道自己的账户被成为目标。

一些其他补充

  •  不要信任从用户传递给你的对象 ID ,始终验证用户对请求对象的访问权限
  •  服务器与使用的库时刻保持最新
  •  订阅关注安全相关的博客,了解最新的解决方案
  •  从不在日志中保存用户的密码
  •  不要将整个代码库存储在 WEB 根目录中
  •  永远不要在 WEB 根目录创建 Git 存储库,除非你希望泄露整个代码库
  •  始终假设用户的输入是不安全的
  •  设置系统禁止可疑行为的 IP 显示,例如:工具对 URL 随机扫描、爬虫
  •  不要过分信任第三方代码是安全的
  •  不要用 Composer 直接从 Github 获取代码
  •  如果不希望站点被第三方跨域 iframe,请设置反 iframe 标示头
  •  含糊是不安全的
  •  如果你是缺乏实践经验的运营商或合作开发人员,请确保尽可能时常检查代码
  •  当你不了解安全功能应该如何工作,或者为什么会安装,请询问知道的人,不要忽视它
  •  永远不要自己写加密方式,这可能是个坏的方法
  •  如果你没有足够的熵,请正确播种你的伪随机数生成并舍弃
  •  如果在互联网上不安全,并有可能被窃取信息,请为这种情况做好准备并制定事件响应计划
  •  禁用 WEB 根目录列表显示,很多 WEB 服务器配置默认都会列出目录内容,这可能导致数据泄露
  •  客户端验证是不够的,需要再次验证 PHP 中的所有内容
  •  不惜一切代价避免反序列化用户内容,这可能导致远程代码执行,有关此问题的详细信息,请参阅此文章: https://paragonie.com/blog/20...

小贴士

我不是一个安全专家,恐无法做到事无巨细。尽管编写安全软件是一个非常痛苦的过程,但还是可以通过遵循一些基本规则,编写合理安全的应用程序。其实,很多框架在这方面也帮我们做了很多工作。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读