php - 将 html/css/js 添加到 mysql 的最安全方法是什么?

标签 php javascript mysql html

我目前正在使用以下 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 可以在技术上安全地存储任何类型的文本。这意味着,MySQL 将按原样保存文本,并在不丢失任何数据的情况下再次返回它。

Mysql 对文本内容没有区别,所以无论是 HTML、CSS、JS 代码还是您 friend 的最后一封电子邮件都没有区别。

但是,如果稍后输出文本,则应注意在从 mysql 中提取数据后没有不需要的代码注入(inject)。但这实际上与 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 与否?如果事情变得不清楚,它不会引入更多的安全性,因为这将有利于错误进入您的程序,最终甚至可以通过您的安全预防措施。

    所以你应该扔掉代码并考虑以下几点:
  • 如果您的应用程序的输入无效,请不要对其进行过滤。而是防止进一步使用无效输入。因此,您需要一个函数来验证输入,然后再使用它。
  • 不要仅仅因为您认为这可能会更安全而更改数据。而是在需要和适当的地方更改和编码数据。
  • 使您的应用程序仅在关闭魔术引号的情况下工作。非常不鼓励依赖此功能。然后就没有必要在你的代码中检查一遍了。
  • 要将某些内容安全地存储在数据库中,请仅在查询中使用数据之前对其进行转义。不是在你的应用程序的其他地方。为此使用准备好的语句。
  • 如果数据有效,则无需在将数据放入数据库之前对其进行纠缠。 但是输出到网页时需要正确编码 。并且只有应用程序知道这需要采用哪种编码。当您将数据放入数据库时​​,您不知道这一点。

  • 所以如果你想让你的代码更安全,这不是把一堆函数扔到一些数据上,因为你认为这些是安全相关的。通过这样做,您不会使您的软件更安全,但会降低安全性。
  • 永远不要相信用户数据。
  • 确保数据在处理之前采用您需要的格式。
  • 在正确的地方使用正确的工具完成工作。
  • 切勿随意使用工具。 获取知识,这不仅可以提高安全性。
  • 关于php - 将 html/css/js 添加到 mysql 的最安全方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6395372/

    相关文章:

    javascript - 没有收到通过 AJAX POST 发送到 PHP 的值

    javascript - React.js 和 React Native

    mysql - Unicode 电子表格到 MySQL

    mysql - shell脚本中mysql存储过程的关联数组

    php - 处理 mysql 中的嵌套集?

    javascript - 带有隐藏字段的表单提交

    php - 连接到不允许远程连接的主机上的 mysql 数据库

    php - 将 php post 数据添加到 mySQL 字符串中的正确语法

    php - CakePHP 迁移脚本不更新表模型

    javascript - 带有 scope.$watch 的 Angular 指令强制验证其他字段