网站首页 > 基础教程 正文
概述
现在人们、开发人员和企业比以往任何时候都更加认为 PHP 是一种垂死的语言,它可能在 IT/开发世界中没有立足之地。然而,PHP 是当今仍在使用的最流行的编程语言之一。它被数以百万计的网站使用,大约占所有网站的 80%,包括互联网上的一些知名网站。PHP 仍然主导着服务器端 Web 开发,同时仍然灵活且适应开发人员的需求。
虽然 PHP 是一种非常强大的语言,但如果使用不当,它也可能非常不安全。在本文中,我们将讨论 PHP 安全性的八个最佳实践,它们将有助于保护您的网站免受黑客和恶意用户的侵害。
PHP 安全的 8 个最佳实践
1.始终使用最新版本的PHP
首先,请始终确保您的 PHP 是最新的!新版本的 PHP 会定期发布,其中包含安全修复和改进,因此通过使用最新版本,您将受益于这些修复和改进以及可能对您的网站有帮助的任何新功能。查看随附的链接以获取最新版本和旧版本的列表:PHP: Releases。
2.正确配置PHP.ini文件和其他必要条件
信不信由你,大多数安全漏洞都来自错误配置。您可以对 PHP.ini 文件进行一些更改以使其更安全,但首先,让我们从需要针对您的特定系统进行定制的以下设置开始:
会话.save_path
session.cookie_path(例如/var/www/mysite)
session.cookie_domain
正确配置这些设置后,您可以编辑其他一些设置以确保 PHP 应用程序的安全。让我们看看下面的清单:
- expose_php = off
这限制了在 HTTP 标头中发送 PHP 版本的披露。启用后,expose_php 会告诉所有人 PHP 已安装在该特定服务器或系统上,其中包括 HTTP 标头中的 PHP 版本,例如(技术支持:PHP/8.1.2)。您可以为任何系统执行此操作,并且如果您使用的是 nginx,则效果很好。
- allow_url_include=off
将此设置为关闭可防止远程代码执行攻击。
- display_errors = off
这显示是否应该在屏幕上向访问该站点的每个人打印错误。作为最佳安全实践,这应该被禁用。
- session.cookie_httponly = 1
将此设置为 1 将禁用通过 Javascript API 访问 cookie,但请谨慎使用,因为你可能会破坏某些东西
- session.use_strict_mode = 1
将此设置为 1 可防止会话固定攻击
- session.cookie_secure = 1
这要求 cookie 只能通过 HTTPS 严格传输
- session.cookie_samesite = Strict
将此设置为严格可防止跨源攻击
- session.use_trans_sid = 0
这不是必需的,因此将其设置为零
- session.sid_length = 128
在这里,我们设置会话字符串的长度以防止暴力攻击
- session.sid_bits_per_character = 6
这增加了会话字符串的随机性,也防止了暴力攻击
- file_uploads=off
在这里,我们禁用文件上传。如果有人需要上传文件,您可以通过执行 upload_max_filesize = 1M 来设置文件大小的限制
3. 使用最新的代码依赖、第三方组件,并更新您的网络服务器!
除了使用最新版本的 PHP 之外,您还应该使您的代码和 Web 服务器保持最新!这包括您正在使用的任何第三方库或框架。过时的软件往往是攻击的目标,因为黑客知道它更有可能存在可被利用的漏洞。您要确保只安装了必要的库并且所有内容都是最新的。如果您使用 Apache Web 服务器,那么这里有一些常见的最佳实践:
- 始终保持您的 Apache 版本更新。
- 打开错误记录
- 获取 SSL 证书
- 添加防火墙
- 安装 mod_evasive。
- 设置 HTTP 限制
- 永远不要保留未使用的模块
我们最喜欢的做法之一是安装 mod_evasive,因为它可以帮助您的服务器在发生攻击时保持运行。另一个是使用 SSL 证书。如果您使用的是 Apache Web 服务器或任何其他服务器,那么拥有 SSL 证书很重要,因为它会在收到包含主机标头的 HTTP 请求之前进行 SSL 握手。最终,它为在线通信提供了更高的安全性。
4. 不要使用可逆加密存储密码
可逆加密之所以有害,有几个关键原因。首先,它很容易被破解和解密,使您的数据容易被盗或暴露。其次,它可用于监视或跟踪您的活动,因为加密和解密过程会留下清晰的活动痕迹。最后,它还可以用于枚举所有其他用户密码,前提是有一个静态密钥用于加密和解密过程。
相反,您应该使用强大的哈希算法对密码进行哈希处理,例如 bcrypt、使用 openssl 的 AES 双向加密,甚至是获得密码哈希奖的 Argon2。使用散列算法比加密算法更不容易受到攻击。由于查找明文(解密)等价物需要强大的计算能力,这使得它们在存储密码或其他敏感数据时更加安全。此外,散列算法比加密算法快得多,使它们更适合在速度很重要的应用程序中使用。PHP 已经内置了 bcrypt,因此您不必担心下载任何外部依赖项。
5. 不要依赖 cookie 来保证安全
Cookie 通常用于存储有关用户的信息,例如他们的登录状态、用户名、偏好甚至敏感信息。但是,cookie 本身并不安全,很容易被攻击者窃取。如果您需要在 cookie 中存储敏感数据,您应该先对其进行加密。就像密码哈希一样,我们正在添加另一层安全性。您可以使用由 libsodium 提供支持的 halite 等工具,或者如果您想要更多技术,您可以使用 openssl 之类的工具,甚至可以使用带有 CBC 模式加密的 AES 256 位。
6.验证用户输入
所有用户输入都应在 PHP 代码处理之前进行验证。这包括输入到表单字段、URL 参数和 JSON 有效负载中的数据。PHP 有 filter_var() 函数来验证变量。我们可以将它的第二个参数设置为不同的值,并使用它来验证电子邮件、URL、整数等,该函数在失败或输入无效时返回 false。可以在下面的示例中看到实现 filter_var() 函数的方法:
function is_valid_email($email = "")
{
return filter_var(trim($email), FILTER_VALIDATE_EMAIL);
}
7.定期进行安全审计
定期安全审核可以帮助识别您网站中的漏洞并在它们被攻击者利用之前修复它们。通过审核您的代码,您
还可以确保它是最新的并遵循 ?PHP 安全性的最佳实践。此外,它可以帮助您获得更快的响应时间、更可靠的应用程序性能,并消除瓶颈,让您的 Web 应用程序面向未来。执行审核可以扫描以下内容,例如:
- 跨站脚本漏洞 (XSS)
- 跨站请求伪造漏洞 (CSRF)
- SQL注入
- PHP代码注入
- Cookie 拒绝服务攻击
- 定时攻击
8. 使用 PHP 库
PHP 很好地为开发人员提供了一些功能,这意味着它们为我们提供了可以用来更好地保护我们的应用程序的功能。您可以使用以下内容:
urlencode - 允许编码人员安全地构建有效的 URL。根据 PHP 文档,该函数可用于对将在 URL 的查询部分中使用的字符串进行编码。
<?php
echo '<a href=”mylink?user=', urlencode($userID), '”>';
?>
使用准备好的 SQL 语句,如下所示:
结论
遵循这些最佳实践将帮助您保护 PHP 应用程序免受攻击。请记住,始终保持您的软件处于最新状态,正确配置您的 Web 服务器和 PHP,并确保执行定期安全审核以识别可能已被遗漏的任何漏洞非常重要!
- 上一篇: 通过天干地支计算对应五行
- 下一篇: 除了Crontab,Swoole Timer也可以实现定时任务的
猜你喜欢
- 2025-01-10 AutoCAD命令大全, AutoCAD所有命令,AutoCAD命令集合
- 2025-01-10 资产管理如何做,用Excel vba,很简单,你还等什么
- 2025-01-10 除了Crontab,Swoole Timer也可以实现定时任务的
- 2025-01-10 通过天干地支计算对应五行
- 2025-01-10 PHP常用类 – 缓存类 cache
- 2025-01-10 php 一步步实现mvc架构——路由篇
- 2025-01-10 PHP类来实现一个数组,它将去除数组中所有值的头尾空格
- 2025-01-10 WordPress如何添加百度星火计划原创保护Meta标签
- 2025-01-10 【php学习笔记】php中trim()方法使用笔记
- 01-10AutoCAD命令大全, AutoCAD所有命令,AutoCAD命令集合
- 01-10资产管理如何做,用Excel vba,很简单,你还等什么
- 01-10除了Crontab,Swoole Timer也可以实现定时任务的
- 01-10PHP 安全的最佳实践
- 01-10通过天干地支计算对应五行
- 01-10PHP常用类 – 缓存类 cache
- 01-10php 一步步实现mvc架构——路由篇
- 01-10PHP类来实现一个数组,它将去除数组中所有值的头尾空格
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)