PHP 入门 - 9.安全

过滤输出

开发一个 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() 函数效果一样。

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值