【问题标题】:Correct PHP method to store special chars in MySQL DB正确的 PHP 方法在 MySQL DB 中存储特殊字符
【发布时间】:2012-04-24 04:41:58
【问题描述】:

使用 PHP,在 MSQUL 数据库中存储特殊字符(如下所示)以避免注入的最佳方法是什么。

« " ' é à ù

这就是我现在的做法:

$book_text=$_POST['book_text'];
$book_text=htmlentities($book_text, "ENT_QUOTES");
$query=//DB query to insert the text

然后:

$query=//DB query to select the text
$fetch=//The fetch of $book_text
$book_text=html_entity_decode($book_text);

这样,我所有的文本都被格式化为 HTML 实体。但是我认为这会占用大量的数据库空间。那么,有没有更好的办法呢?

【问题讨论】:

  • "ENT_QUOTES" 必须是 ENT_QUOTES(不带引号),因为它是 PHP 预定义的常量。而且我认为您可以将其原始放在数据库中,当您想回显它时,您可以使用htmlentities

标签: php mysql sql-injection html-entities html-encode


【解决方案1】:

使用utf8 编码来存储这些值。

为避免注入,请使用mysql_real_escape_string()(或准备好的语句)。

为了防止XSS,请使用htmlspecialchars

【讨论】:

  • utf8 作为表列的编码
  • 你不能 mysql_real_escape_string() 不能与准备好的语句相提并论。此功能不能避免注射,不能单独帮助防止注射。
【解决方案2】:

听起来您的问题可以概括为使用 PHP 和 MySQL 处理和存储 UTF8。

为了避免 SQL 注入,您应该使用准备好的语句。 mysqliPDO 驱动程序都支持它们。

驱动程序会自动引用准备好的语句,因此您无需担心。

您的数据库表应使用字符集utf8utf8_general_ci 排序规则创建。这些 my.cnf 设置将确保您的 MySQL 服务器始终运行 UTF8:

[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'

[client]
default-character-set=utf8

请注意,PHP 通常不知道 UTF-8,因此您应该注意使用 iconvmbstring 库来处理字符串。请参阅PHPWACT 以获得良好的概述。

确保 PHP 的内部字符集设置为 unicode

iconv_set_encoding('internal_encoding', 'UTF-8');
mb_internal_encoding('UTF-8');

您还应该通过发送正确的标头或为字符集添加<meta> 标记来确保浏览器知道编码。

应该可以的。

【讨论】:

    【解决方案3】:

    【讨论】:

      【解决方案4】:

      您的问题是一个很好的混淆集合。你设法混淆了一切。
      让我们试着整理一下。

      使用 PHP,在 MSQUL 数据库中存储特殊字符(如下所示)以避免注入的最佳方法是什么。

      这些都是无与伦比的事情。存储特殊字符是一回事,避免注入是另一回事。完全不同的一个。

      $book_text=htmlentities($book_text, "ENT_QUOTES");
      

      这是最有趣的部分。尽管它旨在保护您的查询,但它实际上什么也没做。因为您使用数值为 0 的字符串 ENT_QUOTES 而不是常量 ENT_QUOTES,而不是值为 3,所以,您没有设置任何标志。

      但即使你正确设置了这个标志,它也不会自动保护你。因为注入代码可能不包含特殊字符。

      为避免注入,您必须遵循整套规则,而不是一个简单的函数“make_my_data_safe()”。没有魔杖。
      详情请见this my answer

      至于特殊字符,很简单。唯一的问题是没有设置固体特殊字符。对于不同的环境,有 不同的 特殊字符。

      • ' 对数据库和 HTML 有意义
      • 仅对 HTML 有意义
      • é àù 仅对 HTML 有意义,取决于编码。

      您为每种情况使用不同的格式规则。不同的,不是一个适合所有人的。

      要在 HTML 中使用 é àù 字符,您必须设置正确的 HTTP 标头。 要将 é à ù 与数据库一起使用,您必须将表编码设置为 utf8 并将连接编码设置为 utf 8。

      【讨论】:

      • $book_text=htmlentities($book_text, "ENT_QUOTES");在这里发布它是一个错误。在我的 php 文件中,它是 $book_text=htmlentities($book_text, ENT_QUOTES);
      猜你喜欢
      • 2023-03-26
      • 1970-01-01
      • 2015-06-14
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多