3

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

  • 确保输入不为空或太长

  • 转义查询字符串以防止 SQL 注入

  • 使用正则表达式拒绝无效字符(这取决于提交的内容)

  • 编码某些 html 标签,例如 <script> (所有标签在存储在数据库中时都会被编码,有些在被查询以在页面中呈现时被解码)

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

4

5 回答 5

8

您不需要“转义”查询字符串来防止 SQL 注入 - 您应该使用准备好的语句。

理想情况下,您的输入过滤将在任何其他处理之前发生,因此您知道它将始终被使用。因为否则你只需要错过一个地方就容易受到问题的影响。

不要忘记在输出时对 HTML 实体进行编码 - 以防止 XSS 攻击。

于 2008-09-28T22:06:48.993 回答
2

您应该对每个 html 标签进行编码,而不仅仅是“无效”标签。这是一场激烈的争论,但基本上它归结为总会有一些无效的 HTML 组合,你会忘记正确处理(嵌套标签、一些浏览器“正确”解释的不匹配标签等等)。因此,我认为最安全的选择是将所有内容存储为 htmlentities,然后在输出时从内容中打印经过验证的 HTML 安全子集树(作为实体)。

于 2008-09-28T21:57:45.473 回答
1

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

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

于 2008-09-28T21:58:43.303 回答
1

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

用 PHP 清理用户输入的最佳方法是什么?

于 2008-09-28T23:02:11.670 回答
1

您可以查看过滤器扩展以进行数据过滤。它不能保证你是完全无懈可击的,但我个人感觉使用它会好很多,因为该代码有很多眼球在看着它。

此外,考虑附议准备好的陈述。在 SQL 查询中转义数据已成为过去。

于 2008-09-29T07:41:57.257 回答