你如何消毒你的数据?

时间:2009-07-09 20:58:12

标签: php

这是我目前使用的功能(来自我买的一本php书):

function escape($data) {
    return mysql_real_escape_string(trim($data), $this->linkid);    
}

但我觉得它可能更安全。例如,也许使用htmlspecialchars。 它总是让我偏执。我已经读过mysql_real_escape_string是坏的并且永远不会使用它,但是我也读过它是最好的方法。在将数据清理到数据库时,有很多关于数据清理的混淆。

那你怎么做的?你做这件事的方法有哪些优点和缺点。

8 个答案:

答案 0 :(得分:4)

你在谈论两种不同类型的逃避。

mysql_real_escape_string()转义数据,因此发送给MySQL是安全的。

htmlspecialchars()转义数据,因此发送到呈现HTML的内容是安全的。

两者都可以用于各自的目的,但parameterized queries via something like mysqli相当简洁。

答案 1 :(得分:4)

让我们快速回顾一下为什么在不同情况下需要逃避:

如果您使用引号分隔字符串,则需要能够转义引号。 如果您使用的是xml,则需要将“内容”与“标记”分开 如果您使用的是SQL,则需要将“命令”与“数据”分开 如果您在命令行中,则需要将“命令”与“数据”分开

这一般是计算的一个基本方面。因为分隔数据的语法可以在数据中出现,所以需要有一种方法来区分DATA和SYNTAX,从而逃避。

在网络编程中,常见的逃避案例是: 1.将文本输出为HTML 2.将数据输出到HTML属性 3.将HTML输出为HTML 4.将数据插入Javascript 5.将数据插入SQL 6.将数据插入shell命令

如果处理不当,每个人都会有不同的安全隐患。这真的很重要!让我们在PHP的背景下回顾一下:

  1. 将文字转换为HTML: 用htmlspecialchars(...)

  2. 数据到HTML属性 htmlspecialchars(...,ENT_QUOTES)

  3. HTML转换为HTML 使用HTMLPurifier等库来确保只存在有效标记。

  4. 将数据导入Javascript 我更喜欢json_encode。如果要将其放在属性中,则仍需要使用#2,例如

  5. 将数据插入SQL 每个驱动程序都有某种类型的escape()函数。这是最好的。如果您使用普通的 latin1 字符集运行,则addslashes(...)是合适的。 mysql_real_escape_string()更好。不要忘记引号AROUND the addslashes()调用:

    “INSERT INTO table1 SET field1 ='”。 addslashes($ data)。 “'”

  6. 命令行上的数据 escapeshellarg()和escapeshellcmd() - 阅读手册

  7. - 牢记这些,您将消除95%*的常见网络安全风险! (*猜测)

答案 2 :(得分:1)

没有普遍的答案。它应该始终取决于您存储的数据。

  • 它应该是一个数字吗?然后通过is_numeric(或类似)
  • 运行它
  • 是不允许包含HTML的字符串?使用htmlentities

通过mysql_real_escape_string运行所有数据是一个好主意。当然,这还取决于您的代码是使用DB库还是PDO或其他东西。

例如,使用PDO而不是mysql函数,您可能希望使用$pdo->quote或Zend_Db的语句,因为它会为您自动转义。

答案 3 :(得分:1)

实际上 是元问题的“通用答案”(将用户提供的数据安全地存储到数据库中),这是:如果你没有使用绑定参数来避免整个注入问题首先,你做错了。

清洁数据是一个好主意,但你错过的机会很高。因此,无论您使用其他方法(并且Jani是正确的,它取决于数据),请不要忽略使用绑定变量。

传递的数据永远不会在没有约束的情况下点击查询。

答案 4 :(得分:0)

使用SOAP? Har har。

(免责声明:是的,这是一个笑话)

答案 5 :(得分:0)

只有在将数据置于敏感环境中之前,才能对数据进行消毒处理,例如:

  • SQL查询的一部分
  • 文件名或路径的一部分
  • shell命令的一部分
  • HTML输出的一部分(或任何其他输出,如CSV,XML,ATOM等)

不要使用一个通用转义函数,因为您会感觉数据是安全的 - 但事实并非如此。它的安全取决于具体情况。很明显,你不能一次 all 转义,不依赖于你可以使用数据的所有情况。因此,将原始数据保存在数据库中(是的,使用mysql_real_escape_string()或某种参数绑定,例如使用PDO)并在放入上下文时使用特定的转义函数:

    在HTML上下文中
  • htmlspecialchars()
  • 在shell命令上下文中
  • escape_shell_arg()escape_shell_cmd()
  • 等等

答案 6 :(得分:0)

  1. 通常,请使用filter_var()

  2. 如果只允许非常特定的格式或值,最好使用有效值的正则表达式或in_array()。

  3. 请记住,“输入”表示您无法直接控制的任何输入来源。

  4. 如果输入进入查询,请使用预准备语句(例如,mysqli)

答案 7 :(得分:-2)

在确保数据有效和/或格式良好之后(参见Jani Hartikainen的评论),您实际上只需要调用PHP的内置addslashes()。