PHP、HTML、CSS、Javascript 表单安全
Posted
技术标签:
【中文标题】PHP、HTML、CSS、Javascript 表单安全【英文标题】:PHP, HTML, CSS, Javascript Form Security 【发布时间】:2011-11-02 21:42:48 【问题描述】:我有一个关于安全的问题。我有一个用 html、CSS、php、javascript(jQuery) 编写的网站...
在整个网站中,有多种形式(尤其是单选按钮)。
一旦用户选择并填写了表单,它就会从选定的单选按钮中获取值并将其发送到服务器进行处理。服务器还获取这些值并将它们插入数据库。
我担心的是:
如何防止有人在点击提交按钮之前使用开发人员工具/源代码编辑器(例如 Google Chrome 的调试/开发人员工具模块)并手动更改单选按钮的值?恐怕人们将能够在提交表单之前手动更改单选按钮输入的值。如果他们真的能做到这一点,那将完全违背我正在构建的脚本的目的。
我希望这是有道理的。
谢谢!
约翰
【问题讨论】:
例如,假设单选按钮的值为“Green Bay Packers”。如果他们单击该单选按钮并点击提交,它将给出该特定单选按钮“Green Bay Packers”的值。但是,如果他们手动将值更改为“费城老鹰队”……然后他们点击提交怎么办?它将把选定的球队记录为费城老鹰队......我不能有那种可以手动改变价值的漏洞......这些价值必须被固定下来。我对这个脚本的整个基础都不好吗? 使用客户端和服务器端验证。 xkcd.com/327 XKCD 的 +1(和一个好点:) 在您的示例中,接收表单数据的 PHP 脚本必须知道“Green Bay Packers”是允许的,而“Philadelphia Eagles”是不允许的。在这种特殊情况下,您可以定义一个可接受值的列表,如果用户数据不在此白名单中,则拒绝该请求。 Cheekysoft,感谢您对下一步的见解...这是一个非常困难的服务器端验证,因为用户本质上是在选择一支球队(绿湾包装工队、费城老鹰队等)。 ) 然后提交该团队。我什至不知道从哪里开始。 【参考方案1】:如何防止有人在点击提交按钮之前使用开发者工具/源代码编辑器(例如 Google Chrome 的调试/开发者工具模块)并手动更改单选按钮的值?
你不能。您无法控制发送到服务器的内容。
在将数据插入数据库之前,测试数据是否满足您为其设置的任何要求。如果不行,拒绝它并在 HTTP 响应中说明问题。
【讨论】:
【参考方案2】:任何从浏览器发送到服务器的数据都可以在您的控制之外进行操作,包括表单数据、url 参数和 cookie。您的 PHP 代码必须知道哪些值集是有效的,如果看起来不合理,则拒绝该请求。
将用户输入发送到数据库时,您需要确保恶意用户输入的字符串无法修改 SQL 查询的含义。见SQL Injection。并且当您显示用户输入的数据时(直接在以下响应中,或者稍后当您从数据库中读回它时)确保正确编码,以避免恶意用户输入的字符串在用户的浏览器。见Cross-site scripting 和prevention cheat sheet
【讨论】:
【参考方案3】:我会同意昆汀对此的回答。 客户端验证不应该单独存在,您还需要对输入进行某种服务器端验证。 对于大多数用户而言,客户端验证将节省到服务器的往返行程,但正如你们所提到的,不能保证“某人”不会发送错误的数据。
因此,口头禅应该是:始终进行服务器端验证
【讨论】:
【参考方案4】:其他人已经说过了,您无法阻止用户篡改发送到您服务器的数据(Firebug、TamperData 插件、自制篡改代理......)。
因此,在服务器端,您必须将您的输入视为根本没有客户端验证。
永远不要相信从外部来源进入您的应用程序的用户输入。始终对其进行验证、清理、转义。
OWASP 甚至为漏洞Client-side validation 建立了一个存根页面——这很有趣——客户端验证似乎让很多人感到困惑,并且是造成如此多安全漏洞的原因,以至于他们现在认为这是一个漏洞而不是什么东西不错。
我们不需要那么激进 - 客户端验证仍然有用,但仅将其视为一种帮助,以防止用户在被告知数据错误之前必须先进行服务器往返。没错,客户端验证只是为用户提供便利,仅此而已,更不用说保护服务器安全了。
OWASP 是一个很好的网络安全资源。看看他们的section on data validation。
一些值得引用的建议:
在哪里包含验证
必须在每一层上执行验证。但是,应根据执行代码的服务器的功能执行验证。例如,Web/表示层应该验证与 Web 相关的问题,持久层应该验证持久性问题,例如 SQL/HQL 注入,目录查找应该检查 LDAP 注入等等。
毫无例外地遵守这条规则。
【讨论】:
【参考方案5】:我会说客户端验证应该仅用于方便用户(例如,提醒他们忘记填写必填字段),然后才能提交表单并等待它完成到服务器,进行验证,然后将其发送回他们进行修复。多么痛苦。最好让 javascript 当场告诉你你搞砸了。
服务器端验证是为了安全。
【讨论】:
【参考方案6】:在这种情况下,我建议您使用值作为键,并在服务器端查找它们。
此外,请考虑在每次有人加载表单时在隐藏字段中发出 nonce - 这会使某人在不通过您的表单的情况下提交数据更加困难。
如果您有很多 javascript,可能值得通过混淆器运行它 - 这不仅使黑客更难遵循您的逻辑,而且还使脚本更小,加载速度更快。
与往常一样,没有什么灵丹妙药可以阻止黑客攻击,但您可以尝试提高标准以阻止普通黑客,然后再担心那些喜欢挑战的人。
【讨论】:
以上是关于PHP、HTML、CSS、Javascript 表单安全的主要内容,如果未能解决你的问题,请参考以下文章
如何用html css javascript php制作购物车?
程序员日常 | HTML+CSS+JavaScript+PHP
WooCommerce- 画布/绘画的 SizeInfo 按钮。 [PHP,Javascript,html,css]
用于 Web 开发和设计的有用 Vim 插件(php、html、css、javascript)? [关闭]