1

我有一个带有表单的 PHP 页面。表单有method="POST",动作是另一个将值插入 MySQL 的 PHP 文件。这一切都正常工作。

我的问题是,将信息发送到数据库的第二个 PHP 页面包含信息应该去的用户名、密码、数据库名和表名。我担心有人可以创建自己的 PHP 或 HTML 表单并 POST 到我的第二个 PHP 文件并将任何值提交到我的数据库。

我想将用户名、密码、数据库名和表名放在第一个 PHP 页面(带有表单)上,并将它们作为变量传递给第二个 PHP 表单,从而消除其他人创建自己的表单并发布他们想要的任何内容的威胁。(如果这是可能的并且是正确的方法,你能建议如何传递变量吗?)

这是保护数据库输入的正确方法吗?

4

4 回答 4

1

将您的服务器视为一个黑匣子。它接受请求并响应它们。对于意味着任何时候访问 URL、单击链接或提交表单的网站,这就是请求。服务器对这些请求执行某些操作,并以新网站、重定向、要下载的文件或其他任何内容进行响应。

HTML 表单实际上只是一个从用户那里获取数据并将其打包成请求的接口。重要的不是生成该 HTML 的 HTML 或 PHP,而是发送到服务器的结果请求,其中包含用户输入表单的数据。您甚至可以在没有 HTML 表单的情况下轻松生成此类请求。

使用 Chrome/Safari 中的 Web Inspector、Firefox 中的 Firebug 或 IE 开发人员工具,并查看那里的网络检查工具以查看所有请求-响应并查看其详细信息。

如果您需要对请求进行任何类型的验证,服务器必须这样做。您不能依赖 HTML 表单进行验证。任何人都可以随时随地将任何数据发送到您的服务器。

于 2012-04-06T01:33:35.787 回答
0

我担心有人可以创建自己的 PHP 或 HTML 表单并 POST 到我的第二个 PHP 文件并将任何值提交到我的数据库。

他们可以,而且他们甚至不需要费力地创建一个 HTML 页面来做到这一点。

这是保护数据库输入的正确方法吗?

这样做的正确方法是永远不允许输入指定表或列名(或任何 SQL 标识符)。输入应仅指定列值或 WHERE 子句中比较中使用的值。

枚举您需要的查询,并想出一种方法让表单指定您想要的特定查询,并确保您正确地对该特定查询进行身份验证。

如果您正在尝试进行临时报告,请为此明确设计。 开源和免费的即席/最终用户报告工具解决了 PHP 的问题。

“临时”报告系统允许用户自己创建特定的、定制的查询。

临时报告很难安全地执行,因为许多 SQL 安全最佳实践(如准备好的语句)不允许使用表名参数化查询,并且临时报告经常存在泄漏PII的极端情况,而这些 PII本来是不可用的。

我想将用户名、密码……放在第一个 PHP 页面(带有表单)上,并将这些作为变量传递给第二个 PHP 表单

从您的问题中不清楚您正在这样做,但为了清楚起见,您永远不应该导出数据库用户名和密码或允许表单输入影响您的数据库连接配置。这使得攻击者更容易

  1. 将在防火墙内运行低功耗 shell 的能力隐藏为对数据库的部分接管,
  2. 暴力破解你的数据库的管理密码,只给网络访问和时间,然后将任何 SQL 注入漏洞转化为完全接管你的数据库。
于 2012-04-06T00:28:41.240 回答
0

不要将databasename 和tablename 放在表单中。在那里放一些有意义的值,然后在服务器端代码上,选择适当的表名和数据库。

例如,添加一个可以采用值“bluepill”或“redpill”的选择字段。收到 POST 数据后,为 bluepill 选择表“good_users”,为 redpill 选择表“evil_users”。

如果表单是注册表单,可以考虑其他验证用户的方法,比如邮箱链接、验证码等。

于 2012-04-06T00:31:47.953 回答
0

I would agree with deceze response. You can always use captcha or additionally you can do $_SERVER['HTTP_REFERER'] check (see here for HTTP_REFERER) for the request to your php2.php and bypass all requests which are not from your server.

于 2012-04-06T08:11:18.133 回答