这是我目前使用的功能(来自我买的一本php书):
function escape($data) {
return mysql_real_escape_string(trim($data), $this->linkid);
}
但我觉得它可能更安全。例如,也许使用htmlspecialchars。 它总是让我偏执。我已经读过mysql_real_escape_string是坏的并且永远不会使用它,但是我也读过它是最好的方法。在将数据清理到数据库时,有很多关于数据清理的混淆。
那你怎么做的?你做这件事的方法有哪些优点和缺点。
答案 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的背景下回顾一下:
将文字转换为HTML: 用htmlspecialchars(...)
数据到HTML属性 htmlspecialchars(...,ENT_QUOTES)
HTML转换为HTML 使用HTMLPurifier等库来确保只存在有效标记。
将数据导入Javascript
我更喜欢json_encode
。如果要将其放在属性中,则仍需要使用#2,例如
将数据插入SQL 每个驱动程序都有某种类型的escape()函数。这是最好的。如果您使用普通的 latin1 字符集运行,则addslashes(...)是合适的。 mysql_real_escape_string()更好。不要忘记引号AROUND the addslashes()调用:
“INSERT INTO table1 SET field1 ='”。 addslashes($ data)。 “'”
命令行上的数据 escapeshellarg()和escapeshellcmd() - 阅读手册
- 牢记这些,您将消除95%*的常见网络安全风险! (*猜测)
答案 2 :(得分:1)
没有普遍的答案。它应该始终取决于您存储的数据。
is_numeric
(或类似)htmlentities
通过mysql_real_escape_string
运行所有数据是一个好主意。当然,这还取决于您的代码是使用DB库还是PDO或其他东西。
例如,使用PDO而不是mysql函数,您可能希望使用$pdo->quote
或Zend_Db的语句,因为它会为您自动转义。
答案 3 :(得分:1)
实际上 是元问题的“通用答案”(将用户提供的数据安全地存储到数据库中),这是:如果你没有使用绑定参数来避免整个注入问题首先,你做错了。
清洁数据是一个好主意,但你错过的机会很高。因此,无论您使用其他方法(并且Jani是正确的,它取决于数据),请不要忽略使用绑定变量。
传递的数据永远不会在没有约束的情况下点击查询。
答案 4 :(得分:0)
使用SOAP? Har har。
(免责声明:是的,这是一个笑话)
答案 5 :(得分:0)
只有在将数据置于敏感环境中之前,才能对数据进行消毒处理,例如:
不要使用一个通用转义函数,因为您会感觉数据是安全的 - 但事实并非如此。它的安全取决于具体情况。很明显,你不能一次 all 转义,不依赖于你可以使用数据的所有情况。因此,将原始数据保存在数据库中(是的,使用mysql_real_escape_string()
或某种参数绑定,例如使用PDO)并在放入上下文时使用特定的转义函数:
htmlspecialchars()
escape_shell_arg()
和escape_shell_cmd()
答案 6 :(得分:0)
通常,请使用filter_var()
如果只允许非常特定的格式或值,最好使用有效值的正则表达式或in_array()。
请记住,“输入”表示您无法直接控制的任何输入来源。
如果输入进入查询,请使用预准备语句(例如,mysqli)
答案 7 :(得分:-2)
在确保数据有效和/或格式良好之后(参见Jani Hartikainen的评论),您实际上只需要调用PHP的内置addslashes()。