PHP, HTML, CSS, Javascript表单安全


PHP, HTML, CSS, Javascript Form Security

我有一个关于安全的问题。我有一个网站编程与HTML, CSS, PHP, Javascript(jQuery)…

在整个网站中,有几个表单(特别是单选按钮)。

一旦用户选择并填写表单,它将从选中的单选按钮获取值并将其发送到服务器进行处理。服务器还获取这些值并将它们插入数据库。

我关心的是:

我怎么能防止有人使用开发人员工具/源编辑器(如谷歌Chrome的调试/开发人员工具模块)和手动改变单选按钮的值,之前点击提交按钮?我担心人们可能会在提交表单之前手动更改单选按钮输入的值。如果他们真的可以这样做,那将完全违背我正在构建的脚本的目的。

我希望这有意义。

谢谢!

John

我怎么能防止有人使用开发人员工具/源编辑器(如谷歌Chrome的调试/开发人员工具模块)和手动改变单选按钮的值,之前点击提交按钮?

你不能。您无法控制发送到服务器的内容。

在将数据插入数据库之前,测试数据是否满足您为其设置的任何要求。如果不正确,拒绝它并在HTTP响应中解释问题。

任何从浏览器发送到服务器的数据都可以在您的控制之外进行操作,包括表单数据、url参数和cookie。你的PHP代码必须知道哪一组值是有效的,如果它看起来不合理,就拒绝请求。

在向数据库发送用户输入时,您将希望确保恶意用户输入的字符串不能修改SQL查询的含义。参见SQL注入。当您显示用户输入的数据时(无论是直接在下面的响应中,还是稍后从数据库中读取数据时),请确保对其进行了正确编码,以避免恶意用户输入的字符串在用户的浏览器中作为不需要的javascript执行。请参阅跨站点脚本和预防小抄

我同意Quentin的回答。客户端验证永远不应该单独存在,您还需要对输入进行某种服务器端验证。对于大多数用户来说,客户端验证将节省到服务器的往返,但是正如你们都提到的,不能保证"某人"不会发送错误的数据。

因此,咒语应该是:总是有服务器端验证

我想说的是,客户端验证应该仅仅用于用户的方便(例如,提醒他们,他们已经忘记填写一个必需的字段),在他们提交表单之前,必须等待它到服务器,被验证,然后将其发送回给他们进行修复。真痛苦。最好是让javascript当场告诉你你搞砸了什么。

服务器端验证是为了安全性。

别人已经说过了,你不能阻止用户篡改发送到你的服务器的数据(Firebug, TamperData插件,自制篡改代理…)。

因此,在服务器端,必须将您的输入视为根本没有客户端验证。

永远不要相信从外部源进入应用程序的用户输入。

OWASP甚至为客户端验证漏洞建立了一个存根页面——这很有趣——客户端验证似乎让很多人感到困惑,并导致了很多安全漏洞,以至于他们现在认为这是一个漏洞,而不是一个好东西。

我们不需要那么激进——客户端验证仍然是有用的,但把它简单地看作是一种帮助,以防止用户在被告知数据错误之前必须先进行服务器往返。没错,客户端验证只是为用户提供了方便,仅此而已,更不用说为服务器的安全提供资产了。

OWASP是一个很好的web安全资源。看看他们的数据验证部分。

一些值得引用的建议:

在哪里包含验证

必须在每个层上执行验证。但是,应该根据执行代码的服务器的功能来执行验证。例如,web/表示层应该验证与web相关的问题,持久化层应该验证持久化问题,如SQL/HQL注入,目录查找应该检查LDAP注入,等等。

在这种情况下,我建议您使用值作为键,并在服务器端查找这些值。

另外,考虑在每次有人加载表单时在隐藏字段中发出nonce——这将使其他人在不经过您的表单的情况下提交数据变得更加困难。

如果你有很多javascript,可能值得通过一个混淆器来运行它——这不仅使黑客难以遵循你的逻辑,还使脚本更小,加载速度更快。

与往常一样,没有什么灵丹妙药可以阻止黑客,但是你可以试着提高门槛,以阻止偶尔的黑客,然后再担心那些喜欢挑战的人。