前言
最近在系统的学习 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()
函数效果一样。
以上函数不要使用用户提供的数据,因为这样很容易遭到攻击。
感谢你看到了这里。如果文章有错误,请评论指正,谢谢!