全面的服务器端验证

时间:2020-03-06 14:51:12  来源:igfitidea点击:

我目前有一个相当强大的服务器端验证系统,但是我正在寻找一些反馈,以确保我涵盖了所有方面。这是我目前正在做的简短概述:

  • 确保输入不为空或者过长
  • 转义查询字符串以防止SQL注入
  • 使用正则表达式拒绝无效字符(这取决于所提交的内容)
  • 编码某些html标签,例如<script>(所有标签在存储在数据库中时均已编码,其中一些在查询以在页面中呈现时会解码)

有什么我想念的吗?欢迎使用代码示例或者正则表达式。

解决方案

我们应该对每个html标记进行编码,而不仅仅是"无效"的标记。这是一个热门的辩论,但基本上可以归结为总会有一些无效的HTML组合,我们会忘记正确处理(嵌套标签,某些浏览器"正确解释"的不匹配标签等)。因此,我认为最安全的选择是将所有内容存储为htmlentity,然后在输出时从内容中打印经过验证的HTML-safe-subset树(作为实体)。

在专用于该任务的库中运行所有服务器端验证,以便在一个方面进行的改进会影响所有应用程序。

此外,还包括针对已知攻击(例如目录遍历和尝试访问Shell)的工作。

我们不需要"转义"查询字符串来防止SQL注入,而应使用准备好的语句。

理想情况下,输入过滤将在进行任何其他处理之前进行,因此我们将始终使用它。因为否则我们只需要错过一个位置即可解决问题。

不要忘记对输出中的HTML实体进行编码,以防止XSS攻击。

我们正在寻找的这个问题/答案有一些好的答案
(面向PHP,但是同样,我们没有指定语言/平台,其中一些适用于php世界之外):

What's the best method for sanitizing user input with PHP?

我们可能会签出过滤器扩展进行数据过滤。它不能保证我们完全不漏气,但就个人而言,我觉得使用它会好很多,因为该代码有很多让人眼前一亮的地方。

另外,请考虑借调准备好的陈述。在SQL查询中转义数据已成为过去。