6

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

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

我一直在学习转义、预处理语句等,以及如何防止 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 代码,则可能很难搜索其中带有 ♥ 的用户名。这应该是一个问题吗?你对此的看法如何?

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

4

2 回答 2

4

这个SQL 注入备忘单有几个 MySQL 查询示例,您可以在开发过程中进行测试。

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

通常,一段数据可能以HTML 表单开始,然后被POST到您的 PHP 脚本(因此,如果用户想要他们可以直接 POST 数据而无需表单)。然后您的 php 脚本(希望)对数据进行清理,然后将其存储

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

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

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

你想支持什么样的数据?随你(由你决定。只要确保你正确处理它。

于 2012-06-20T06:50:17.950 回答
2

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

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

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

于 2012-06-20T06:29:41.007 回答