【问题标题】:Is this sufficient security for user input in PHP [duplicate]这对于 PHP 中的用户输入是否足够安全[重复]
【发布时间】:2012-06-15 18:14:08
【问题描述】:

可能重复:
The ultimate clean/secure function

阅读 PHP 安全性后,我感觉我编写的任何代码总是不安全的。因此,为了解决用户输入的安全问题,我创建了一个函数,允许我在任何使用情况下转义和删除用户输入。

我只是想知道这实际上是否安全,以及是否可以使其更安全。这还能防止什么样的攻击?从我可以通过使用 _GET 告诉 XSS 的情况来看,HTML 输入和 MYSQL 注入会被阻止?

function _INPUT($name,$tag,$sql,$url)
{
if ($_SERVER['REQUEST_METHOD'] == 'GET')
    $filter = ($_GET[$name]);//Assign GET to filter variable

    if ($tag == true)//Remove all HTML, PHP and JAVASCRIPT tags
    {
        $filter = strip_tags($filter);
    }
    if ($sql == true)//If MYSQL escaping is enabled
    {
        $filter = mysql_real_escape_string($filter);
    }
    if ($url == true)//If URL encoding is enabled
    {
        $filter = urlencode($filter);
    }
    return $filter;     

}

$output = _INPUT('name',true,true,true);

我也会为 MYSQL 使用准备好的语句,尽管我需要更多地阅读它们以完全了解它如何防止注入。

感谢您的宝贵时间。

【问题讨论】:

  • 如果您担心安全性,您不应该在 php 中使用 mysql_* 函数,您应该使用 mysqli_* 函数。
  • 另外,如果您想 100% 停止 SQL 注入,请查看准备好的语句。 php.net/manual/en/mysqli.prepare.php
  • 就像 Frank_Hemsowrth 所说的,完全摆脱所有 mysql_* 函数。将它们视为已弃用的函数,如下所述:news.php.net/php.internals/53799 一定要查看准备好的语句......而且可能值得您花时间研究 PDO 作为您的连接“代理”......将使您的生活更轻松长期...
  • 使用 mysqli 或 PDO 没有内在的安全优势。他们只是更方便。更方便确保物品安全。这是一个很好的副作用,而不是功能。
  • strip_tags() 仅在您注入打开的 html 上下文时对 xss 攻击有用。为了防止 html 文档的其他区域出现 xss,您需要进行非常不同的编码。请阅读owasp.org/index.php/…

标签: php mysql security input escaping


【解决方案1】:

再说一次,没有通用的转义函数可以神奇地让事情变得“安全”。

看到这个:https://stackoverflow.com/a/7810880/362536

不同的转义方法用于不同的事情。你不能只通过一堆应该在特定上下文中使用的函数来运行一堆数据。您正在创建垃圾数据,并且并不比最初使用原始用户数据更安全。

【讨论】:

  • 这个我明白了,所以这个函数让我可以选择转义方式。这三个过滤器可能不会同时使用。
  • 那为什么首先要有一个函数呢?您将如何指定订单?整个概念并不是一个聪明的方法。我建议放弃这个想法并以正确的方式这样做。
  • 我觉得这很混乱,当你说正确的方法时,你的意思是直接将正确的转义方法直接添加到变量/输入中?
  • 我的意思是,您需要了解所有这些功能的作用以及何时使用它们。在我发布到另一个答案的链接中,我概述了这一点。对于数据库,使用准备好的查询(不需要转义,因为数据不是简单地连接到查询中)。对于 HTML,htmlspecialchars() 负责使用正确的 HTML 实体,为您提供有效的 HTML 以及其他人无法将自己的脚本标签插入到您的站点中的好处。还有其他的,但我的空间不够了,我发布的链接已经有这个信息......
【解决方案2】:

不,

对于 SQL 注入预防,您确实希望使用prepared statements。这是一种更安全的方法,而不是转义引号。您还想使用 htmlspecialchars() 转义 HTML 标记,而不是仅仅将它们剥离,但这取决于您。

【讨论】:

  • 是的,我目前正在研究准备好的陈述。 htmlspecialchars() 听起来也很有趣。谢谢。
  • Htmlspecialchars 仅在输出之前,而不是在保存到数据库之前。
【解决方案3】:

这是一个永恒的问题,答案因所需用途而异:对于准备好的查询,我相信使用自己的变量系统并让它处理输入是 100% 安全的。对于 HTML 输出,剥离标签可能并不总是您想要的;此外,将允许输入的内容列入白名单比黑名单更安全,因为你知道,黑客有幻想。对于 URL 输出,您的解决方案应该没问题,但请注意,其他一些平台可能会执行一些不同的 URL 编码(参见 Java 标准库和 iOS/Mac 库编码的字符串 URL 之间的区别,即)。

【讨论】:

  • 感谢您的建议。我忘了提到我还将限制输入并根据格式对其进行验证。例如电子邮件或电话号码。
猜你喜欢
  • 2013-01-05
  • 2014-08-16
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
  • 2011-05-06
  • 2013-09-20
相关资源
最近更新 更多