前言

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

过滤输出

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

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

    跨站脚本

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

    预防方法

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

    SQL 注入

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

    预防方法

  • 使用参数化查询来设计数据访问功能。

  • 转义输出来达到过滤

    转义输出文件名

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

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

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

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

  1. $filename = $_POST['filename'];
  2. $vetted = basename(realpath($filename));
  3. if ($filename !== $vetted){
  4. die("{$filename} is not good filename");
  5. }

会话固定

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

预防方法

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

    文件上传

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

    PHP 代码

    我们知道 eval() 函数,可以让脚本执行任意PHP代码。带 /e 选项的 preg_replace() 函数与 eval() 函数效果一样。
    以上函数不要使用用户提供的数据,因为这样很容易遭到攻击。

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