php - 使 Web 表单输入在各种情况下都安全的正确方法是什么?

标签 php design-patterns user-input sanitization

你们都认为什么是正确的(读作:最灵活、最松散耦合、最健壮等)方式来使来自网络的用户输入安全地用于网络应用程序的各个部分?显然,我们可以为每个上下文(数据库、屏幕显示、磁盘保存等)使用各自的清理功能,但是是否有一些通用的“模式”来处理不安全的数据并使其安全?是否有一种既定的方法来强制将其视为不安全,除非它被适本地设置为安全?

最佳答案

如前所述,当您担心网络安全时,有几件事需要考虑。以下是一些需要考虑的基本原则:

  • 避免将用户的直接输入集成到查询和变量中。

所以这意味着没有像 $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/

相关文章:

php - 从 php 中的字符串中删除年份 (yyyy)

java - 从字符串初始化子类对象

c - 从 STDIN 读取用户输入时出现段错误

lua - Lua-从用户那里获取命令行输入?

php - 如何找出用户上传文件的字符集?

php - Eloquent - $fillable 的真正用途是什么?

php - 在 mySQL 的多个 PHP 页面上使用变量

php - Laravel 5 配置文件中的自定义配置文件访问

java - Java 中简化的单例模式

c# - 单例设计模式与静态类