你们都认为什么是正确的(读作:最灵活、最松散耦合、最健壮等)方式来使来自网络的用户输入安全地用于网络应用程序的各个部分?显然,我们可以为每个上下文(数据库、屏幕显示、磁盘保存等)使用各自的清理功能,但是是否有一些通用的“模式”来处理不安全的数据并使其安全?是否有一种既定的方法来强制将其视为不安全,除非它被适本地设置为安全?
最佳答案
如前所述,当您担心网络安全时,有几件事需要考虑。以下是一些需要考虑的基本原则:
- 避免将用户的直接输入集成到查询和变量中。
所以这意味着没有像 $variable = $_POST['user_input']
这样的东西.对于这样的任何情况,您都将过多的控制权移交给了用户。如果输入影响某些数据库查询,请始终使用白名单来验证用户输入。如果查询是针对用户名,则根据良好用户名列表进行验证。不要简单地使用直接插入的用户输入进行查询。
一个(可能的)异常(exception)是搜索字符串。在这种情况下,您需要进行 sanitizer ,就这么简单。
- 避免在未经清理的情况下存储用户输入。
如果用户正在为其他用户创建个人资料或上传信息,您必须拥有一份可接受的数据类型的白名单,或者剔除任何可能是恶意的数据。这不仅是为了您系统的安全,也是为了您的其他用户(见下一点。)
- 切勿在不剥离的情况下将用户的任何内容输出到浏览器。
这可能是安全顾问向我强调的最重要的事情。您不能简单地依赖于在用户收到输入时对其进行清理。如果您没有自己编写输出,请始终通过对任何 HTML 字符进行编码或将其包装在 <plaintext>
中来确保输出无害。标签。如果用户 A 上传了一些危害查看该页面的任何其他用户的 javascript,这只是开发人员的疏忽。知道任何和所有用户输出只能在所有浏览器上显示为文本,您晚上会睡得更好。
- 绝不允许除用户以外的任何人控制表单。
XSS 比它应该的更容易,并且在一个段落中涵盖真的很痛苦。简而言之,无论何时创建表单,您都在授予用户访问将处理表单数据的脚本的权限。如果我窃取了某人的 session 或某人的 cookie,我现在可以像在表单页面上一样与脚本对话。我知道它期望的数据类型以及它将查找的变量名称。我可以简单地将这些变量传递给它,就好像我是用户一样,脚本无法区分。
以上不是卫生问题,而是用户验证问题。我的最后一点与这个想法直接相关。
- 避免使用 cookie 进行用户验证或角色验证。
如果我可以窃取用户的 cookie,那么我可以做的不仅仅是让那个用户度过糟糕的一天。如果我注意到 cookie 有一个名为“member”的值,我可以很容易地将该值更改为“admin”。也许它行不通,但对于许多脚本,我可以即时访问任何管理员级别的信息。
简单地说,没有一种简单的方法来保护 Web 表单,但是有一些基本原则可以简化您应该做的事情,从而减轻保护脚本的压力。
再一次为了好的措施:
- 清理所有输入
- 对所有输出进行编码
- 根据严格的白名单验证用于执行的任何输入
- 确保输入来自实际用户
- 永远不要让任何基于用户或角色的验证在浏览器端/用户可修改
永远不要假设任何人的 list 都是详尽无遗的或完美的。
关于php - 使 Web 表单输入在各种情况下都安全的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1283352/