草庐IT

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

coder 2023-10-15 原文

我目前正在使用以下 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/

    有关php - 将 html/css/js 添加到 mysql 的最安全方法是什么?的更多相关文章

    1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    2. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

      当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

    3. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    4. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    5. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    7. ruby - capybara field.has_css?匹配器 - 2

      我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

    8. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

      为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

    9. ruby - 将 Bootstrap Less 添加到 Sinatra - 2

      我有一个ModularSinatra应用程序,我正在尝试将Bootstrap添加到应用程序中。get'/bootstrap/application.css'doless:"bootstrap/bootstrap"end我在views/bootstrap中有所有less文件,包括bootstrap.less。我收到这个错误:Less::ParseErrorat/bootstrap/application.css'reset.less'wasn'tfound.Bootstrap.less的第一行是://CSSReset@import"reset.less";我尝试了所有不同的路径格式,但它

    10. ruby - 续集在添加关联时访问many_to_many连接表 - 2

      我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

    随机推荐