是的,MySQL 在技术上可以安全地存储任何类型的文本。这意味着,MySQL 将按原样保存文本并再次返回它,而不会丢失任何数据。
Mysql 不会区分文本内容,因此无论是 HTML、CSS、JS 代码还是您朋友的最后一封电子邮件都没有区别。
但是,如果稍后输出文本,则应注意从 mysql 提取数据后不会出现不需要的代码注入。但这实际上与 MySQL 无关。
为了让你的sql更安全,将数据库句柄传递给mysql_real_escape_string甚至更好地使用MySQLi and/or PDO并准备了发言稿。
你的代码
您的代码看起来像是您正在努力阻止某些事情,但最终证明它毫无用处:
function filter($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data= strip_tags($data);
$data = mysql_real_escape_string($data);
return $data;}
在处理数据之前对其进行标准化
首先,您应该更改支票的位置get_magic_quotes_gpc
标准化函数正在处理的数据。如果您的应用程序不依赖它,而只是在启用该选项时拒绝工作,那就更好了 -请参阅此处的重要信息如果你关心安全。
但为了所发布代码的安全性,我们首先将函数的输入值规范化,然后再进一步处理。这是通过将检查移动到函数的顶部来完成的。
function filter($data)
{
// normalize $data because of get_magic_quotes_gpc
$dataNeedsStripSlashes = get_magic_quotes_gpc();
if ($dataNeedsStripSlashes)
{
$data = stripslashes($data);
}
// normalize $data because of whitespace on beginning and end
$data = trim($data);
// strip tags
$data = strip_tags($data);
// replace characters with their HTML entitites
$data = htmlentities($data);
// mysql escape string
$data = mysql_real_escape_string($data);
return $data;
}
在此修改后的函数中,魔术引号内容(您不应该使用)已移至其顶部。这确保了无论该选项打开或关闭,数据将始终以相同的方式处理。您的函数没有这样做,它会为传递的相同数据创建不同的结果。所以这个问题已经解决了。
您的功能存在更多问题
即使现在功能看起来好多了,但仍然存在很多问题。例如,不清楚该函数实际上是做什么的。它同时做很多事情,其中一些是矛盾的:
- 它删除了 HTML 标签,这是一个标志
$data
不应包含 HTML
- 但随后你将文本转换为
$data
实际上包含 HTML 实体。
那么数据应该是什么呢? HTML 与否?如果事情变得不清楚,它不会引入更多的安全性,因为这将有利于程序中出现错误,甚至最终通过安全预防措施。
因此,您应该扔掉代码并考虑以下事项:
- 如果您的应用程序的输入无效,请不要过滤它。相反,防止进一步使用无效输入。因此,在使用输入之前,您需要一个函数来验证输入。
- Don't change data just because you think this might make something more secure. Instead change and encode data where it is needed and appropriate.
- 让您的应用程序仅在关闭魔术引号的情况下工作。强烈建议不要依赖此功能。然后就不需要在代码中检查所有内容。
- 要在数据库中安全地存储某些内容,请在仅在查询中使用数据之前转义数据。不在您的应用程序的其他地方。为此使用准备好的语句。
- 如果数据有效,则在将数据放入数据库之前无需对其进行争论。但输出到网页时需要正确编码。并且只有应用程序才知道需要采用哪种编码。当您将数据放入数据库时您并不知道这一点。
因此,如果您想让代码更安全,这并不是将一堆函数扔到某些数据上,因为您认为这些函数与安全相关。这样做不仅不会使您的软件变得更安全,反而会降低其安全性。
- 永远不要相信用户数据。
- 确保数据采用您需要的格式预先处理.
- 在正确的地方使用正确的工具来完成工作。
-
切勿凭猜测使用工具。相反,获取知识,这不仅会带来安全方面的好处。