全面的服务器端验证

Comprehensive server-side validation

提问人:conmulligan 提问时间:9/29/2008 最后编辑:conmulligan 更新时间:9/29/2008 访问量:503

问:

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

  • 确保输入不为空或太长

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

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

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

我错过了什么吗?欢迎使用代码示例或正则表达式。

PHP 正则表达式 验证 SQL 注入 服务器端

评论

0赞 bmb 9/29/2008
在第三个要点上,我会将其更改为“使用正则表达式仅接受有效字符”。也就是说,指定你接受什么,而不是试图去想所有你可能拒绝的坏事。

答:

2赞 Vinko Vrsalovic 9/29/2008 #1

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

评论

0赞 conmulligan 9/29/2008
所有标签在存储在数据库中时都会被编码,但我希望在页面中呈现一些标签,以便在查询时对这些标签进行解码,但一些标签除外,例如 script 标签。我已经修改了这个问题以反映这一点。
1赞 anonymous #2

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

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

8赞 user14038 9/29/2008 #3

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

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

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

1赞 micahwittman 9/29/2008 #4

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

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

1赞 Bob Somers 9/29/2008 #5

您可以查看用于数据筛选的筛选器扩展。它不能保证你是完全密不透风的,但就我个人而言,我感觉使用它要好得多,因为该代码有很多眼球在看它。

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