你都认为什么是正确的(阅读:最灵活的,松散耦合的,最强大的,等等)的方式,利用安全的上网环境在Web应用程序的不同部分使用用户输入? 很显然,我们可以只使用相应的消毒功能为每个上下文(数据库,在屏幕上显示,保存在磁盘上,等等),但有一些通用的“模式”来处理不安全的数据并使其安全吗? 有没有强制执行,将它视为不安全的,除非它被适当地进行安全建立的方法吗?
Answer 1:
喜欢它的前面已经说过,有几件事情,当你担心网络安全考虑。 下面是一些基本原理来考虑:
- 从用户避免直接输入被纳入查询和变量。
因此,这意味着不必像$variable = $_POST['user_input']
对于这样任何情况下,你移交了太多控制权交给用户。 如果输入影响到一些数据库查询,总是有白名单,以验证用户输入反对。 如果查询是用户名,验证对的良好的用户名称的列表。 不要简单地做出与用户输入的查询中右下降。
一个(可能)的例外是在搜索字符串。 在这种情况下,你需要消毒,就这么简单。
- 避免将用户输入没有卫生设施。
如果用户创建一个配置文件或上传给其他用户的信息,你必须要么有什么样的数据是可以接受白名单,或去掉任何可能是恶意的。 这不仅为您的系统的安全性,但对于您的其他用户(见下点)。
- 从用户浏览器就不会输出任何东西不剥它。
这可能是安全顾问强调对我最重要的事情。 你不能简单地依靠当它被用户接受消毒输入。 如果你没有写自己的输出,始终确保输出是通过编码任何HTML字符,或在其包装无害<plaintext>
标签。 这是对开发商的部分简单的疏忽,如果用户A上传了一些JavaScript,危害的是查看网页的其他用户。 你会在晚上睡得更好知道任何和所有用户的输出可以做什么,但出现在所有浏览器的文本。
- 绝不允许任何人,但用户控件的形式。
XSS是很容易,它应该是和一个真正的痛苦在一个段落覆盖。 简单地说,当你创建一个表单,你给用户访问一个脚本,将处理表单数据。 如果我偷别人的会话或某人的饼干,我现在可以谈剧本,就好像我是窗体页上。 我知道它预计数据和变量名,它会寻找的类型。 我可以简单地将它传递这些变量,就好像我是在用户和脚本不能看出其中的差别。
以上是不是卫生,但用户验证的问题。 我的最后一点直接关系到了这个想法。
- 避免使用的cookies进行用户验证或角色的验证。
如果我可以窃取用户的cookie,我也许能够做更多的不是让一个用户有一个糟糕的一天。 如果我发现cookie拥有一个名为“成员”的价值,我可以很容易将该值更改为“管理员”。 也许它不会工作,但对于很多剧本,我将不得不任何管理员级别信息的即时访问。
简单地说,没有一个简单的方法,以确保网络的形式,但也有简化你应该做的事情基本原理,从而简化了保护您的脚本的压力。
一旦更多的好措施:
- 清理所有输入
- 编码所有输出
- 验证用于执行对一个严格白名单的任何输入
- 请确保输入与实际用户来
- 决不让任何用户或基于角色的验证浏览器端/用户可修改
永远不要假设任何一个人的名单是详尽的或完美。
Answer 2:
我比有点怀疑,更是这样一个通用框架可以同时存在,并不仅仅是一种编程语言那么复杂。
“安全”的定义是不同层之间如此不同
- 输入字段校验,数字,日期,列表,邮政编码,车辆登记
- 跨字段验证
- 域验证 - 是一个有效的抄表? 琼斯小姐用这个月£3亿有掉电?
- 跨请求验证 - 你真的预定在同一天为自己两个跨大西洋的航班吗?
- 数据库的一致性,外键确认
- SQL注入
还要考虑违法行为时被发现的行动。
- 在UI层,我们几乎可以肯定不只是悄悄地从数字小领域剔除非数字chras,我们提出UI错误
- 在UI,我们可能要验证各个领域和标志中的每个单独的错误
- 在其他层,我们可能会抛出异常或intiate业务流程
也许我失去了你的愿景是什么? 你有没有见过你心中有获得接近?
Answer 3:
你不能用一个单一的方法来净化数据的所有用途,但一个良好的开端是:
- 使用Filter_Var来验证/消毒
过滤瓦尔需要许多不同类型的数据,并剔除了坏字符(如非数字你期望得到的东西数字),并确保它是有效的格式(IP地址)的。
注意:电子邮件地址均远远超过Filter_Var的实现更复杂,因此谷歌对周围的正常功能。
- 使用mysql_real_escape_string输入任何东西到MySQL数据库之前
我不建议使用,直到你将要输入的东西到一个数据库,它可能是更好的只是使用准备好的语句mysqli的反正。