PHP 7.4弃用get_magic_quotes_gpc函数的替代方案

64

我遇到了这样一种情况:我的旧代码使用了get_magic_quotes_gpc(),但在最新的PHP版本7.4.*中已被弃用。

目前,我的代码类似于这样。

添加反斜杠

return get_magic_quotes_gpc() ? addslashes($string) : $string;

删除斜杠

return get_magic_quotes_gpc() ? stripslashes($string) : $string;

显然会出错

已弃用:函数 get_magic_quotes_gpc() 已弃用

问题:

我该如何修复它?在不使用 get_magic_quotes_gpc() 函数的情况下如何让它正常工作?


23
由于PHP不再向请求参数添加斜杠(在PHP 5.4中删除),所以get_magic_quotes_gpc()函数始终返回false。因此,您无需对字符串进行任何操作,它们应该始终是干净的。 - Phil
1
我也想不出任何使用addslashes()的有效理由。我无法理解为什么你会有像第一个片段那样的代码,即使在PHP 5.4之前。 - Phil
@Phil 你的意思是PHP自己处理所有这些易受攻击的注入吗? - Code Lover
3
不,恰恰相反。如今的PHP不再妨碍开发人员,而是将保护您的应用程序交给您自己。 - Phil
7
要保护什么并防止哪些漏洞?你的问题没有使用这段代码。如果您依赖此代码来清理SQL查询参数,请改用预处理语句。 - Phil
显示剩余3条评论
2个回答

105

您需要从代码中删除所有对此函数的提及,并不要用任何其他东西替换它。

自PHP 5.4.0发布以来,get_magic_quotes_gpc()已经没什么用处了。它会告诉您是否在配置中开启了魔术引号。魔术引号是一个可怕的想法,这个功能被删除是出于安全原因(PHP开发人员相信魔法和迷信并编写了不安全的代码)。

很可能您自己也不知道为什么在项目中有这行代码。当我学习PHP时,我也受到了它的影响。事实上,您根本不需要它。这个函数与安全无关,输入过滤的概念荒谬至极。

相反,依赖良好的安全指南。

  • 使用参数化准备语句与数据库进行交互。 PHP有一个非常好的库称为PDO,可以与许多DB驱动程序一起使用,包括MySQL。
  • 如果您生成输出,则应考虑该媒体的规则来转义输出。例如,当输出到HTML时,使用htmlspecialchars()来防止XSS。
  • 永远不要对输入进行消毒处理。没有任何神奇的解决方案可以完全保护你免受所有危险。作为一个开发者,你必须了解潜在的问题,并知道如何保护自己的代码。 不要试图对输入进行消毒处理,而应该对输出进行转义处理。

9
我不同意你的一般性说法,即所有输入都不需要甚至荒谬地进行消毒。 相反,您需要知道哪些类型的输入可以安全处理,并确保输入与之匹配。 虽然我同意这样一个误解,即一旦对其进行了消毒,它就可以安全地用于进一步使用。 FYI, get_magic_quotes 是在魔法可能会发生在您的脚本中的时代中实现安全和理智代码的要求。准备好的语句更好,但是它看起来也应该漂亮,不是吗?;) - Zefiro
@Zefiro 你难道没有考虑输入验证吗?你需要验证接收到的输入以确保它符合应用程序的预期,但这与安全无关。 - Dharman
2
没错,你说得对。不过我并没有真正看出什么区别来。在魔术引号的情况下,它是“使输入处于已知状态以供进一步处理”,也就是说,你可以自动地知道是否添加了转义斜杠。 (在准备语句之前的时代,这至少与安全有关) - Zefiro

12

get_magic_quotes_gpc() 函数替换为 false

然后通过删除无法访问的分支来简化复杂表达式。例如:

return get_magic_quotes_gpc() ? addslashes($string) : $string;

变得简单明了

return $string;

非常感谢你对如何最好处理这个废弃问题的简单解释。 - Zig Shanklin
非常感谢你对如何最好地处理这个废弃问题的简单解释。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接