使用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实体格式化。但我认为这占用了大量的数据库空间。那么,有更好的方法吗?
答案 0 :(得分:6)
使用utf8
编码存储这些值。
要避免注入,请使用mysql_real_escape_string()
(或准备好的陈述)。
要防止 XSS 使用htmlspecialchars
。
答案 1 :(得分:1)
听起来您的问题可以推广到使用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>
标记来确保浏览器知道编码。
应该这样做。
答案 2 :(得分:0)
是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
答案 3 :(得分:0)
你的问题是很好的混淆。你设法混淆了一切 让我们尝试解决它。
使用PHP,在MSQUL数据库中存储特殊字符(如下所示)的最佳方法是什么,以避免注入。
这些是无与伦比的事情。存储特殊字符是一回事,避免注射是另一回事。完全不同的。
$book_text=htmlentities($book_text, "ENT_QUOTES");
这是最有趣的部分。虽然它旨在保护您的查询,但它实际上什么都不做。因为您使用字符串ENT_QUOTES而不是常量ENT_QUOTES,其值为3,因此,您设置无标记。
但即使您正确设置此标记,它也不会自动保护您。因为注入代码可能不包含特殊字符。
为避免注射,您必须遵循完整的规则集,而不是一个简单的函数“make_my_data_safe()”。没有魔杖 有关详细信息,请参阅this my answer。
至于专柜,很简单。唯一的问题是没有固定的特殊字符集。对于不同的环境,有不同的特殊字符。
您是否为每种情况使用不同的格式规则。不同,不是一个人。
要使用带有HTML的éàùchars,您必须设置正确的HTTP标头。 要使用éàù与数据库,您必须将表格编码设置为utf8,连接编码设置为utf 8。