Php 如何预防<;meta http equiv=";刷新“&燃气轮机;攻击?

Php 如何预防<;meta http equiv=";刷新“&燃气轮机;攻击?,php,apache,security,Php,Apache,Security,我认为黑客(或脚本小子)利用网站代码库的漏洞攻击了我的网站。数据库中的帖子已更改,因此它们包含以下html: <meta http-equiv="refresh" content="0;url=http://example.com"/> 但我现在不能重写系统。防止这种情况在未来发生的策略是什么 我正在考虑将管理脚本迁移到允许访问特定域的子域。或者使用mod_security SecFilterScanPOST并扫描所有包含http equiv等的post请求,或者只允许来自我的

我认为黑客(或脚本小子)利用网站代码库的漏洞攻击了我的网站。数据库中的帖子已更改,因此它们包含以下html:

<meta http-equiv="refresh" content="0;url=http://example.com"/>

但我现在不能重写系统。防止这种情况在未来发生的策略是什么

我正在考虑将管理脚本迁移到允许访问特定域的子域。或者使用mod_security SecFilterScanPOST并扫描所有包含http equiv等的post请求,或者只允许来自我的服务器或所有服务器的post请求


谢谢。

如果您不想在从数据库读取数据时转义数据(您应该这样做),那么这是一个懒惰的解决方案

请参阅和上的OWASP


不要清理您的输入—您希望原始的
在数据库中—而是将其视为不受信任的数据,并在输出时对其进行转义/解除锁定。

第一步可能是调查代码注入的位置,这可能有助于您确定根子句是什么-

  • 如果您的网站从数据库获取内容,并且注入的标记作为数据库内容的一部分被检索,则您的网站可能存在SQL注入漏洞或其他漏洞,允许攻击者更改其中的内容

  • 如果每个PHP文件中都有该标记,则表示攻击者可以访问您的文件系统。他可以访问您的FTP或telnet或任何其他管理控制台,或者您的网站存在漏洞,允许攻击者修改/创建网站上的文件

  • 您的服务器也可能存在允许攻击者进行此类访问的漏洞

  • 确定根本原因后,相应地修复它=)

    以下是一些有助于防止类似情况再次发生的一般建议:

  • 通过代码检查、笔试或一些自动扫描,检查您的网站和服务器是否存在漏洞,并相应地进行修复

  • 及时安装更新、修补程序和安全补丁。保持更新,更新,更新,更新

  • 在文件系统上分配适当的文件夹权限(读写、只读、无访问权限),并仅向用户授予必要的权限(最小权限原则)

      例如,您可以考虑使Web服务器用户仅对所有Web内容文件夹(除了上传文件夹)可读。<李>
    • 配置文件通常不要求web服务器用户可写。通常,它们只能由管理员写入。还要注意,不要允许通过web服务器(即通过web服务器的http://url)访问此类文件的内容。将它们直接放在web内容根目录之外是一个好主意
    • 将任何上传文件夹放在web内容根目录之外也是一个好主意
    • 挖掘文件的所有者,因为所有者可以自由更改文件的权限
  • 使用第三方组件(例如Wordpress/Joomla插件)时要小心。仅当您信任发布者时使用。仅从主站点下载。记住也要让它们保持最新。如有必要,禁用并删除它们

  • 限制对管理控制台和服务的访问,如FTP、Telnet、数据库管理控制台(如phpMyAdmin)等。为其分配良好的密码。最好的方法是不要让任何未经授权的人访问它(例如,使用防火墙或配置中设置的IP限制,或将其隐藏在VPN后面)

    • 实际上,在传输密码(尤其是管理员密码)时,应该避免使用任何明文协议。通常有加密的替代方案,例如Telnet->SSH、FTP->SFTP/FTP、HTTP/HTTPS
    • 数据库端口确实应该避免从Internet访问。只有极少数的斯克雷纳里奥你会需要这个。在大多数情况下,将其配置为在环回接口上侦听

  • 最好的解决方案是清理数据。此外,您可能还需要进一步调查,以防他们破坏服务器本身,这将是一个问题,而不是试图阻止他们已经做了什么。如果你的核心应用程序有安全漏洞,你需要通过修复这些漏洞来保护它。不是在外面贴绷带。@deceze虽然如此,但在现实中并不总是这样world@Sprague这听起来真像是一个真实世界的借口。@Jack,别天真了。询问者已经声明重写不是一个选项。我还说,我同意德克塞的逻辑的优点。。。但他的评论并没有转向回答这个问题,而是试图避免提问。不要对你的意见进行净化。。。等等,什么?@jack:是的:@FrancoisBourgeor谢谢..将HTML插入数据库与SQL注入有什么关系?您也可以通过完美保存准备好的语句来完成此操作…@circle感谢您提供了这一长而有用的答案。我会保留它,并把它给我未来的孩子:)我认为安全是一个清单问题。像飞行员一样,你应该检查所有东西而不依赖人类记忆…@FrancoisBullenger Yes prepared语句是SQL注入的有效措施。如果数据库参与生成页面内容,那么SQL注入并不是将HTML内容插入页面的唯一方法,这是正确的。也可以使用存储的XSS或类似工具来实现这一点。我在这里命名SQLi是因为蠕虫在许多CMS(例如Joomla)中利用已知SQLi插入恶意页面标题是非常常见的。我一次做了不同的事情,所以我在从db读取数据时逃逸了:)谢谢你的回答。。
    function escape_deep(&$value)
    {
     $value = htmlspecialchars($value);
    }
    
    array_walk_recursive($_GET, 'escape_deep');
    array_walk_recursive($_POST, 'escape_deep');