防止PHP中的日志注入攻击的最佳方法是什么? 当然,我们应该清理输入,但是问题是如何清理以及必须清理什么?
例如,如果我正在记录可能来自用户的内容,第一步将是确保用户输入的内容,不会在操作系统中引起某些问题或应用程序的异常行为。然后,如果我们在应用程序中的某处显示日志条目,则需要确保不可能进行XSS和类似的攻击。
我正在考虑使用PHP sanitize filters作为一种可能的解决方案,但是我真的不知道该过滤掉什么。哪些字符可能很危险?
答案 0 :(得分:9)
这是我的观点,我喜欢保持日志尽可能不过滤,除了新行外,我从不过滤输入,以确保每个日志条目只有一行。
您需要确保以下几点:
include
,require
或eval
显示日志文件的内容;使用fopen
或file
读取文件并打印内容。答案 1 :(得分:1)
在存储或显示用户输入时,始终要确保过滤诸如let el=document.createElement("div");
el.attachShadow({mode:'open'})
let st=document.createElement("style");
st.innerHTML=`
div{
background:blue;
}
`
el.appendChild(st);
之类的HTML标签,这些HTML标签可能会在您的网站上执行外部javascript代码,因此可能会导致会话/ Cookie窃取。
还过滤诸如<script>
之类的标签,这些标签可能不会造成任何危害,但会干扰您的网站布局。
使用正则表达式来验证没有内置验证功能的输入。
答案 2 :(得分:1)
仅日志文件不是问题。只要文件没有被执行,只要它是带有病毒的二进制文件,就根本没有危险!日志文件也是如此:只要其内容不触发任何代码并以某种方式滥用它,就没有问题。
@ahmad已经提到过,如果您使用eval
之类的内容来显示日志文件将成为一个问题,因为它可以很好地执行代码,并且某些美元符号可能使攻击者可以做的比跨站点更多单独编写脚本。
但是fopen
一定更好吗?没有!因为过去的例子令人印象深刻。有人可能认为cat
是在控制台上显示文本的一种安全方法,但事实证明,be wrong甚至是最简单的打印一些文本的工具都损坏了,您也不应该相信什么,对吧?
在大多数情况下,这不是唯一的软件,这会使事情变得很危险。它通常是与其他软件的组合,可能无法控制。例如,考虑到您无法检查最新系统更新中的每一行代码是否存在软件的潜在副作用。
或者让我们假设您没有自己的服务器,但是您是Web服务提供商的客户,他还负责系统配置。让我们进一步假设,该服务提供商关心安全性并安装了某种入侵检测,例如fail2ban。直到您将程序引入服务提供商环境(反之亦然),这一切都可能真的很好,并且可能允许攻击者使用非常正则表达式不友好的东西破坏fail2ban,从而将其作为拒绝服务攻击的一部分占用系统(只是猜测)在这里,但我想指出的是要明确的意思。)