我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

相比于其他语言,PHP 在建站方面有较大的优势,即使是新手也可以轻松搭建网站。不过这种优势也容易带来一些负面影响,因为很多 PHP 教程并没有涉及安全知识。

虽然SF推荐的文章不一定能防止您的网站出现安全问题,但它确实涵盖了各种不同的安全威胁和应对策略。

赶紧来看看吧!

为了演示,代码可能并不完善。在日常开发中,大量的代码都包含在框架和各种库中。作为后端开发人员,不仅要熟练掌握基本的 CURD,还要懂得如何保护自己的数据。

1. SQL注入

我敢打赌你会看到这个。SQL注入是对你网站的最大威胁之一。如果你的数据库受到别人的SQL注入攻击,他们可以转移出你的数据库,这可能会导致更严重的后果。

要从数据库获取动态数据,网站必须执行SQL语句,如下所示:


$username = $_GET['username'];$query = "SELECT * FROM users WHERE username = '$username'";

攻击者控制通过GET和POST发送的查询(或者一些其他查询,例如UA)。通常,您想要查询名为“peter”的用户生成的SQL语句,如下所示:

SELECT * FROM users WHERE username = 'peter'

然而,攻击者发送了一个特定的用户名参数,如:' OR '1'='1,这将导致SQL语句变成:

SELECT * FROM users WHERE username = 'peter' OR '1' = '1'

这样,他就可以导出你整个用户表的数据而不需要密码。

那么,我们该如何防止此类事故发生呢?主流的解决方案有两种。对用户输入的数据进行转义,或者使用封装好的语句。转义的方法是封装一个函数来过滤用户提交的数据,去除有害的标签。不过我不建议使用这种方法,因为很容易到处都忘记做这个处理。

接下来介绍如何使用PDO执行封装好的语句(同):

$username = $_GET['username'];$query = $pdo->prepare('SELECT * FROM users WHERE username = :username');$query->execute(['username' => $username]);$data = $query->fetch();

动态数据的每个部分都以 : 为前缀。然后所有参数都以数组的形式传递给执行函数,看起来 PDO 已经帮你转义了有害数据。

几乎所有数据库驱动程序都支持打包语句,没有理由不使用它们!养成使用它们的习惯,这样以后就不会忘记它们。

您还可以参考有关动态构建 SQL 查询时处理安全问题的文章。链接:

2.XSS

XSS又叫CSS(Cross Site),跨站脚本攻击,是指恶意攻击者在网页中插入恶意的HTML代码,当用户浏览该页面时,网页中嵌入的HTML代码就会被执行,从而达到恶意攻击用户的特殊目的。

以下是搜索页面的示例:

<body>$searchQuery = $_GET['q'];/* some search magic here */?><h1>You searched for:  echo $searchQuery; ?>h1><p>We found: Absolutely nothing because this is a demop>body>

由于我们没有经过任何过滤就直接将用户的内容打印出来,所以非法用户可以拼接URL:

search.php?q=%3Cscript%3Ealert(1)%3B%3C%2Fscript%3E

PHP渲染出来的内容如下,可以看到直接会执行代码:

You searched for:

We found: Absolutely nothing because this is a demo

问:执行 JS 代码有什么大不了的?

能:

问:如何预防这个问题?

好消息是,现代浏览器现在具有一些基本的 XSS 保护功能,但请不要依赖它。

正确的做法是永远不要相信任何用户输入,并过滤掉输入中的所有特殊字符。这将消除大多数 XSS 攻击:


$searchQuery = htmlentities($searchQuery, ENT_QUOTES);

或者也可以使用模板引擎Twig,一般模板引擎都会默认对输出结果添加保护。

如果保留用户输入,还应特别注意输出。在下面的示例中,我们让用户填写自己的博客链接:

<body>  <a href="">Visit Users homepagea>body>

上面的代码乍一看可能没有问题,但假设用户填写了以下内容:

#" onclick="alert(1)

将被渲染为:

Visit Users homepage

永远不要相信用户输入,也不要总是认为用户内容具有冒犯性,要保持礼貌并小心处理每个用户输入和输出。

控制 XSS 攻击的另一种方法是提供 CSP Meta 标记或标头信息。

另外,如果不需要JS读取的话,一定要设置为“HTTP ONLY”,这个设置可以防止PHP端读取。

3.XSRF/CSRF

CSRF是跨站请求伪造的缩写,是攻击者欺骗用户访问经过身份验证的网站并执行某些操作的一种技术手段。

虽然这里展示的例子是GET请求,但是比POST更容易理解,并不是保护手段,也不是私密的或者多步骤的表单。

假设您有一个允许用户删除其帐户的页面,如下所示:

//delete-account.php
$confirm = $_GET['confirm'];
if($confirm === 'yes') { //goodbye}

攻击者可以在其网站上构建一个触发此 URL 的表单(这同样适用于 POST 表单),或者将 URL 加载为图像以诱使用户点击它:

<img src="https://example.com/delete-account.php?confirm=yes" />

一旦用户触发,就会执行删除账号的指令,你的账号就会在眨眼间消失。

防御此类攻击比防御XSS和SQL注入更为复杂。

最常见的防御方式是生成一个CSRF令牌加密安全字符串,一般称之为Token,并将Token存储在or中。

每次在网页上构造表单时,都把Token放在表单中的一个隐藏字段中,表单请求服务器会将其与用户或者表单的请求字段中的Token进行对比,验证成功才会通过。

由于攻击者无法知道Token的内容(每个表单的Token都是随机的),所以他无法冒充用户。

 /* 你嵌入表单的页面 */ ?>
<form action="/delete-account.php" method="post"> <input type="hidden" name="csrf" value=""> <input type="hidden" name="confirm" value="yes" /> <input type="submit" value="Delete my account" />form>##
//delete-account.php
$confirm = $_POST['confirm'];$csrf = $_POST['csrf'];$knownGoodToken = $_SESSION['csrf'];
if($csrf !== $knownGoodToken) { die('Invalid request');}
if($confirm === 'yes') { //goodbye}

请注意,这是一个非常简单的示例,您可以添加更多代码。如果您使用类似这样的 PHP 框架,它具有内置的 CSRF 令牌功能。

4. 利比里亚金融研究所

LFI(本地文件包含)是一种未经身份验证的用户可以从磁盘读取文件的漏洞。

我经常遇到编写不当的路由代码,这些代码没有验证或过滤用户输入。让我们以以下文件为例,使用 GET 请求加载它要呈现的模板文件。

<body>  $page = $_GET['page'];  if(!$page) {    $page = 'main.php';  }  include($page);?>body>

由于可以加载任何文件(而不仅仅是 PHP),因此攻击者可以将系统上的任何文件作为包含目标传递。

index.php?page=../../etc/passwd

这将导致读取 /etc/ 文件并显示在浏览器中。

为了防止此类攻击,您必须仔细考虑允许用户输入的类型,并从输入中删除潜在的有害字符,例如“。”,“/”和“”。

如果您真的想使用这样的路由系统(我不推荐任何方式),您可以自动附加 PHP 扩展,删除任何非 [a-zA-Z0-9-_] 字符,并指定从专用模板文件夹加载以避免包含任何非模板文件。

我在不同的开发文档中多次看到过导致此类漏洞的 PHP 代码。你应该从一开始就有一个清晰的设计思路,允许需要包含的文件类型,删除多余的内容。也可以构造需要读取的文件的绝对路径并验证文件是否存在作为一种保护,而不是允许从任意位置读取。

5. 密码哈希处理不充分

大多数Web应用程序都需要保存用户的认证信息,如果密码哈希值足够好,当您的网站被黑客入侵时,它可以保护用户的密码不被非法读取。

首先,你最不应该做的就是明文存储用户密码。大多数用户在多个网站上使用相同的密码,这是无法改变的事实。当你的网站被黑客入侵时,意味着用户在其他网站上的账户也被黑客入侵。

其次,您不应该使用简单的哈希算法,事实上,任何未针对密码哈希进行优化的算法都不应该使用。诸如 MD5 或 SHA 之类的哈希算法被设计得非常快。这不是您想要的。密码哈希的最终目标是让黑客即使花费无数时间和精力也无法破解密码。

另一个重点是您应该对密码哈希值进行加盐处理。加盐处理可避免两个相同密码产生相同哈希值的问题。

下面以MD5为例,所以请不要使用MD5来哈希你的密码,MD5并不安全。

假如我们的用户user1和user2有相同的密码,虽然这个密码由字母和数字组成,看起来很强大,但是在数据库中,两个用户的密码哈希数据会相同:。

如果黑客接管了你的网站,并获得了这些哈希数据,他就不需要暴力破解用户的密码了。我们希望让他花费尽可能多的精力来破解你的密码,所以我们对数据进行了加盐:

//warning: !!这是一个很不安全的密码哈希例子,请不要使用!!
$password = 'cat123';$salt = random_bytes(20);
$hash = md5($password . $salt);

最后,在保存您的唯一密码哈希时,不要忘记保存 $salt,否则您将无法验证用户。

目前最好的密码哈希选项是,它是专门为哈希密码设计的哈希算法,并且还允许您配置一些参数以使其更难破解。

新版 PHP 还自带了安全的密码哈希函数,已经包含了加盐功能,通过相应的密码验证函数来检查密码是否正确,还能有效防止时序攻击。

以下是一些使用示例:


//user signup$password = $_POST['password'];$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
//login$password = $_POST['password'];$hash = '1234'; //load this value from your db
if(password_verify($password, $hash)) { echo 'Password is valid!';} else { echo 'Invalid password.';}

需要澄清的一点是,密码哈希不是密码加密。哈希是将目标文本转换为不可逆的相同长度的哈希字符串(或消息摘要),而加密是将目标文本转换为不同长度的可逆密文。显然,它们之间最大的区别就是可逆性。在存储密码时,我们希望哈希具有不可逆的特性。

6.中间人攻击

MITM(中间人)攻击不是针对服务器,而是针对用户。攻击者充当中间人,欺骗服务器自己是用户,欺骗用户自己是服务器,从而拦截用户与网站之间的流量并注入恶意内容或读取隐私信息。它通常发生在公共 WiFi 网络中,但也可能发生在流量通过的其他地方,例如 ISP 运营商。

针对这种情况的唯一防御措施是使用 HTTPS,它可以加密您的连接,使读取或篡改流量变得不可能。您可以从 Let's 获取免费的 SSL 证书,也可以从其他供应商处购买。我不会在这里详细介绍如何正确配置您的 Web 服务器,因为这与应用程序安全性无关,并且很大程度上取决于您的设置。

你也可以采取一些措施让HTTPS更加安全,就是在WEB服务器配置中添加--,这个信息告诉浏览器你的网站总是通过HTTPS来访问的,如果不是通过HTTPS来访问的话,就会返回一个错误报告,提示浏览器不应该显示该页面。

但是,这里有一个明显的问题。如果浏览器之前没有访问过你的网站,它就无法知道你正在使用这个 ,而这正是需要它的时候。

您可以在这里注册您的网站:

您在此处提交的所有网站都将被标记为仅 HTTPS,并硬编码到 、Opera、IE11 和 Edge 的源代码中。

您还可以在您的 DNS 配置中添加(CAA),以仅允许一个证书颁发机构(例如 Let's)为您的域名颁发证书,从而进一步提高了用户安全性。

7. 命令注入

这可能是服务器遇到的最严重的攻击,命令注入的目的是诱骗服务器执行任意 Shell 命令。

如果您使用或 exec 函数。让我们制作一个小示例,让用户可以轻松地从服务器 ping 不同的主机。


$targetIp = $_GET['ip'];$output = shell_exec("ping -c 5 $targetIp");

输出将包括对目标主机进行 ping 5 次。除非使用 sh 命令执行 shell 脚本,否则攻击者可以执行他想要的任何操作。

ping.php?ip=8.8.8.8;ls -l /etc

该Shell会执行Ping和攻击者连接起来的第二个命令,这显然是非常危险的。

值得庆幸的是,PHP 提供了一个转义 Shell 参数的函数。

转义用户输入并将其括在单引号中。


$targetIp = escapeshellarg($_GET['ip']);$output = shell_exec("ping -c 5 $targetIp");

现在你的命令应该相当安全了。就我个人而言,我仍然避免使用 PHP 调用外部命令,但这完全取决于你的喜好。

此外,我建议进一步验证用户输入是否符合您期望的形式。

8.XXE

XXE(XML 外部实体)是一种当应用程序使用配置不当的 XML 解析器解析外部 XML 时发生的攻击,从而导致本地文件包含攻击甚至远程代码执行。

XML 的一个鲜为人知的特性是它允许文档作者将远程和本地文件作为实体包含在他们的 XML 文档中。

       ]>   <foo>&passwd;foo>

就像这样,/etc/ 文件内容被转储到 XML 文件中。

如果您使用 XML 库,您可以调用来保护自己免受此类攻击。使用前请仔细检查 XML 库的默认配置,以确保配置成功。

9. 生产过程中错误报告不当会暴露敏感数据

[](,可能会由于不正确的错误报告而泄露生产环境中的敏感信息,例如文件夹结构、数据库结构、连接信息和用户信息。

php随机数生成_生成数学图像的软件_河图生成数

您不想让用户看到这个,对吗?

根据您使用的框架或 CMS,配置方法会有所不同。通常,框架具有允许您将站点更改为某种生产环境的设置。这会将所有用户可见的错误消息重定向到日志文件,并向用户显示非描述性的 500 错误,同时允许您根据错误代码进行检查。

但你应该根据你的PHP环境进行设置:

10. 登录限制

敏感表单(如登录)应有严格的速率限制,以防止暴力攻击。跟踪过去几分钟内每个用户的登录失败次数,如果该速率超过您定义的阈值,则拒绝进一步的登录尝试,直到冷却期结束。您还可以通过电子邮件通知用户登录失败,以便他们知道他们的帐户正在成为攻击目标。

其他一些补充建议

我不是安全专家,所以恐怕无法涵盖每一个细节。虽然编写安全软件是一个非常痛苦的过程,但只要遵循一些基本规则,仍然可以编写出相当安全的应用程序。事实上,许多框架也帮助我们在这方面做了很多工作。

安全问题无法像语法错误一样在开发阶段就被追踪到,因此在写代码时要时刻注意规避安全风险。如果因为业务需要而不得不暂时忽略某些安全防范措施,我觉得需要提前告知大家这样做的潜在风险。

如果您从本文中受益,请与您的朋友分享,让我们共同打造一个安全的网站。

相关课程推荐

生成数学图像的软件_php随机数生成_河图生成数

扫码学习

>>>>

讲师 周孟康

高级研发工程师,PHP技术专家,《深入PHP核心》作者之一,千人五星好评的《PHP高级教程》系列讲师。

>>>>

课程描述

我见过很多架构分享,99%都是在说自己搭建的系统有多庞大,性能有多棒,但是却只字未提它是如何实现的。

>>>>课程亮点

>>>>主题提纲

后端架构例程

完善的监控系统

流量预估与压力测试

日志收集与分析

分布式计划任务

性能优化思路

服务治理的实施

轻量级发布系统

>>>>

学生评价

arvin、 · 2月13日

确实需要!之前也看过大佬的深入PHP内核,感觉收获很大!

2018 年 11 月 12 日

服务治理给我带来了新的概念,让我在分布式处理方面学到了很多东西。

对十亿级光伏架构进行了非常详细的讲解,让人有一个清晰的认识。

enda · 2018 年 4 月 16 日

很有用的讲座,服务治理框架立马派上用场了,康神真是用心啊~

蒸不是煮 · 2018 年 3 月 5 日

太棒了——,我作为一个PHP小白,大概意思都看不懂,但是看了好几遍回放才真正理解孟康老师讲的是什么(≧▽≦),真的让人记忆深刻,多看几遍就会有新的感悟。

炸鱼 · 2018 年 3 月 5 日

给孟康老铁点赞,这个课程很适合进阶观看,很实用

我第一次听的时候,感觉“这不就是我当年遇到的问题和案例吗?”所以认真听的话收获还是很大的,关键是要吸收其中的思想。

另外,对于老铁的系列,我觉得每一个大章节都可以说是技术的阶段,好好做笔记,不断拓展,你会发现收获会更多。

子晨 · 2017年10月25日

老师讲课很棒,一针见血,有些不太明白的地方一下子就明白了,很有帮助!

2017 年 10 月 24 日

今年暑假去听了一个会议,会上很多嘉宾讲到了“微服务”、“服务治理”、“跨语言调用”等服务相关的分享。当时我有点迷茫,因为我公司的业务还没有达到需要服务治理那么大的规模,所以从来没有接触过,也不是很了解。这个疑惑一直困扰着我,自己也找了一些资料,但还是不太清楚。无意中看到了这个课程,上周日听完之后,又研究了孟康博客上写的资料和代码2天,感觉恍然大悟。心里的疑惑解开了,感觉很爽!

飞翼 · 2017 年 7 月 31 日

突然意识到原来这就是常驻内存服务器的意思,以前听说过但是没接触过,还学会了在idea里跑java T_T,真是太值得了!!!希望以后可以更深入的讲讲服务器相关的东西。

Coder · 2017 年 7 月 19 日

老师把一些高深的概念讲得很通俗易懂,流畅、生动。

欢迎关注我们的微信公众号:)

二维码
扫一扫在手机端查看

本文链接:https://by928.com/1804.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线