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

时间:2012-06-20 05:37:17

标签: php mysql sql character-encoding pdo

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

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

我一直在学习转义,准备好的语句等,以及如何防止像“bobby”这样的SQL注入; drop table users - “。

我正在使用PDO预处理语句从表单中获取用户输入,以便将它们注册到数据库中。但是,我需要了解一些事情:

  1. 由于我使用预准备语句,因为显示名称,用户名, 密码等,我可以允许特殊字符,如 @,#,$,甚至是'单个'或“双”引号?那个空间呢, 国际字符,带重音的字符或类似♥的东西 ?当我问是否允许这些角色“好”时,我就是 想知道是否还有任何可能出现的安全风险 允许人们的用户名或事物中的引号或括号 喜欢粗体或斜体的html标签吗?

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

  3. 如果我允许字符超出典型的“字母数字” 并强调“范围,我可能会遇到任何陷阱 (在MySQL,SQL或PHP中)允许奇怪的字符?我会吗? 需要以某种方式使html标签显示为字符串,而不是实际 标签,显示人的用户名?或者我需要逃脱 在我想用它们查询的时候引用人们的用户名? 或者没有这个问题,因为我将使用准备好的陈述 与PDO?

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

  5. 我知道有一些西里尔字母看起来相同 英文的。我曾经直接从MS Word中复制这些并使用 他们在我的用户名中。我意识到这些可以用来 感知 - 模仿其他成员,只需交换一个 西里尔语“a”的英语“a”。其中带有♥的用户名可能很难 搜索某人是否不熟悉alt代码。应该这样 关注?你对此有何看法?

  6. 提前感谢能给我一些见解的人。

2 个答案:

答案 0 :(得分:4)

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

这是了解有关“可接受”内容的一些问题的绝佳资源,您必须考虑“一段数据”的整个生命周期。

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

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

然后显然数据会在某些时候读取,如果它是一种降价语言,它可能会被编译,并最终被发送到某人的浏览器,在那里它可能< strong>注入html 和显示

正如您所看到的,在数据​​生命周期中存在很多地方,事情可能会出错。如果你没有考虑所有这些,你可能会看到一些常见的错误,如每次保存/加载数据时反复使用的反斜杠...... sql错误,容易受到攻击等等。

您想要支持哪种数据?随你(由你决定。只要确保你正确处理它。

答案 1 :(得分:2)

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

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

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