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