Fork me on GitHub

php安全性问题

常见攻击类型

1.sql注入:

攻击者把SQL命令插入到Web表单的输入域或页面请求的字符串,欺骗服务器执行恶意的SQL命令。

防范方法:

  • 1.检查变量数据类型和格式
  • 2.过滤特殊符号
  • 3.绑定变量,使用预处理语句

2.xss攻击

XSS其实就是Html的注入问题,攻击者的输入没有经过严格的控制进入了数据库,最终显示给来访的用户,导致可以在来访用户的浏览器里以浏览用户的身份执行Html代码,

数据流程如下:攻击者的Html输入—>web程序—>进入数据库—>web程序—>用户浏览器。

防范方法:使用htmlspecialchars函数将特殊字符转换成HTML编码,过滤输出的变量

3.csrf攻击:

CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作。我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的。所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求。

要完成一次CSRF攻击,受害者必须依次完成两个步骤:

  • 1.登录受信任网站A,并在本地生成Cookie。
  • 2.在不登出A的情况下,访问危险网站B。

XSS 是实现 CSRF 的诸多途径中的一条,但绝对不是唯一的一条。一般习惯上把通过 XSS 来实现的 CSRF 称为 XSRF。因为网站A有漏洞,当我们访问的时候,可能已经被注入了访问危险网站B的操作

防范方法:

  • 1、检查网页的来源,比如laravel使用令牌
  • 2、检查内置的隐藏变量
  • 3、使用POST,不要使用GET,处理变量也不要直接使用$_REQUEST

php安全三板斧:过滤输入、验证数据,以及转义输出。

1.数据过滤:

过滤输入是指转义或删除不安全的字符。在数据到达应用的存储层之前,一定要过滤输入数据,这是第一道防线,

  • HTML

我们可以使用PHP提供的htmlentities函数过滤HTML,该函数会将所有HTML标签字符(&、<、>等)转化为对应的HTML实体,以便在应用存储层取出后安全渲染。

  • SQL查询

在SQL查询中一定不能使用未过滤的输入数据,如果要在SQL查询中使用输入数据,一定要使用PDO预处理语句(PDO是PHP内置的数据库抽象层,为不同的数据库驱动提供统一接口),PDO预处理语句是PDO提供的一个功能,可以用于过滤外部数据,然后把过滤后的数据嵌入SQL语句,避免出现上述SQL注入问题,此外预处理语句一次编译多次运行,可以有效减少对系统资源的占用,获取更高的执行效率。关于PDO后我们后续还会在数据库部分重点讨论。

值得注意的是,很多现代PHP框架都使用了MVC架构模式,将数据库的操作封装到了Model层,框架底层已经做好了对SQL注入的规避,只要我们使用模型类提供的方法执行对数据库的操作,基本上可以避免SQL注入风险。

2.验证数据:

可以php原生实现,借助php组件实现,laravel中是有专门的验证类validation

3.转义输出:

把输出渲染成网页或API响应时,一定要转义输出,这也是一种防护措施,能避免渲染恶意代码,造成XSS攻击,还能防止应用的用户无意中执行恶意代码。

laravel中使用blade模板,模板引擎在底层已经为了做好了转义处理

laravel 中如何避免csrf攻击

用户在网站b的时候发送了操作a网站的请求,同时a网站下已经有了cookie信息,所以是合法的。laravel通过csrf_token来进行判定是不是我们自己的网站访问的,因为每次访问都带着这个token,如果是网站b过来的非法操作a网站请求,肯定不会带着这个token,也就不合法了。

参考资料:

http://www.freebuf.com/articles/web/39234.html

http://www.cnblogs.com/luyucheng/p/6234524.html

http://laravelacademy.org/post/4610.html

http://laravelacademy.org/post/4628.html

http://laravelacademy.org/post/4699.html

posted @ 2019-01-02 14:22  archer-wong  阅读(911)  评论(0编辑  收藏  举报