-2

我想知道是否有办法确保通过 POST 发送的表单来自我的网站。我看过一些教程,他们建议我使用“隐藏”输入值来验证,但这可能毫无意义,因为任何人都可以查看我网站的 html 源代码,收集文本框的名称属性等信息。

如果我不清楚,请告诉我。

直到最近我才开始学习使用 PHP 和 ASP.NET 制作网站。所以,请稍微清楚一点,因为我只是一个初学者。提前致谢。

4

4 回答 4

4

您可以检查引荐来源网址,如果它与您的域匹配,那么它是安全的。

$ref = $_SERVER["HTTP_REFERER"];

拆分后将值 $ref 与您的域名进行比较以仅获取域名。

于 2013-07-19T06:03:15.377 回答
3

您可以使用称为跨站点请求伪造的技术:http ://en.wikipedia.org/wiki/Cross-site_request_forgery

本质上,做法大致是:

  • 创建一个大的随机字符串并将其存储在您的服务器端会话中
  • 在表单中包含一个隐藏字段,它代表上面生成的随机数
  • 当您处理表单时,请检查表单和会话表示。
  • 销毁会话表示

此过程的主要限制是您的表单是有时间限制的,对会话破坏很敏感,并且仅适用于用户交互。

一旦掌握了 PHP 的基础知识,为什么不考虑使用框架呢?我经常使用 Symfony2,他们有一个很好的表单包,从一开始就处理这种安全性:http: //symfony.com/doc/current/book/forms.html#csrf-protection

于 2013-07-19T06:39:05.877 回答
2

您还可以$_SESSION在表单页面上设置一个变量并在处理页面上检查它。

于 2013-07-19T06:11:53.933 回答
0

好吧,您知道您希望从表单中获得哪些字段和数据,所以最好的办法是验证 POST 数据。如果您知道您需要 x 个字段,请验证该字段并验证该数据。例如,如果您有一个包含日期输入的字段,请使用 PHP 来确保它是有效日期。如果它是一个整数,在将它用于任何事情之前验证它是一个整数。对于文本字段,去掉所有 html 和 JavaScript 等。你明白了。

这样做比尝试验证表单是从您的网站发布的要好得多。

于 2013-07-19T06:03:32.633 回答