飞机的 PHP 学习笔记九:安全

前言

最近在系统的学习 PHP ,参考的资料是《PHP编程》+ 官方文档(如果你有好的学习资料,欢迎推荐给我)。虽然这本《PHP编程》是基于 PHP5 的,但我笔记里的代码,全部在 PHP 7.2 的环境里测试过,是能够运行的。另,本笔记中只记录我模糊不清的知识。

过滤输出

开发一个 Web 网站要了解的最基本的事情之一是:所有非程序自己生成的信息都有潜在的污染,包括表单数据、文件和数据库。也就是说任何时候我们都不要相信用户输入的数据。

关于过滤的最佳实践:

  • 用白名单的方法。这意味着你宁可谨慎地假设数据都是无效的,除非你能证明它有效。
  • 不要纠正无效的数据。历史证明尝试纠正无效的数据常常会由于错误导致安全漏洞。
  • 使用命名来帮助区分过滤好的和污染的数据。如果你不确定是否过滤了,过滤是无用的。

跨站脚本

跨站脚本(XSS, Cross-site scripting)由于简写 CSS 与层叠样式表重名,而改写成 XSS 。是最常见的网页程序安全漏洞,是注入攻击的一种。其特点是不对服务器造成任何伤害,而是通过一些正常的站内交互途径,例如发布评论,提交含有 JavaScript 的内容的文本。

预防方法

对于任何用户输入的信息,都要进行转义/过滤。

SQL 注入

SQL 注入是将恶意的 SQL 查询或添加语句插入到应用的输出参数中,在由数据库服务器解析执行,从而达到攻击目的。SQL 注入很像 XSS 。

预防方法

  • 使用参数化查询来设计数据访问功能。
  • 转义输出来达到过滤

转义输出文件名

realpath()basename() 来检查文件名。

  • realpath() : 返回规范化的绝对路径名

    chdir('/var/www/'); // 改变目录
    echo realpath('./../../etc/passwd'); // /etc/passwd
  • basename() : 返回路径中的文件名部分

这里举一个例子:检查当前传入的参数文件名,是否为规范的文件名(也就是没有 ./ ../ 的文件名)

$filename = $_POST['filename'];
$vetted = basename(realpath($filename));

if ($filename !== $vetted){
    die("{$filename} is not good filename");
}

会话固定

攻击者可以很简单的拿到目标用户的会话标识,进而目标用户使用攻击者的会话标识登录站点,攻击者劫持会话成功.

预防方法

  • 当用户登录的时候重置 sessionID 。
  • sessionID 闲置过久,重置 sessionID 。
  • 当用户权限变更时重置 sessionID 。

文件上传

在文件上传时,不要相信浏览器提供的文件名。正确的方法时:用户交互中用浏览器提供的名字,但是要自己生成唯一的名字用来调用文件。

PHP 代码

我们知道 eval() 函数,可以让脚本执行任意PHP代码。带 /e 选项的 preg_replace() 函数与 eval() 函数效果一样。

以上函数不要使用用户提供的数据,因为这样很容易遭到攻击。

感谢你看到了这里。如果文章有错误,请评论指正,谢谢!

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1
free-andy

天空之城,落雨下的黄昏的我们。

4年前 评论
飞机飞过天空 (楼主) 4年前
free-andy (作者) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!