我的表单中有一个简单的文本框,我想在 POST 或 GET 之后安全地将特殊字符存储在数据库中,我使用下面的代码。 $text=mysql_real_escape_string(htmlspecialchars_decode(stripslashes(trim($_GET["text"])),ENT_QUOTES));
当我从数据库读取文本并将其放入文本值时,我使用上面的代码。
$text=htmlspecialchars($text_from_DB,ENT_QUOTES,'UTF-8',false);
<input type="text" value="<?=$text?>" />
我试图在数据库中保存没有特殊字符的内容(这意味着我不想在数据库字段中写入“或')
实际上,在写入数据库时,会对文本执行htmlspecialchars_decode
。
写入表单文本框时,对文本执行htmlspecialchars
。
这是安全地将特殊字符写入数据库的最佳方法吗?
最佳答案
您将数据库中的文本保持为原始文本的想法是正确的。不确定所有 HTML 实体内容的用途;您不需要为数据库插入执行此操作。
[我能想到的唯一原因是,您可能会尝试对数据库的传入输入进行实体解码,因为您发现在表单提交中获得了诸如 Š
之类的字符引用输入。如果发生这种情况,那是因为用户输入的字符在表单页面使用的编码中不存在。这种形式的编码完全是假的,因为您无法区分用户键入 Š
和字面上键入 Š
!您应该通过对所有页面和内容使用 UTF-8 编码来避免这种情况,因为每个可能的字符都适合此编码。]
脚本中的字符串应始终是没有转义的原始文本。这意味着在将它们输出到非纯文本的上下文中之前,您不会对它们执行任何操作。因此,将它们放入 SQL 字符串中:
$category= trim($_POST['category']);
mysql_query("SELECT * FROM things WHERE category='".mysql_real_escape_string($category)."'");
(或使用参数化查询以避免手动转义它。)将内容放入 HTML 时:
<input type="text" name="category" value="<?php echo htmlspecialchars($category); ?>" />
(如果您想减少输入量,您可以定义一个名称较短的辅助函数,例如 function h($s) { echo htmlspecialchars($s, ENT_QUOTES); }
你必须在模板中完成。)
而且...差不多就是这样了。您不需要处理来自数据库的字符串,因为它们已经是原始字符串。除了您想要执行的任何特定于应用程序的字段验证之外,您不需要处理输入字符串 (*)。
*:好吧,除非 magic_quotes_gpc
已打开,在这种情况下,您需要 stripslashes()
来自 get/post/cookie 的所有内容,或者,我最喜欢的选择,立即失败:
if (get_magic_quotes_gpc())
die(
'Magic quotes are turned on. They are utterly bogus and no-one should use them. '.
'Turn them off, you idiot, or I refuse to run. So there!'
);
关于php - 输入文本和特殊字符以及MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2175406/