【问题标题】:PHP, MySQL, quotes and inputs fieldsPHP、MySQL、引号和输入字段
【发布时间】:2014-11-09 06:17:41
【问题描述】:

我正在尝试构建一个编辑页面来编辑标题。

此标题将显示在“h3”标签和输入字段中。 当用户对标题感到满意时,他会将其提交给保存它的 mysql。 页面刷新,他可以在“h3”标签和输入字段中看到他的新标题。

问题是,当标题中包含引号时,我在“h3”标签和输入字段中得到的结果不同。

这是我检索变量以将其发送到数据库的方法:

$title_set = $_POST['title'];

这是我在标签和输入字段中显示变量的方式:

$title_get = $result['denomination'];

这里是标题的显示:L'appel de la "forêt"

$title_set = $_POST['title'];
$title_get = $result['denomination'];

<h3>  -> No output
Input -> No output

变体 1:

$title_set = addslashes($_POST['title']);
$title_get = $result['denomination'];

<h3>  -> L'appel de la "forêt"
Input -> L'appel de la

变体 2:

$title_set = addslashes($_POST['title']);
$title_get = stripslashes($result['denomination']);

<h3>  -> L'appel de la "forêt"
Input -> L'appel de la

变体 3:

$title_set = mysql_real_escape_string ($_POST['title']);
$title_get = $result['denomination'];

<h3>  -> L'appel de la "forêt"
Input -> L'appel de la

显然,标题标签和输入字段在显示带引号的动态数据的方式上存在差异,输入字段的限制更大。

那么,我该怎么办?

我的页面、脚本和数据库以 UTF_8 编码

【问题讨论】:

  • 在打开&lt;?php 标记error_reporting(E_ALL); ini_set('display_errors', 1); 之后立即将错误报告添加到文件顶部。您很可能正在注入 SQL 不同意的字符。
  • 看看这个stackoverflow.com/questions/25831176/…(如果是input问题)。
  • 我不相信,因为“h3”标签可以很好地显示它,而输入字段会部分显示它。所以看起来和SQL错误无关吧?
  • 小费,$_POST, $_GET, $_COOKIE, $_SESSION, ... , 使用 isset

标签: php mysql input quotes


【解决方案1】:

在向数据库插入数据之前,使用 mysql_real_escape_string() 之类的转义函数。或者更好的是,切换到 PDO,这样您就可以使用准备好的查询并将数据作为参数提交。这可以防止 SQL 注入。见How can I prevent SQL-injection in PHP?

在将您从数据库中获取的动态内容回显到 HTML 之前,使用 htmlspecialchars() 对其进行编码。这可以防止跨站点脚本 (XSS)。见How to prevent XSS with HTML/PHP?

进一步阅读:https://www.owasp.org/index.php/OWASP_Top_Ten_Cheat_Sheet 了解更多关于注入和 XSS 风险和补救措施的信息。

【讨论】:

  • 这是一个测试用例。如果您将我的问题读到最后,您会看到“mysql_real_escape_string()”是其中的一部分。当然,最终数据会得到保护。
  • 第二部分很相关,谢谢。通过在显示之前添加 htmlspecialchars() ,一切都很好。谢谢!
【解决方案2】:

在将值插入 MySQL 查询时,您需要使用 mysql_real_escape_string()。否则,输入中的引号将导致 SQL 语法错误。如果你转换成 MySQLI 或 PDO,并使用查询参数而不是字符串连接会更好。

在检索数据并将其显示在网页上时,您应该使用htmlentities()。这将为所有特殊字符生成正确的 HTML 编码。

【讨论】:

  • 我确实尝试了 htmlentities 和 mysql_real_escape_string(),这就是我得到的结果:L'appel de la "forêt" 在这两种情况下
  • 什么版本的 PHP?在 5.4 之前,默认编码是 ISO-8859-1,从那以后它是 UTF-8。
  • 5.3 解释它。
猜你喜欢
  • 2013-08-24
  • 2018-07-16
  • 2012-04-16
  • 2011-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多