我目前有一个相当强大的服务器端验证系统,但我正在寻找一些反馈,以确保我已涵盖所有角度。以下是我正在做的事情的简要概述:
确保输入不为空或太长
转义查询字符串以防止SQL注入
使用正则表达式拒绝无效字符(这取决于提交的内容)
编码某些html标记,例如< script> (所有标签在存储在数据库中时都会被编码,有些标签在查询时会被解码以在页面中呈现)
有什么我想念的吗?代码示例或正则表达式欢迎。
答案 0 :(得分:8)
您不需要“转义”查询字符串以防止SQL注入 - 您应该使用预准备语句。
理想情况下,您的输入过滤将在任何其他处理之前发生,因此您知道它将始终被使用。因为否则你只需要错过一个易受问题影响的地方。
不要忘记在输出上编码HTML实体 - 以防止XSS攻击。
答案 1 :(得分:2)
您应该对每个html标记进行编码,而不仅仅是“无效”标记。这是一个热门的争论,但基本上它归结为总会有一些无效的HTML组合,你将忘记正确处理(嵌套标签,一些浏览器正确解释的不匹配标签等等)。因此,我认为最安全的选择是将所有内容存储为htmlentities,然后在输出时,从内容中打印经过验证的HTML安全子集树(作为实体)。
答案 2 :(得分:1)
在专用于该任务的库中运行所有服务器端验证,以便一个区域的改进会影响您的所有应用程序。
此外还包括针对已知攻击的工作,例如目录遍历和尝试访问shell。
答案 3 :(得分:1)
这个问题/答案有一些你正在寻找的好的回应 (面向PHP,但是你没有指定语言/平台,其中一些适用于php世界):
答案 4 :(得分:1)
您可以查看Filter Extension进行数据过滤。它不能保证你完全不透气,但我个人感觉好多了,因为那段代码有很多眼球看着它。
另外,请考虑借调的预备陈述。在SQL查询中转义数据已成为过去。