2008-09-28 71 views
3

我目前有一个相当健壮的服务器端验证系统,但我正在寻找一些反馈以确保我已经涵盖了所有角度。下面是我此刻在做什么简要概述:全面的服务器端验证

  • 确保输入不为空,或者是过长

  • 逃生查询字符串以防止SQL注入

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

  • 对某些html标记进行编码,如<脚本>(所有标记均已编码当存储在数据库中时,在查询要在页面中呈现时解码一些)

有什么我失踪了吗?代码示例或正则表达式欢迎。

+0

关于第三点,我会改变说“使用正则表达式只接受有效字符。”也就是说,请指定您接受的内容,而不是尝试去考虑可能会拒绝的所有不良内容。 – bmb 2008-09-29 00:19:08

回答

8

您应该不需要“转义”查询字符串以防止SQL注入 - 您应该使用预处理语句。

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

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

2

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

+0

所有标签在存储在数据库中时都进行编码,但我希望某些标签在页面中进行渲染,以便在查询时对这些标签进行解码,但有些类似于脚本标签。我已经修改了这个问题来反映这一点。 – conmulligan 2008-09-28 22:11:51

1

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

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

1

您可以为数据过滤检查出Filter Extension。它并不能保证你完全密封,但个人感觉使用它更好,因为代码有很多眼球看着它。

另外,考虑准备声明借调。在SQL查询中转义数据已成为过去。