【问题标题】:Storing values with apostrophes in the database在数据库中存储带有撇号的值
【发布时间】:2012-12-21 08:58:07
【问题描述】:

将可能包含撇号的用户输入插入数据库的行业标准是什么?这样的输入将在网页上显示给用户。例如,用户将某个字段更新为“我很酷”。我用这个函数将它插入到我的数据库中:

public function updateDatabase($value) {
   $value = mysql_real_escape_string($value);
   Database::instance()->query(
      'UPDATE myTable
       SET myColumn = ' . $value . '
       WHERE foo = "bar"'
   );
}

数据库现在将存储“我很酷”。为了正确、安全地将这个值显示给任何用户,我必须使用这个函数来清理它:

public function toSafeDisplay($userGeneratedValue) {
   return stripslashes(
      htmlentities(
         $userGeneratedValue
      )   
   );
}

我担心的是,对我想在网页上显示的所有内容执行 stripslasheshtmlentities 会占用大量处理器资源。 StackOverflow 上的普遍共识是在插入数据库之前不要做htmlentities,这样数据尽可能原始。这将允许它稍后显示在任何媒体中,而不仅仅是网站。所以我们不得不在显示时做htmlentitiesstripslashes 也是这样吗?或者是否可以在不引入 SQL 注入攻击的情况下在更新数据库之前删除撇号前的所有斜杠?

【问题讨论】:

  • 说到行业标准,请在SQL中使用绑定变量。
  • 我不知道“绑定变量”是什么意思。谷歌结果将绑定称为将变量绑定到某个范围,而不是文体问题。能举个例子吗?
  • 指的是这样的东西:docs.php.net/pdo.prepared-statements

标签: php mysql security


【解决方案1】:

根本不是这样的。如果您在将其读回 php 时将撇号转义到插入/更新中,则它不会被转义。如果您希望从数据库中导出 HTML 安全数据,请在放入之前确保其安全。

【讨论】:

  • 斜线不会出现,但撇号会出现。所以 HTML 转义还是有必要的。
  • 当我使用mysql_real_escape_string 时,数据库在每个撇号前显示斜线。如果没有mysql_real_escape_string,值会逐字存储,但这样做非常危险。走安全路线,我必须先去掉斜线,然后再将其显示给用户。
  • 存储在 Windows PHP 和 MySQL 中的相同代码我很好,但是当我将代码传输到 Linux 服务器 (CentOS) 时,它开始保存反斜杠:我很好任何除了带斜杠的想法;
  • ###UPDATE:如果启用了magic_quotes_gpc,首先将stripslashes() 应用于数据。对已经转义的数据使用此函数将两次转义数据。所以我发现magic_quotes_gpc 设置为开!关掉它
【解决方案2】:

注意正确使用mysql_real_escape_string的开发者:

如果启用了magic_quotes_gpc,首先将stripslashes() 应用于数据。对已经转义的数据使用此函数将两次转义数据。

如果您发现在 php.ini 中将 magic_quotes_gpc 设置为 On,请将其关闭!

另请查看:http://gr.php.net/manual/en/function.mysql-real-escape-string.php

【讨论】:

    【解决方案3】:

    数据库不应将其存储为I\'m cool,而应存储为I'm cool。转义是允许将撇号作为myColumn 中更新的数据的一部分包含在内。我见过网站向用户显示I\'m cool 的情况,但这可能是双重转义的情况。

    编辑:

    mysql_real_escape_string 不在数据库中存储斜杠。它转义 SQL 语句中的值。在数据库中获得额外斜线的唯一方法是执行与 mysql_real_escape_string(mysql_real_escape_string($value)) 等效的操作。

    【讨论】:

    • 您如何建议我删除mysql_real_escape_string 在所有撇号前面插入的所有斜线而不引入注入攻击?
    • 添加了对答案的说明。我并不是说你不这样做 - 我是说数据库不会将反斜杠作为数据的一部分存储,因此在显示数据时不必担心删除反斜杠。如果是,那么您可能遇到了双重转义问题。
    • 我的mysql_real_escape_string 有问题。当我这样做$input = "O'Brien"; $output = mysql_real_escape_string($input); echo $input . ' : ' . $output; 时,我得到这个:O'Brien : O\'Brien。知道是什么原因造成的吗?
    • 它工作正常。请记住,这纯粹用于执行 SQL 语句,不会影响数据的存储方式。在插入时,不使用它会产生INSERT INTO TABLE VALUES ('I'm cool'),有人可能会过来输入');DROP TABLE SOME_USER_TABLE;--,然后做一些意想不到的事情。您希望它做正确的事情并以INSERT INTO TABLE VALUES ('I\'m cool') 执行语句并将I'm cool 存储在数据库中。
    • 您应该能够通过运行代码并在表上运行查询以检查实际存储的值来轻松检查这一点。
    猜你喜欢
    • 1970-01-01
    • 2011-09-28
    • 2016-04-13
    • 2010-11-14
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多