在MySQL数据库中存储特殊字符的正确PHP方法

7

使用 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 - Wouter J
4个回答

7

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

为了避免注入,请使用 mysql_real_escape_string()(或预处理语句)。

为了防止 XSS 攻击,请使用 htmlspecialchars


utf8作为表列的编码 - Botanick
1
你不能将mysql_real_escape_string()与预处理语句进行比较。该函数单独使用无法避免注入问题,也无法对其产生帮助。 - Your Common Sense

1

看起来你的问题可以概括为如何使用PHP和MySQL处理和存储UTF8编码。

为了防止SQL注入,你应该使用预处理语句。mysqliPDO 驱动都支持预处理语句。

预处理语句会被驱动自动引用,所以你不需要担心这个问题。

你的数据库表应该使用字符集 utf8 和排序规则 utf8_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> 标签来知道编码。

就这样就可以了。


0

0

你的问题是一堆混乱的集合。你成功地把一切都搞混了。
让我们试着梳理一下。

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

这些是不可比较的问题。存储特殊字符是一回事,避免注入是另一回事,完全不同的问题。

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

这是最有趣的部分。虽然它旨在保护您的查询,但实际上并没有做任何事情。因为您使用的是字符串ENT_QUOTES,其数字值为0,而不是常量ENT_QUOTES,其值为3,所以您设置了无标志。
但即使您正确设置了该标志,它也不会自动保护您。因为注入代码可能不包含任何特殊字符。
为了避免注入,您必须遵循整个“一系列规则”,而不仅仅是一个简单的函数“make_my_data_safe()”。这没有魔法棒。 请参阅{{link1:这是我的回答}}了解详细信息。
至于特殊字符,很简单。唯一的问题是没有固定的特殊字符集。对于不同的环境,存在着不同的特殊字符。
  • '对于数据库和HTML有意义
  • <>只对HTML有意义
  • é à ù只对HTML有意义,取决于编码方式。
对于每种情况,您必须使用不同的格式规则。不是一个适用于所有情况的规则。

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


$book_text=htmlentities($book_text, "ENT_QUOTES"); 在此处发布时出现了错误。在我的php文件中应该是 $book_text=htmlentities($book_text, ENT_QUOTES); - Antonio Ciccia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接