关键要点
allow_url_fopen
和allow_url_include
设置来避免这种情况。session_regenerate_id()
函数定期更改会话ID,并将会话ID存储在只有你的脚本可以访问的地方来防止此类攻击。安全性不仅仅是一系列操作,更是一种思维方式,一种看待问题的方式,一种处理世界的方式。它意味着“我不知道他们会怎么做,但我知道他们会试图搞砸我的系统”,然后积极主动地预防问题,而不是陷入消极情绪。然而,你无法违背统计规律。没有人会阅读一篇题为“为安全编码”的文章。每个人都想要一篇包含数字的文章,例如:“8种最常见的PHP安全攻击及如何避免它们”、“23件不要对超级名模说的话”和“15个避免辐射中毒的理由”。所以,这里列出了“十大PHP安全漏洞”。
SQL注入
榜首是SQL注入攻击。在这种情况下,有人将SQL代码片段(经典示例是删除数据库语句,尽管还有许多其他可能具有破坏性的操作)作为值输入到你的URL或网页表单中。现在先别管他是怎么知道你的表名的;那是另一个问题。你正在与一个阴险而足智多谋的敌人作斗争。那么,你能做些什么来避免这种情况呢?首先,你必须对从用户那里接收的任何输入都保持怀疑态度。相信每个人都很友善?看看你配偶的家人……他们很奇怪,很古怪,有些甚至很危险。防止此类问题的办法是使用PDO预处理语句。我现在不想详细讨论PDO。只需说预处理语句将数据与指令分离即可。这样做可以防止数据被视为数据以外的任何其他内容。更多信息,你可以查看Timothy Boronczyk撰写的文章《从MySQL扩展迁移到PDO》。
跨站脚本攻击(XSS)
诅咒那些依靠这种欺骗手段生存的黑心人。父母们,今天就和孩子们谈谈,以免他们成为邪恶的XSS攻击者!任何XSS攻击的本质都是将代码(通常是JavaScript代码,但可以是任何客户端代码)注入到你的PHP脚本的输出中。当你显示发送给你的输入时,这种攻击是可能的,例如,你可能会在论坛帖子中这样做。攻击者可能会在他的消息中发布JavaScript代码,这些代码会对你的网站造成不可言喻的损害。请不要让我详细说明;想到这些强盗能够做的事情,我的心就痛。有关更多信息以及如何保护自己,我建议阅读PHPMaster上的这些优秀文章:
源代码泄露
这与人们能够在Apache配置出现故障时看到他们不应该看到的的文件名称和内容有关。是的,我明白,这种情况不太可能发生,但它可能会发生,而且很容易保护自己,所以为什么不呢?我们都知道PHP是服务器端的——你不能只查看源代码就能看到脚本的代码。但是,如果Apache发生故障,并且你的脚本突然以纯文本形式提供服务,那么人们就会看到他们本不应该看到的源代码。其中一些代码可能会列出可访问的配置文件,或者包含敏感信息,例如数据库凭据。解决方案的核心在于你如何设置应用程序的目录结构。也就是说,坏人能够看到一些代码并不是问题,问题在于如果敏感文件保存在公共目录中,他们能够看到哪些代码。将重要文件保存在公共可访问目录之外,以避免此错误的后果。有关更多信息,包括你的目录结构示例,请参阅本文中的第5点。有关此主题的更多讨论,请参阅此论坛讨论。
远程文件包含
请稍等,让我解释一下:远程文件包含是指远程文件被包含在你的应用程序中。很深奥吧?但这为什么是个问题呢?因为远程文件是不可信的。它可能已被恶意修改,包含你不想在应用程序中运行的代码。假设你的www.myplace.com网站包含库www.goodpeople.com/script.php。有一天晚上,www.goodpeople.com被入侵,文件内容被替换为恶意代码,这些代码会破坏你的应用程序。然后有人访问你的网站,你引入更新后的代码,然后——砰!那么你该如何阻止它呢?幸运的是,修复这个问题相对简单。你只需转到你的php.ini并检查这些标志的设置即可。
allow_url_fopen
– 指示是否可以包含外部文件。默认设置为“on”,但你应该将其关闭。allow_url_include
– 指示include()
、require()
、include_once()
和require_once()
函数是否可以引用远程文件。默认情况下将其关闭,并且将allow_url_fopen
关闭也会强制将其关闭。会话劫持
会话劫持是指一个坏人窃取并使用其他人的会话ID,这就像一个安全保管箱的钥匙。当在客户端和Web服务器之间建立会话时,PHP可能会在客户端存储一个名为PHPSESSID的cookie中的会话ID。将ID与页面请求一起发送可以访问服务器上持久保存的会话信息(这会填充超级全局变量$_SESSION
数组)。如果有人窃取了会话密钥,这糟糕吗?答案是:如果你在该会话中没有执行任何重要操作,则答案是否定的。但是,如果你使用该会话来验证用户,那么它将允许一些卑鄙的人登录并进入某些内容。如果用户很重要并且拥有很多权限,那么这尤其糟糕。那么人们是如何窃取这些会话ID的,我们这些正直敬畏上帝的人又能做些什么呢?会话ID通常通过XSS攻击被窃取,因此防止XSS攻击是一件可以产生双重效益的好事。尽可能频繁地更改会话ID也很重要。这会缩短你的被盗时间窗口。在PHP中,你可以运行session_regenerate_id()
函数来更改会话ID并通知客户端。对于使用PHP 5.2及更高版本的用户(你正在使用吧?),有一个php.ini设置可以防止JavaScript访问会话ID(session.cookie.httponly
)。或者,你可以使用session_set_cookie_parms()
函数。如果使用共享托管服务(这些服务将会话信息存储在全局可访问的目录中,例如/tmp
),则会话ID在服务器端也可能存在漏洞。你可以通过简单地将会话ID存储在只有你的脚本可以访问的位置(在磁盘上或数据库中)来阻止此问题。
跨站请求伪造
跨站请求伪造(CSRF),也称为布雷特·马弗里克或肖恩·斯宾塞的策略,涉及诱骗一个相当不知情的用户发出一个我们应该说对他自己最不利的请求。但是,与其让我继续讨论CSRF攻击,不如参考PHPMaster上关于此类内容的杰出示例:Martin Psinas撰写的《防止跨站请求伪造》。
目录遍历
这种攻击,就像许多其他攻击一样,寻找安全性不尽如人意的网站,并且当它找到一个网站时,它会导致访问所有者不打算公开访问的文件。它也称为../
(点、点、斜杠)攻击、攀爬攻击和回溯攻击。有几种方法可以防止这种攻击。首先是衷心希望它不会发生在你身上。有时许愿给仙女和独角兽会有帮助。有时则不会。第二种方法是使用白名单定义可以为给定请求返回哪些页面。另一种选择是将文件路径转换为绝对路径,并确保它们引用允许目录中的文件。
总结
这些是十大问题,如果你不小心避免这些问题,可能会导致你的PHP应用程序被入侵。是的,10个。数一数……1、2、3……什么?你只数了8个?好吧,也许是7个。好吧,这表明你很容易被愚弄,而我什至不是坏人! 图片来自Fotolia
PHP安全漏洞常见问题解答(FAQ)
最常见的PHP安全漏洞包括SQL注入、跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、文件包含漏洞和PHP对象注入。如果处理不当,这些漏洞可能导致未经授权的访问、数据盗窃,甚至服务器接管。对于开发人员来说,了解这些漏洞并实施适当的安全措施以保护他们的PHP应用程序至关重要。
可以使用预处理语句或参数化查询来防止SQL注入。这些方法确保用户输入始终被视为文字数据,而不是SQL命令的一部分。这有效地消除了SQL注入的风险。此外,始终验证和清理用户输入,以确保其不包含恶意代码。
跨站脚本攻击(XSS)是一种漏洞,允许攻击者将恶意脚本注入到其他用户查看的网页中。这可能导致会话劫持、身份盗窃和其他严重问题。为了防止XSS,始终对用户输入进行编码,切勿将不受信任的数据插入到HTML输出中。
可以使用反CSRF令牌来防止CSRF攻击。这些是与用户会话关联的唯一随机值。它们包含在每个状态更改请求(例如表单提交)中,并由服务器检查。如果令牌丢失或不正确,则请求将被拒绝。
文件包含漏洞是指应用程序使用用户输入来构建文件路径进行操作的情况。攻击者可以操纵输入以包含来自远程服务器的文件,从而导致代码执行、数据泄漏或拒绝服务。为了减轻此漏洞,请避免在文件路径中使用用户输入,或者彻底验证和清理输入。
PHP对象注入是一种漏洞,当用户输入用于实例化类时会发生这种情况。攻击者可以操纵输入以创建任何类的实例并执行其方法。为了防止这种情况,切勿取消序列化来自不受信任来源的数据。
可以通过使用安全cookie、登录后重新生成会话ID以及实现会话超时来保护PHP会话。此外,将会话数据存储在服务器端,只使用会话ID来引用它。
PHP安全的一些最佳实践包括:保持PHP版本最新、使用安全配置设置、验证和清理用户输入、使用安全密码哈希算法以及实施正确的错误处理。
可以通过代码审查、渗透测试和使用自动安全工具来检测PHP漏洞。定期审核应用程序是否存在安全漏洞是维护安全PHP应用程序的关键部分。
有很多资源可以学习PHP安全性,包括PHP手册、在线教程、安全博客和论坛。此外,OWASP等组织提供了关于Web应用程序安全的全面指南。
以上是PHP主|前10个PHP安全漏洞的详细内容。更多信息请关注PHP中文网其他相关文章!