[英]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的上下文中对此进行回顾:
文本转换成HTML:htmlspecialchars(...)
数据转换成HTML属性htmlspecialchars(...,ENT_QUOTES)
将HTML转换为HTML使用HTMLPurifier之类的库可确保仅存在有效的标记。
数据到Javascript我更喜欢json_encode
。 如果将其放在属性中,则仍需要使用#2,例如
将数据插入SQL每个驱动程序都有某种escape()函数。 最好 如果您以正常的latin1字符集运行,则使用addlashes(...)是合适的。 mysql_real_escape_string()更好。 不要忘了在adslashes()调用周围加引号:
“ INSERT INTO table1 SET field1 ='”。 addslashes($ data)。 “”
命令行上的数据escapeshellarg()和escapeshellcmd()-阅读手册
-谨记这些,您将消除95%*的常见Web安全风险! (* 一个猜测)
没有普遍的答案。 它应始终取决于要存储的数据。
is_numeric
(或诸如此类)运行它 htmlentities
通过mysql_real_escape_string
运行所有数据是一个好主意。 当然,这还取决于您的代码是使用数据库库还是PDO或其他方式。
例如,对于PDO,而不是mysql函数,您可能希望使用$pdo->quote
,或者与Zend_Db的语句一起使用,没有任何东西,因为它会自动为您转义。
这里实际上是一个“万能答案”的元级(用户提供数据安全存储到数据库中),它是这样的:如果你不使用绑定参数,以避免整个注入问题,首先,你错了做。
清理数据是一个好主意,但您错过某些事情的机会很高。 因此,无论您使用其他任何方法(Jani是正确的,这取决于数据),请不要忽略使用绑定变量。
传递的数据在没有绑定的情况下绝不能命中查询。
使用SOAP? 哈哈哈
(免责声明:是的,这是个玩笑)
仅在将数据放入敏感上下文之前对其进行清理,例如:
不要使用一个通用的转义函数,因为您会感觉到数据是安全的,但事实并非如此。 它的安全性取决于上下文。 显然,您不能一次完成所有转义操作,而与可以使用数据的所有情况无关。 因此,将原始数据保留在数据库中(是的,使用mysql_real_escape_string()
或某种类型的参数绑定,例如使用PDO),并在放入上下文时使用特定的转义功能:
htmlspecialchars()
escape_shell_arg()
和escape_shell_cmd()
通常,使用filter_var()
如果只允许使用非常特定的格式或值,则最好使用正则表达式或有效值的in_array()。
请记住,“输入”是指您不直接控制的任何输入源。
如果输入要查询,请使用准备好的语句(例如,mysqli)
在确保数据有效和/或格式正确之后(请参阅Jani Hartikainen的评论),您实际上只需要调用PHP的内置addlashes()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.