我正在梳理旧版应用程序更新 SQL 以防止注入和 XSS 漏洞。我知道应用任何直接传递给脚本并显示在页面上的东西 PHP。htmlspecialchars()
我是否应该剥离每个非数字数据库字段,即使它来自通常不可编辑的查找表?我认为这可能会提供更强大的保护——你假设有人破坏了你的数据库并从那里工作。
我正在梳理旧版应用程序更新 SQL 以防止注入和 XSS 漏洞。我知道应用任何直接传递给脚本并显示在页面上的东西 PHP。htmlspecialchars()
我是否应该剥离每个非数字数据库字段,即使它来自通常不可编辑的查找表?我认为这可能会提供更强大的保护——你假设有人破坏了你的数据库并从那里工作。
如果查找表没有外部接口,那么出于安全原因,您可能不需要清理来自这些表的数据。但是总是清理您正在呈现的数据而不是添加例外可能更容易。
此外,如果查找表中的数据对于 HTML 输出是安全的,那么当您切换到 CSV 输出时会发生什么?它还安全吗?还是正常逃跑了?
“纵深防御”。您不一定假设您的数据库已被黑客入侵,但您当然应该进行防御性编程,而不是假设数据库不包含坏字符、数据等。
我建议您对传入的数据进行输入验证,对您写出的任何内容进行输出验证,并在系统的每一层(例如,浏览器-Web 服务器、应用程序-数据库)中进行每一项验证。
答案取决于该表列中的内容以及打算如何使用它。在大多数情况下,在将数据插入 html 之前对其进行转义是正确的做法。
在某些情况下,表的目的是存储管理员可以更新的 html 片段,以便在站点上显示某些数据。通常这将被称为 CMS。如果那是您正在构建的内容,那么在将其包含在 html 中之前,您不希望对其进行转义。在这种情况下,能够插入脚本将是一项功能,而不是错误。
当然,在这种情况下,您必须小心放入该表的内容。对于局外人来说,将数据放入该表中应该同样不可能将静态 html 文件放在服务器上。
即使授权管理员将数据输入到表中,清理它也是一个好主意,以便捕获语法错误和不平衡的标签。
我在这里描述的当然只是所有非常量字符串在包含在 html 中之前都应该被转义的规则的例外。
仅仅因为你“知道”数据库中的那些字符串永远不会包含 html 标签而跳过转义将是一种懒惰,稍后会回来咬你。如果有疑问,请使用转义。