php常见安全问题

XSS攻击
原理:
  XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。xss漏洞一般发生于与用户交互的地方。

危害:
  恶意弹出消息框,影响用户体验
  获取用户的cookie或者ajax请求攻击者的服务器窃取用户信息
  可以使用ajax不断调用被攻击网站的某个接口,严重的可能导致带宽被打满无法正常处理用户的请求,除此之外也可以通过调用被攻击网站的某个接口来实现一些个人利益比如在社交网站伪造数据提高影响力等。
预防办法:
  参数验证,只接受用户输入我们期待的值
  使用htmlspecialchars函数将用户输入的HTML标签实体化
  CSRF攻击
原理:
  CSRF(Cross-site request forgery),中文名称:跨站请求伪造,就是冒充用户发请求。比如:灌水机器人等。

危害:
  服务器处理大量虚假的请求数据库储存过多垃圾信息影响服务器处理正常请求的性能
预防办法:
  暂时的方法:分析日志找到发送请求的ip,禁止访问;
  验证码:设置机器难以识别的验证码,比如掺杂中文的验证码,拖动的验证码等;
  设置token验证,基本原理是通过比较隐藏的表单传过来的用户发出请求的时间与收到请求时的时间比较,允许一定范围的延时,防止被破解可以加入秘钥和随机字符串。(time()->md5(秘钥).time()->rand.substr(md5(rand秘      钥),0,10).time())

SQL注入
原理:
  SQL Injection:是一种利用未过滤/未审核用户输入的攻击方法,通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

例子:
  SQL注入一般是利用‘’或者“”拼接SQL语句或者–注释掉原有的SQL语句,减少查询的条件获取更多信息或者尝试猜测表名,一旦知道表名就可以对表做增删改查等各种操作。下面是几个常见的SQL注入的例子:

  1)将查询的where条件变成恒真,
    正常的SQL查询语句(xxx为用户要输入的内容):

    SELECT fieldlist FROM table WHERE fieldname='xxx';
  1
    如果输入 xxx’ or ‘1’='1,SQL语句就变成了

    SELECT fieldlist FROM table WHERE fieldname='xxx' or '1'='1';
  1
    这样的话where条件就不起作用了。

  2)猜字段名(–注释掉后面的内容)

    SELECT fieldlist FROM table WHERE fieldname = 'xxx' AND userid IS NULL; --';
    SELECT fieldlist FROM table WHERE fieldname = 'xxx' AND email IS NULL; --';
    SELECT fieldlist FROM table WHERE fieldname = 'xxx' AND password IS NULL; --';
    SELECT fieldlist FROM table WHERE fieldname = 'xxx' AND loginid IS NULL; --';

    上面的语句如果正常执行的话,就说明我们猜测的字段名字是正确的,否则说明猜错了,继续猜。

  3)跟上面同样的道理,利用子查询猜测表名:

    SELECT fieldlist FROM table WHERE fieldname = 'xxx' AND 1=(SELECT COUNT(*) FROM tabname); --';

    根据经验推断表名,进行尝试,我们并不关心表里面有多少条记录而是判断当前的表名是不是我们猜测的这个。

  4)除了对表进行增删改查以外实际上还可修改数据库

     SELECT fieldlist FROM table WHERE fieldname = 'xxx'; DROP TABLE members; --';


  利用 ; 结束上一条语句,在–注释掉后面的语句执行单行多条语句,可能会恶意修改数据库或者更新某个字段的内容。

危害:
  // 数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。
  // 网页篡改:通过操作数据库对特定网页进行篡改。
  // 网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。
  // 数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。
  // 服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。
  // 破坏硬盘数据,瘫痪全系统。
 预防办法:
  // 参数绑定,预处理。
  // 一定要接SQL语句抛出的异常,否则容易泄露表名、字段名、数据库服务器等信息

session文件漏洞
  Session攻击是黑客最常用到的攻击手段之一。当一个用户访问某一个网站时,为了免客户每进人一个页面都要输人账号和密码,PHP设置了Session和Cookie用于方便用户的使用和访向。

对于Session漏洞的防范:
  从前面的分析可以知道,Session攻击最常见的就是会话劫持,也就是黑客通过各种攻击手段获取用户的Session ID,然后利用被攻击用户的身份来登录相应网站。为此,这里可以用以下几种方法进行防范:一是定期更换Session ID,更换Session ID可以用PHP自带函数(session_id())来实现;

  二是更换Session名称,通常情况下Session的默认名称是PHPSESSID,这个变量一般是在cookie中保存的,如果更改了它的名称,就可以阻档黑客的部分攻击;

  三是对透明化的Session ID进行关闭处理,所谓透明化也就是指在http请求没有使用cookies来制定Session id时,Sessioin id使用链接来传递.关闭透明化Session ID可以通过操作PHP.ini文件来实现;四是通过URL传递隐藏参数,这样可以确保即使黑客获取了session数据,但是由于相关参数是隐藏的,它也很难获得Session ID变量值。

全局变量漏洞
  PHP中的变量在使用的时候不像其他开发语言那样需要事先声明,PHP中的变量可以不经声明就直接使用,使用的时候系统自动创建,而且也不需要对变量类型进行说明,系统会自动根据上下文环境自动确定变量类型。这种方式可以大大减少程序员编程中出错的概率,使用起来非常的方便。

对全局变量漏洞防范:
  对于PHP全局变量的漏洞问题,以前的PHP版本存在这样的问题,但是随着PHP版本升级到5.5以后,可以通过对php.ini的设置来实现,设置ruquest_order为GPC。另外在php.ini配置文件中,可以通过对magic_quotes_runtime进行布尔值设置是否对外部引人的数据中的溢出字符加反斜线。为了确保网站程序在服务器的任何设置状态下都能运行。可以在整个程序开始的时候用get_magic_quotes_runtime检测设置状态决定是否要手工处理,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0)关掉。


文件漏洞
  文件漏洞通常是由于网站开发者在进行网站设计时对外部提供的数据缺乏充分的过滤导致黑客利用其中的漏洞在Web进程上执行相应的命令。假如在lsm.php中包含这样一段代码:include($b."/aaa.php".),这对黑客来说,可以通过变量$b来实现远程攻击,可以是黑客自已的代码,用来实现对网站的攻击。可以向服务器提交a.php include=http://lZ7.0.0. 1/b.php,然后执行b.php的指令。

对文件漏洞的防范:
  对于PHP文件漏桐可以通过对服务器进行设置和配置来达到防范目的。这里具体的操作如下:

    一是把PHP代码中的错误提示关闭,这样可以避免黑客通过错误提示获取数据库信息和网页文件物理路径;

    二是对open_basedir尽心设置,也就是对目录外的文件操作进行禁止处理;这样可以对本地文件或者远程文件起到保护作用,防止它们被攻击,这里还要注意防范Session文件和上载文件的攻击;

    三是把safe-made设置为开启状态,从而对将要执行的命令进行规范,通过禁止文件上传,可以有效的提高PHP网站的安全系数。

猜你喜欢

转载自www.cnblogs.com/LF-place/p/10647227.html