繁体   English   中英

您如何清理数据?

[英]How do you sanitize your data?

这是我当前使用的功能(从我购买的PHP书中):

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

但是我觉得这可能更安全。 例如,也许使用htmlspecialchars。 这总是让我偏执。 我读过mysql_real_escape_string不好并且从不使用它,但是我也读过它是最好的方法。 将数据插入数据库时​​,在数据清理方面存在很多困惑。

你是怎么做到的? 以及您这样做的利弊是什么

您正在谈论两种不同类型的转义。

mysql_real_escape_string()转义数据,因此可以安全地发送到MySQL。

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

两者都可以很好地用于各自的目的,但是通过mysqli之类的参数化查询会更加整洁。

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

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

通常,这是计算的真正基本方面。 由于定界数据的语法可能出现在DATA中,因此需要一种将DATA与SYNTAX区别开来的方法,从而进行转义。

在Web编程中,常见的转义情况为: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字符集运行,则使用addlashes(...)是合适的。 mysql_real_escape_string()更好。 不要忘了在adslashes()调用周围加引号:

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

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

-谨记这些,您将消除95%*的常见Web安全风险! (* 一个猜测)

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

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

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

例如,对于PDO,而不是mysql函数,您可能希望使用$pdo->quote ,或者与Zend_Db的语句一起使用,没有任何东西,因为它会自动为您转义。

这里实际上一个“万能答案”的元级(用户提供数据安全存储到数据库中),它是这样的:如果你不使用绑定参数,以避免整个注入问题,首先,你错了做。

清理数据是一个好主意,但您错过某些事情的机会很高。 因此,无论您使用其他任何方法(Jani是正确的,这取决于数据),请不要忽略使用绑定变量。

传递的数据在没有绑定的情况下绝不能命中查询。

使用SOAP? 哈哈哈

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

仅在将数据放入敏感上下文之前对其进行清理,例如:

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

不要使用一个通用的转义函数,因为您会感觉到数据是安全的,但事实并非如此。 它的安全性取决于上下文。 显然,您不能一次完成所有转义操作,而与可以使用数据的所有情况无关。 因此,将原始数据保留在数据库中(是的,使用mysql_real_escape_string()或某种类型的参数绑定,例如使用PDO),并在放入上下文时使用特定的转义功能:

  • 在HTML上下文中的htmlspecialchars()
  • 在shell命令上下文中时的escape_shell_arg()escape_shell_cmd()
  • 等等
  1. 通常,使用filter_var()

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

  3. 请记住,“输入”是指您不直接控制的任何输入源。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM