浅谈php web安全

发表于:2013-12-31来源:IT博客大学习作者:Benwin点击数: 标签:php
首先,笔记不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记、细心总结文章,里面有些是我们phper不易发现或者说不重视的东西。

  前言:

  首先,笔记不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记、细心总结文章,里面有些是我们phper不易发现或者说不重视的东西。所以笔者写下来方便以后查阅。在大公司肯定有专门的web安全测试员,安全方面不是 phper考虑的范围。但是作为一个phper对于安全知识是:“知道有这么一回事,编程时自然有所注意”。有什么不妥、错误的请联系:chen_bin_wen@163.com/445235728@qq.com

  概要:

  1、php一些安全配置

  (1)关闭php提示错误功能

  (2)关闭一些“坏功能”

  (3)严格配置文件权限。

  2、严格的数据验证,你的用户不全是“好”人

  2.1为了确保程序的安全性,健壮性,数据验证应该包括内容。

  2.2程序员容易漏掉point或者说需要注意的事项

  3、防注入

  3.1简单判断是否有注入漏洞以及原理

  3.2常见的mysql注入语句

  (1)不用用户名和密码

  (2)在不输入密码的情况下,利用某用户

  (3)猜解某用户密码

  (4)插入数据时提权

  (5)更新提权和插入提权同理

  (6)恶意更新和删除

  (7)union、join等

  (8)通配符号%、_

  (9)还有很多猜测表信息的注入sql

  33防注入的一些方法

  2.3.1 php可用于防注入的一些函数和注意事项。

  2.3.2防注入字符优先级。

  2.3.3防注入代码

  (1)参数是数字直接用intval()函数

  (2)对于非文本参数的过滤

  (3)文本数据防注入代码。

  (4)当然还有其他与addslashes、mysql_escape_string结合的代码。

  4、防止xss攻击

  4.1Xss攻击过程

  4.2常见xss攻击地方

  4.3防XSS方法

  5、CSRF

  5.1简单说明CSRF原理

  5.2防范方法

  6、防盗链

  7、防拒CC攻击

  ---------------------------------------------------------------------

  1、php一些安全配置

  (1)关闭php提示错误功能

  在php.ini 中把display_errors改成

  display_errors = OFF

  或在php文件前加入

  error_reporting(0)

  1)使用error_reporting(0);失败的例子:

  A文件代码:

  

  error_reporting(0);

  echo 555

  echo 444;

  ?>

  错误:

  Parse error: parse error, expecting `','' or `';'' in E:\webphp\2.php on line 4

  2)使用error_reporting(0);成功的例子:

  a文件代码:

  

  error_reporting(0);

  include("b.php");

  ?>

  b文件代码:

  

  echo 555

  echo 444;

  ?>

  这是很多phper说用error_reporting(0)不起作用。第一个例子A.php里面有致命错误,导致不能执行,不能执行服务器则不知有这个功能,所以一样报错。

  第二个例子中a.php成功执行,那么服务器知道有抑制错误功能,所以就算b.php有错误也抑制了。

  ps:抑制不了mysql错误。

  (2)关闭一些“坏功能”

  1)关闭magic quotes功能

  在php.ini 把magic_quotes_gpc = OFF

  避免和addslashes等重复转义

  2)关闭register_globals = Off

  在php.ini 把register_globals = OFF

  在register_globals = ON的情况下

  地址栏目:http:www.phpben.com?bloger=benwin

  

  //$bloger = $_GET['bloger'] //因为register_globals = ON 所以这步不用了直接可以用$bloger

  echo$bloger;

  ?>

  这种情况下会导致一些未初始化的变量很容易被修改,这也许是致命的。所以把register_globals = OFF关掉

  (3)严格配置文件权限。

  为相应文件夹分配权限,比如包含上传图片的文件不能有执行权限,只能读取

  2、严格的数据验证,你的用户不全是“好”人。

  记得笔者和一个朋友在讨论数据验证的时候,他说了一句话:你不要把你用户个个都想得那么坏!但笔者想说的这个问题不该出现在我们开发情景中,我们要做的是严格验证控制数据流,哪怕10000万用户中有一个是坏用户也足以致命,再说好的用户也有时在数据input框无意输入中文的时,他已经不经意变“坏”了。

  2.1为了确保程序的安全性,健壮性,数据验证应该包括

  (1)关键数据是否存在。如删除数据id是否存在

  (2)数据类型是否正确。如删除数据id是否是整数

  (3)数据长度。如字段是char(10)类型则要strlen判断数据长度

  (4)数据是否有危险字符

  数据验证有些人主张是把功能完成后再慢慢去写安全验证,也有些是边开发边写验证。笔者偏向后者,这两种笔者都试过,然后发现后者写的验证相对健壮些,主要原因是刚开发时想到的安全问题比较齐全,等开发完功能再写时有两个问题,一个phper急于完成指标草草完事,二是确实漏掉某些point。

  2.2程序员容易漏掉point或者说需要注意的事项:

  (1) 进库数据一定要安全验证,笔者在广州某家公司参与一个公司内部系统开发的时候,见过直接把$_POST数据传给类函数 classFunctionName($_POST),理由竟然是公司内部使用的,不用那么严格。暂且不说逻辑操作与数据操控耦合高低问题,连判断都没判断的操作是致命的。安全验证必须,没任何理由推脱。

原文转自:http://blogread.cn/it/article/6086