什么是最好的PHP输入清理功能?

时间:2010-06-27 01:39:24

标签: php filter sanitization

我正在尝试提出一个函数,我可以将所有字符串传递给sanitize。因此,从中输出的字符串对于数据库插入是安全的。但是那里有很多过滤功能,我不确定我应该使用/需要哪些功能。

请帮我填空:

function filterThis($string) {
    $string = mysql_real_escape_string($string);
    $string = htmlentities($string);
    etc...
    return $string;
}

13 个答案:

答案 0 :(得分:407)

答案 1 :(得分:31)

防止SQL注入的最有效的清理是使用PDO进行参数化。使用参数化查询,查询与数据分离,从而消除了一阶SQL注入的威胁。

在删除HTML方面,strip_tags可能是删除HTML的最佳选择,因为它只会删除所有内容。 htmlentities听起来像这样,所以它也有效。如果您需要解析允许哪个HTML(也就是说,您希望允许某些标记),则应使用成熟的现有解析器,例如HTML Purifier

答案 2 :(得分:11)

数据库输入 - 如何防止SQL注入

  1. 检查以确保整数类型的数据是有效的,确保它实际上是一个整数
    • 如果是非字符串,则需要确保数据实际上是正确的类型
    • 在字符串的情况下,你需要确保字符串被查询中的引号包围(显然,否则它甚至不起作用)
  2. 在避免SQL注入的同时将值输入数据库(mysql_real_escape_string或参数化查询)
  3. 从数据库中检索值时,请确保通过确保不能将HTML注入页面来避免跨站点脚本攻击(htmlspecialchars)
  4. 在插入或更新用户输入到数据库之前,您需要转义用户输入。这是一种较旧的方法。您现在想要使用参数化查询(可能来自PDO类)。

    $mysql['username'] = mysql_real_escape_string($clean['username']);
    $sql = "SELECT * FROM userlist WHERE username = '{$mysql['username']}'";
    $result = mysql_query($sql);
    

    数据库输出 - 如何防止XSS(跨站点脚本)

    仅在从数据库输出数据时使用htmlspecialchars()。这同样适用于HTML Purifier。示例:

    $html['username'] = htmlspecialchars($clean['username'])
    

    最后......您要求的内容

    我必须指出,如果你将PDO对象与参数化查询(正确的方法)一起使用,那么实际上没有简单的方法可以轻松实现。但是如果你使用旧的'mysql'方式,那么这就是你需要的。

    function filterThis($string) {
        return mysql_real_escape_string($string);
    }
    

答案 3 :(得分:5)

我5美分。

这里没有人理解mysql_real_escape_string的工作方式。 此功能不会过滤或“消毒”任何内容。
因此,您不能将此功能用作一些通用过滤器,以免您注射 只有当您了解其工作原理和适用位置时,才能使用它。

我对已经写过的非常相似的问题有了答案: In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?
请单击以获取有关数据库端安全性的完整说明。

至于性质 - 查尔斯正确地告诉你要将这些功能分开 想象一下,您将要插入由admin生成的数据,该数据允许发布HTML。你的功能会破坏它。

虽然我建议不要反对这些问题。这个功能很久以前就已经过时了。如果您想仅为HTML安全性而替换<>"字符,请使用为此目的而有意开发的功能 - htmlspecialchars()< / strong>一个。

答案 4 :(得分:2)

这取决于您使用的数据类型。一般最好使用的是mysqli_real_escape_string,但是,例如,您知道不会有HTML内容,使用strip_tags将增加额外的安全性。

您还可以删除不应该被允许的字符。

答案 5 :(得分:2)

对于数据库插入,您只需要mysql_real_escape_string(或使用参数化查询)。您通常不希望在保存数据之前更改数据,这是使用htmlentities时会发生的情况。当你再次通过htmlentities将其显示在网页的某个地方时,这会导致乱码。

在某个网页上显示数据时使用htmlentities

有点相关,如果您要在电子邮件中的某处发送提交的数据,例如使用联系表单,请确保从标题中将使用的任何数据中删除换行符(例如From:姓名和电子邮件地址, subect等)

$input = preg_replace('/\s+/', ' ', $input);

如果你不这样做,垃圾邮件机器人找到你的表格并滥用它只是时间问题,我已经学会了很难。

答案 6 :(得分:2)

答案 7 :(得分:1)

我总是建议使用像GUMP这样的小验证包: https://github.com/Wixel/GUMP

在这样的图书馆周围建立所有基本功能,几乎不可能忘记卫生。 “mysql_real_escape_string”不是良好过滤的最佳选择(如“你的常识”解释) - 如果你忘记只使用它一次,你的整个系统都会受到注射和其他讨厌攻击的攻击。<​​/ p>

答案 8 :(得分:1)

对于所有在这里讨论并依赖mysql_real_escape_string的人,您需要注意该函数在PHP5上已被弃用,而在PHP7上不再存在。

恕我直言,完成此任务的最佳方法是通过使用PDO与数据库交互来使用参数化查询。 检查以下内容:https://phpdelusions.net/pdo_examples/select

始终使用过滤器来处理用户输入。 参见http://php.net/manual/es/function.filter-input.php

答案 9 :(得分:0)

您在类似下面的代码中使用mysql_real_escape_string()

$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
  mysql_real_escape_string($user),
  mysql_real_escape_string($password)
);

正如文档所说,其目的是转义作为参数传递的字符串中的特殊字符,同时考虑连接的当前字符集,以便将其放在mysql_query()中是安全的。文档还补充说:

  

如果要插入二进制数据,则必须使用此功能。

当您在HTML内容中输出字符串时,

htmlentities()用于转换实体中的某些字符。

答案 10 :(得分:0)

这是我目前正在练习的方式之一,

  1. 植入csrf和salt诱惑令牌以及用户提出的请求,并从请求中一起验证它们。 Refer Here
  2. 确保不要过多地依赖客户端cookie,并确保练习使用服务器端会话
  3. 在解析任何数据时,请确保仅接受数据类型和传输方法(例如POST和GET)
  4. 确保对您的webApp / App使用SSL
  5. 确保还生成时基会话请求以故意限制垃圾邮件请求。
  6. 将数据解析到服务器后,请确保验证请求是否应在所需的数据方法中进行,例如json,html等...,然后继续
  7. 使用转义类型...(例如realescapestring)来转义输入中的所有非法属性。
  8. 之后,验证用户想要的数据类型的纯净格式。
    示例:
    -电子邮件:检查输入的电子邮件格式是否有效
    -文本/字符串:仅检查输入是否为文本格式(字符串)
    -数字:仅检查数字格式是否允许。
    -等。请参考php门户中的php输入验证库
    -验证后,请继续使用准备好的SQL语句/ PDO。
    -完成后,请确保退出并终止连接
    -完成操作后,请不要忘记清除输出值。

我相信所有这些足以满足基本要求。它应该阻止所有来自黑客的重大攻击。

对于服务器端安全性,您可能需要在apache / htaccess中设置访问限制和机械手防护以及路由防护。.除了服务器端系统的安全性之外,还有很多要做的服务器端安全性

您可以从htaccess的apsec秒级别(通用实践)中学习并获取秒的副本。

答案 11 :(得分:0)

function sanitize($string,$dbmin,$dbmax){
$string = preg_replace('#[^a-z0-9]#i', '', $string); //useful for strict cleanse, alphanumeric here
$string = mysqli_real_escape_string($con, $string); //get ready for db
if(strlen($string) > $dbmax || strlen($string) < $dbmin){
    echo "reject_this"; exit();
    }
return $string;
}

答案 12 :(得分:0)

这是什么

$string = htmlspecialchars(strip_tags($_POST['example']));

或这个

$string = htmlentities($_POST['example'], ENT_QUOTES, 'UTF-8');