如何保护PHP表单安全?

5

我没有运营一个关键任务的网站,因此我不需要一个工业级的解决方案。然而,我希望能够防范基本攻击,例如有人伪造页面并试图未经授权访问。是否有任何标准技术可确保表单提交只接受合法用户?


到目前为止,您得到的答案虽然不错,但范围相当广泛。如果您能使您的问题更加具体,可能会获得更详细的答案。特别是,您使用什么类型的授权,可以通过“伪造虚假页面”来规避? - Todd Owen
一旦有人访问了您的磁盘,游戏就结束了。此时他们可以进行远程代码执行。标准技术?对什么?请阅读OWASP。 - rook
@rook - 我想deltanovember指的是攻击者自己的硬盘。 - PiggyMacPigPig
5个回答

7

有几种技术可以接近实现:

  • 为每个表单生成一个表单密钥。该密钥将与数据库记录以及页面视图中的其他唯一内容(用户ID、cookie等)相关联。如果表单密钥与该用户/cookie不匹配,则无法提交表单。密钥仅使用一次,防止自动化工具使用被盗密钥再次发布(对于该用户)。
  • 表单密钥也可以是共享密钥散列:例如,生成表单的PHP可以散列cookie和userID,您可以在提交表单时验证这些散列值。
  • 您可以添加验证码,要求用户进行验证。
  • 您还可以限制来自该用户/cookie的发布数量(节流),这可以防止某些形式的自动化滥用。

您无法保证表单不会从磁盘上发布,但可以限制其自动化程度。


5
您做不到。没有可靠的方法来区分是用户在您的页面上生成的HTTP请求,还是恶意用户使用自己的网页生成的请求。
只需使用适当的密码身份验证方法,除非他们知道密码,否则没有人能够破坏任何东西(无论HTTP请求来自何处)。一旦您拥有可靠的服务器端身份验证,您就不需要浪费时间跳过不稳定的环节来担心这种情况。

@Ben:对于恶意攻击者来说,这很容易被规避。 - Oliver Charlesworth
使用密码身份验证不能防止低级凭据的人操纵页面标记(每个浏览器都内置了开发人员工具)并将请求发送回您的服务器以利用漏洞。您无法信任来自浏览器的任何请求。您必须要求SSL,并在服务器端验证所有输入,以确保该人被授权执行正在尝试的任务,并且他们没有试图损坏您的系统。我强烈建议观看OWASP前十名视频 https://www.owasp.org/index.php/Category:OWASP_Video - RonnBlack

4
您不应自己创建登录系统,因为很难做到正确(安全)。您不应在网站上存储用户密码(以任何形式),这是危险的。例如lifehacker.com就被攻破了(我的帐户也是 :()。您应该像lightopenid一样使用身份验证(stackoverflow也使用openid)。
您网站上剩余的表格应至少具备以下保护措施:
CSRF保护:此链接详细解释了什么是CSRF,更重要的是如何防范CSRF。
使用http-only cookieshttp-only sessionshttp-only cookies
使用PDO预处理语句来保护自己免受SQL注入攻击。
防止使用过滤器进行XSS防护

1

正确验证表单数据对于保护您的表单免受黑客和垃圾邮件发送者的攻击非常重要!

  • 从用户输入数据中剥离不必要的字符(使用 PHP 的 trim() 函数)
  • 从用户输入数据中删除反斜杠 () (使用 PHP 的 stripslashes() 函数)

有关更多详细信息,您可以参考 表单验证


1

我也建议:

  1. 保存发送表单的计算机的IP地址(如果它很烦人,可以将其从服务器屏蔽)
  2. 在需要时使用CAPTCHA,以避免机器人...
  3. 当信息加载完成时,将用户发送到另一个页面,这样当您刷新页面时就不会检索POST数据。

请注意,一个IP地址可能会被多个客户端使用,原因可能是IP地址重用或路由器屏蔽等。 - Bruce Alderson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接