将 html/css/js 添加到 mysql 的最安全方法是啥?

Posted

技术标签:

【中文标题】将 html/css/js 添加到 mysql 的最安全方法是啥?【英文标题】:What is the securest way to add html/css/js to mysql?将 html/css/js 添加到 mysql 的最安全方法是什么? 【发布时间】:2011-09-17 17:33:25 【问题描述】:

我目前正在使用以下 php 类将 html、css 和 javascript 代码存储到我的 mysql 数据库中。

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;

我真的想知道使用的代码是否足够安全以将 HTML / CSS / JS 代码存储在 mysql 数据库中?

【问题讨论】:

想知道这是否意味着我们可以将完整的站点存储在 mysql 数据库中。 【参考方案1】:

是的,从技术上讲,MySQL 可以安全地存储任何类型的文本。这意味着,MySQL 将按原样保存文本并再次返回它而不会丢失任何数据。

Mysql的文本内容没有区别,所以不管是HTML、CSS、JS代码还是你朋友上一封邮件都没有区别。

但是,如果您稍后输出文本,则应注意在从 mysql 提取数据后没有不需要的代码注入。但这实际上与 MySQL 无关。

为了让您的 sql 更安全,请将数据库句柄传递给 mysql_real_escape_string 或更好地使用 MySQLi 和/或 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 的位置,以规范该函数正在处理的数据。如果您的应用程序不依赖它,而只是在启用该选项时拒绝工作,那就更好了 - see this important information here about that 如果您关心安全性。

但是为了您发布的代码的安全性,让我们先对函数的输入值进行规范化,然后再进一步处理它。这是通过将检查移动到函数顶部来完成的。

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 与否?如果事情变得不清楚,它不会引入更多的安全性,因为这将有利于错误进入您的程序并最终甚至通过您的安全预防措施。

所以你应该扔掉代码并考虑以下几点:

如果应用程序的输入无效,请不要过滤它。而是防止进一步使用无效输入。因此,您需要一个函数来验证输入,然后再使用它。 不要仅仅因为您认为而更改数据,这可能会使某些东西更安全。而是在需要和适当的地方更改和编码数据。 让您的应用程序只在关闭魔术引号的情况下工作。强烈建议不要依赖此功能。然后就无需在您的代码中进行全面检查了。 要在数据库中安全地存储某些内容,请在仅在查询中使用之前转义数据。不在您的应用程序的其他地方。为此使用准备好的语句。 如果数据有效,则无需在将数据放入数据库之前进行整理。 但输出到网页时需要正确编码。并且只有应用程序才知道这需要采用哪种编码。当您将数据放入数据库时​​,您不知道这一点。

因此,如果您想让您的代码更安全,这并不是要向某些数据抛出一堆函数,因为您认为这些与安全相关。这样做不会使您的软件更安全,而是更不安全。

    永远不要相信用户数据。 确保数据采用预先处理所需的格式。 在正确的地方使用正确的工具完成工作。 切勿使用猜测的工具。取而代之的是获取知识,这不仅有利于安全。

【讨论】:

作为附加组件,MySQLi 也提供了准备语句功能。 我不知道其余代码的外观如何,但我发现 mysql_real_escape_string()过滤器或 w/e 函数中的数据令人困惑。如果我手动处理查询,我会尽可能地接近实际查询。否则,一个月后你将不记得你把那些逃逸的东西放在哪里并去寻找它,甚至认为你完全忘记了它。

以上是关于将 html/css/js 添加到 mysql 的最安全方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何将离线 Web 应用程序 (HTML+JS+CSS) 与我的服务器同步?

将 HTML/CSS/JS 主题应用到 React 应用程序的正确方法

HTML+CSS+JS实现好看的风车屋

HTML+CSS+JS实现好看的风车屋

如何在 pyinstaller 中添加静态(html、css、js 等)文件以创建独立的 exe 文件?

如何在 pyinstaller 中添加静态(html、css、js 等)文件以创建独立的 exe 文件?