azecdev90 / seclibrary
PHP安全简单库
This package is not auto-updated.
Last update: 2024-09-21 13:52:03 UTC
README
SecLibrary是一个用PHP编写的简单库,旨在解决PHP开发者日常生活中的常见安全问题。该库的目的是为PHP初学者提供一些基本功能,并帮助他们避免最常见的错误。一些功能在原生PHP中存在,但由于许多初学者的误解,它们并不明显。
序言
从90年代中期到如今,PHP已经征服了网络世界。这种语言的普及速度极快,在这个领域没有真正的对手。庞大的社区是普及的结果。PHP的美妙之处在于其易于学习和灵活性。同时,庞大的社区对初学者产生了影响,使他们开始学习和使用这种语言。相对简单的学习曲线和庞大的社区对于编程或安全知识有限的初学者来说,是完美的选择。PHP不断添加一些功能,以确保对抗网络开发中最常见问题的工具。PHP中缺少的功能或令初学者困惑的工具都是这个项目的一部分。
安装
您可以通过两种方式安装此库并将其纳入您的项目。
手动
步骤1. 从GitHub下载此项目
步骤2.
解压归档
步骤3.
将解压的文件夹移动到您的服务器
通过Composer
composer require azecdev90/seclibrary
入门
您需要在项目中包含SecLibrary.php文件,并从命名空间导入函数。对于Composer安装,您可以选择使用自动加载选项。
如何使用
本项目根据主题按字母顺序分类。
转义
转义是我们使用它来安全显示从数据库中获取的信息的技术。这样我们可以确保潜在的攻击者无法进行跨站脚本攻击。这是一种当数据库内容未转义时,内容被显示和解释的攻击。这通常被攻击者用来窃取会话或在其浏览器上执行代码。
xssCleaner()
<?php xssCleaner($stringfromdatabase); ?>
注意:始终在输出时使用转义技术,而不是在输入时。
表单
当在PHP中处理表单时,一个主要问题是因为您的应用程序不知道请求的来源。这意味着一些攻击者可能诱骗受害者执行常规操作,而受害者并不知道。通常这类操作是攻击者试图对合法用户造成伤害的行为,例如删除账户或更改密码。防止此类攻击的解决方案称为请求令牌。这种选项背后的思想是在表单和会话中生成令牌,然后在动作页面上比较令牌。如果它们相同,则请求来自正常来源;如果它们不相同或没有令牌,则意味着它可能是潜在的攻击,您的Web应用程序需要拒绝该请求。使用此库实现此解决方案是一个简单的两步过程。第一步是在表单和会话中生成令牌。令牌通常以隐藏表单的形式存在,对最终用户不可见。
csrfGenerateToken()
csrfCompareTokens()
<input type="hidden" name="token" value="<?php echo csrfGenerateToken(); ?>">
本过程的第二步是比较令牌。
<?php if(csrfCompareTokens($_POST['token'])) { // tokens are equals and request is valid } else { // refuse request, because it is potentially type of CSRF attack } ?>
注意:您必须在这个过程的两个阶段都启动会话。
哈希
保护用户密码是安全Web应用程序过程中最重要的步骤之一。为什么这如此重要?原因在于人的本性。大多数人使用简单的密码,因为他们不想记住复杂的随机密码。这意味着如果有人破解并获取了您的用户密码,这可能会威胁到该用户使用的所有应用程序,Facebook和其他社交网络也属于此类,还包括电子邮件账户。如果密码没有被散列,机会是无限的。这个原因使得保护用户密码的过程变得如此重要。在以前,PHP程序员使用md5散列函数,这是Ronald Rivest在20世纪90年代初开发的md5算法。这是最近时期大多数程序员使用的方法。如今,这种方法来保护密码是不可接受的。原因是现在的硬件得到了改善和升级,它可以使用蛮力攻击破解密码。还有更多的选项,如sha-1等,但这不是保护密码的正确选择。与旧算法相比,我们需要使用Blowfish算法。这是从PHP 5.5.0版本开始保护密码的正确方式。在这个库中实现的Blowfish算法与原生PHP不同,因为它不接受盐,因为大多数初学者尝试以不恰当的方式制作盐,实际上使密码更不安全。在数据库表中存储密码的方法
hashPassword()
checkPassword()
<?php hashPassword($plainpassword); ?>
然后将它存储在表中。另一方面,为了比较密码是否正确,通常在页面上的用户/登录部分,方法如下。
<?php // $plainpass – usually from form // $hashedpass – usually from database checkPassword($plainpass, $hashedpass) { // Password from form and database are equals } ?>
注意:散列与加密过程不同。加密是双向过程,散列只是一向过程。加密对于用户/登录系统来说很重要,可以防御中间人攻击。使用加密的https协议是必须的!
图片
在PHP和其他语言中,文件上传是安全的重要部分。通过文件上传,您可以允许用户在您的服务器上上传“图像”。这为攻击者提供了很多可能的机会,他们试图上传非图像文件。通常这是shell文件,允许攻击者获取对您的Web服务器的访问权限。为了确保文件上传并最大化安全,可以使用不同的选项来确保Web服务器。另一方面,在PHP中,您可以做一些基本的事情来保护最常见类型的攻击。在表单请求之后,您有几个选项。
imgCheckExtension()
imgCheckMimeType()
imgRandomName()
<?php // $file to check extension // $allowedextensions = [‘jpg’,’png’] If(imgCheckExtension($file, $allowedextensions)) { // extension of this file is in allowed list } ?>
第二种方法是检查上传文件的内容类型。
<?php // $file to check mime type // $allowedmime = ['image/jpg', 'image/png'] If(imgCheckMimeType($file, $allowedmime)) { // file have right mime-type } ?>
使用上传文件生成随机名称也是提高安全级别的一种措施。
<?php $newname = imgRandomName(); ?>
注意:内容类型可能被伪造,因此强烈建议采取更多防护层。
包含
包含是一种攻击方式,攻击者利用动态包含页面的页面。有两种这类攻击:本地文件包含和远程文件包含。远程文件包含允许攻击者从远程资源包含代码或脚本并在您的Web服务器上运行。另一方面,本地文件包含包含来自同一服务器的文件。
checkInclusion()
<?php // $page = $_GET['page'] // $allowedlist = ['forum.php','about.php','history.php']; If(checkInclusion($page, $allowedlist) { // Page is in allowed list, safe include file include “$page”; } ?>
注意:保护远程文件包含的方法是设置服务器allow_url_include = off
验证
验证是我们检查输入是否以我们期望的方式进行的进程。验证是PHP安全中的第一道防线。
validateEmail()
validateNumber()
要检查电子邮件输入是否符合预期格式,我们可以使用
<?php validateEmail($emailfrominput); ?>
要检查输入是否为数字格式
<?php validateNumber($numberfrominput); ?>
结语
PHP程序员数量众多,同时大量没有良好安全性的应用使得人们产生了一种误解,认为PHP不是适合Web开发的正确工具。事实是,许多用PHP编写的应用在某些方面都存在漏洞。但这并非是特定语言的错,而是糟糕的编程实践导致的。基于Ruby和其他语言的现代框架也无法免疫某些类型的攻击。PHP中的问题在其他语言和框架中也同样存在。当然,有些框架遵循最佳实践,但如果程序员在安全领域的知识不足,这可能会成为一个问题。
安全性的概念是一个复杂的话题。这一概念需要强大的、广泛的知识体系。一般来说,策略是实施更多层次的保护和深度防御。这意味着如果攻击者可以避开一个层次,那么他也无法避开其他层次。此外,为了完全保护应用,必须明确程序员编写的代码只是安全的一层。其他重要的层次包括应用所托管的服务器配置。第三层保护是终端用户。你所服务的客户和开发的应用需要理解基本原理以及与安全相关的重视性。如果一些拥有高级权限的用户设置了简单且可预测的密码,那么即使代码良好的应用也可能处于威胁和危险的状态。