【问题标题】:PHP / MySQL - Safe characters for display names / usernames / passwords, with PDOPHP / MySQL - 显示名称/用户名/密码的安全字符,带有 PDO
【发布时间】:2012-06-22 05:26:18
【问题描述】:

这里有点 PHP / MySQL 新手...

我一直在构建一个基于 PHP 的站点,该站点使用 MySQL 数据库来存储用户信息,例如他们的显示名称、用户名和密码。

我一直在学习转义、prepared statements 等,以及如何防止 SQL 注入,如“bobby'); drop table users--”。

我正在使用 PDO 准备好的语句从表单中获取用户输入,以便将它们注册到数据库中。但是,我需要知道一些事情:

  1. 由于我使用准备好的语句,用于显示名称、用户名、 密码等,我可以允许特殊字符,例如 @、#、$,甚至是“单”或“双”引号?那么空间呢, 国际字符、带口音的字符或♥ ?当我问允许这些字符是否“可以”时,我 想知道是否可能出现任何进一步的安全风险 从允许在人们的用户名或事物中使用引号或括号 喜欢粗体或斜体的html标签?

  2. 如果允许大多数特殊字符是可以的,但不允许一些: 有任何特定的“危险”字符(在 MySQL 范围内) 我绝对需要将其设为非法? (我觉得引号可能适合 这个议程,但我收到了不同的信号。)

  3. 如果我允许典型的“字母数字”之外的字符 和下划线”范围,我以后可能会遇到任何陷阱吗 (在 MySQL、SQL 或 PHP 中)允许奇怪的字符?我会 需要以某种方式使 html 标签显示为字符串,而不是实际的 标签,当显示人们的用户名时?或者我需要逃跑吗 每当我想向他们查询时,引用人们的用户名? 或者这都不重要,因为我将使用准备好的语句 使用 PDO?

  4. 像 utf8 或 utf16 这样的字符集是否会出现在任何地方,所以我 可以接受最广泛的显示名称和用户名,同时 还在确保这些字母可以在我的网站上呈现?

  5. 我知道有些西里尔字母看起来与 英语的。我曾经直接从 MS Word 中复制这些内容并使用 他们在我的用户名中。我意识到这些可以用来 感知地模仿其他成员,只需更换一个 西里尔字母“a”的英文“a”。带有♥的用户名可能很难 搜索是否有人不精通 alt 代码。如果这 担心吗?您对此有何看法?

在此先感谢任何能给我一些见解的人。

【问题讨论】:

  • 请将您的帖子一次限制为一个问题

标签: php mysql sql character-encoding pdo


【解决方案1】:

SQL Injection Cheat Sheet 有几个 MySQL 查询示例,您可以在开发过程中进行测试。

这是一个很好的资源,可以帮助您了解关于什么是“可接受”的一些问题,并且您必须考虑“一段数据”的整个生命周期。

通常,一条数据可能以 HTML 表单 开始,然后 POSTed 到您的 PHP 脚本(因此,如果用户希望他们可以直接 POST 数据而无需表格)。 然后你的 php 脚本(希望)清理数据,然后存储

在数据库中,您可能正在执行备份操作,将其保存到 SQLDump,或进行其他类型的维护。

那么很明显,数据会在某个时候被读取,如果它是一种降价语言,它可能会被编译,最终它会被发送到某人的浏览器,在那里它可能是 注入到html中并显示

如您所见,在数据的生命周期中有很多地方可能会出错。如果你没有考虑所有这些,你可能会看到一些常见的错误,比如每次保存/加载数据时都会堆积起来的反斜杠。sql 错误,容易受到攻击等。

您希望支持哪种数据?这取决于你。只要确保你能正确处理它。

【讨论】:

  • 感谢您的链接;尽管该页面看起来很吓人,但它看起来对我的项目来说也是一个有用的安全资源。我也很欣赏有关数据生命周期的概述;让我对“大局”有了一个不那么模糊的概念,因为我(相当松散地)目前理解它:P
【解决方案2】:

首先让我说我真的很喜欢你的风格。似乎大多数人没有花时间思考这些事情,只是将查询放在一起,根本没有数据清理。所以恭喜你很勤奋。 :)

也就是说,使用 PDO,您不必担心引号会弄乱您的查询。特别是如果您将变量与bindParam 绑定,这允许严格的参数控制。有了它,您可以转换变量类型和长度。此外,特殊字符不会弄乱您的查询,因为 PDO 也会对它们进行转义。所以不用担心。

关于让HTML显示为文本而不是实际的HTML,一个非常有用的函数是htmlspecialchars(),它将html代码转换为字符代码。此函数也可以与可选的 ENT_QUOTES 标志一起使用,它将这个" 变成这个"。 htmlspecialchars() 还可以选择将输出设置为您选择的编码。

【讨论】:

猜你喜欢
  • 2011-05-28
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 2011-05-20
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多