使用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 实体。但我认为这占用了大量的数据库空间。那么,有没有更好的方法呢?
使用utf8
编码来存储这些值。
为避免注射,请使用mysql_real_escape_string()
(或准备好的陈述)。
要防止 XSS,请使用 htmlspecialchars
。
听起来你的问题可以推广到用PHP和MySQL处理和存储UTF8。
为了免受 SQL 注入的影响,您应该使用预准备语句。mysqli 和 PDO 驱动程序都支持它们。
准备好的语句会自动由驱动程序引用,因此您无需担心这一点。
应使用字符集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,因此您应该注意使用 iconv
或mbstring
库来处理字符串。请参阅 PHPWACT 以获得良好的概述。
确保 PHP 的内部字符集设置为 unicode
iconv_set_encoding('internal_encoding', 'UTF-8');
mb_internal_encoding('UTF-8');
您还应该通过发送正确的标头或为 charset 添加 <meta>
标记来确保浏览器知道编码。
这应该可以做到。
utf8 编码...
如果您非常担心注射,您也可以使用准备好的陈述......
http://www.linearchat.co.uk/2011/08/why-prepared-statements-in-mysql-are-a-good-thing/
也
http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-prepared-statements.html
你的问题是一堆混乱。你设法混淆了一切。
让我们尝试解决它。
使用 PHP,在 MSQUL 数据库中存储特殊字符(如下所示)以避免注入的最佳方法是什么。
这些都是无可比拟的问题。储存特殊字符是一回事,避免注射是另一回事。完全不同的一个。
$book_text=htmlentities($book_text, "ENT_QUOTES");
这是最有趣的部分。 虽然它旨在保护您的查询,但它实际上什么也没做。因为不是常量ENT_QUOTES哪个值是 3,而是使用字符串ENT_QUOTES哪个数值是 0,所以你没有设置任何标志。
但是,即使您正确设置了此标志,它也不会自动保护您。因为注入代码可能不包含特殊字符。
为了避免注入,您必须遵循整套规则,而不是一个简单的函数"make_my_data_safe()"。没有魔杖。
有关详细信息,请参阅我的答案。
至于特殊字符,很简单。 唯一的问题是没有实心的特殊字符集。不同的环境有不同的特殊字符。
- ' 对数据库和 HTML 有意义
- <>仅对 HTML 有意义
- é à ù 仅对 HTML 有意义,取决于编码。
您必须对每种情况使用不同的格式规则。不同,不是所有人的单一。
要将 é à ù chars 与 HTML 一起使用,您必须设置正确的 HTTP 标头。要将 é à ù 与数据库一起使用,您必须将表编码设置为 UTF8,将连接编码设置为 UTF 8。