PHP/MySQL - 使用PDO显示名称/用户名/密码的安全字符

Jac*_*son 6 php mysql sql pdo character-encoding

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

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

我一直在学习转义,准备好的语句等,以及如何防止像"bobby"这样的SQL注入;删除表用户 - ".

我正在使用PDO预处理语句从表单中获取用户输入,以便将它们注册到DB中.但是,我需要知道一些事情:

  1. 由于我使用预处理语句,显示名称,用户名,密码等,我可以允许使用@,#,$甚至"单个"或"双"引号等特殊字符吗?那些空间,国际角色,带有重音符号的角色,或者像♥这样的东西呢?当我问是否允许这些字符"没问题"时,我想知道在人们的用户名中使用引号或括号可能会产生进一步的安全风险,或者像粗体或斜体的html标签之类的东西?

  2. 如果可以允许大多数特殊字符,而不是某些字符:是否有任何特定的"危险"字符(在MySQL的范围内),我绝对需要制作非法字符?(我觉得引用可能适合这个议程,但我对此有不同的信号.)

  3. 如果我允许字符超出典型的"字母数字和下划线"范围,那么我以后可能遇到的任何陷阱(在MySQL,SQL或PHP中)允许使用奇怪的字符吗?在显示人们的用户名时,我是否需要以某种方式使html标签显示为字符串而不是实际标签?或者,当我想用​​它们查询时,我是否需要在人们的用户名中转义引号?或者这不重要,因为我将使用PDO准备好的语句?

  4. 像utf8或utf16这样的字符集可以进入任何地方,因此我可以接受最广泛的显示名称和用户名,同时仍然确保这些字母可以在我的网站上呈现吗?

  5. 我知道有些西里尔字母与英文字母相同.我曾经直接从MS Word中复制这些内容并在我的用户名中使用它们.我意识到这些可以用于感知 - 模仿其他成员,只需通过交换一个西里尔语"a"的英语"a".如果有人不熟悉alt代码,那么♥中的用户名可能很难搜索.这应该是一个问题吗?你对这个有什么看法?

在此先感谢能给我一些见解的人.

Sco*_* C. 2

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

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

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