php - 输入文本和特殊字符以及MySQL

标签 php mysql input special-characters

我的表单中有一个简单的文本框,我想在 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/

相关文章:

mysql - 带有 Postgres 数据的 Rails 被乱序返回

javascript - 使用 jQuery 在提交时显示/隐藏表单

php - stream socket client persistent 保持打开多长时间以及如何确认没有重复连接

php - Laravel 静态创建方法

PHP:MY​​SQLI - 从同一行获取数据

php - sql 查询不会工作,因为 '

html - 在 Bootstrap 中创建和样式化输入作为句子的一部分?

c - getc(stdin) 后程序停止工作

PHP 从 Windows 机器上的套接字读取

php - 如果 preg_match 有多个单词