当我准备解决输入数据过滤和净化的问题时,我想知道是否有最佳实践(或最常用的实践)?在将数据(包括HTML、JavaScript等)插入数据库之前进行过滤/净化,还是在准备在HTML中显示数据时进行处理更好?
一些注意事项:
- 我使用PHP进行此操作,但我认为答案与编程语言无关。但如果您对PHP有任何建议,请分享!
- 这不是转义数据以用于数据库插入的问题。我的PDO已经很好地处理了这个问题。
谢谢!
当我准备解决输入数据过滤和净化的问题时,我想知道是否有最佳实践(或最常用的实践)?在将数据(包括HTML、JavaScript等)插入数据库之前进行过滤/净化,还是在准备在HTML中显示数据时进行处理更好?
一些注意事项:
谢谢!
在显示用户提交数据时,普遍认为的信条是"过滤输入,转义输出"。
我建议不要在将数据存入数据库之前转义像html实体等内容,因为您永远不知道HTML何时不再是您的展示媒介。此外,不同类型的情况需要不同类型的输出转义。例如,在Javascript中嵌入字符串需要不同于在HTML中的转义。在此之前这样做可能会使您产生错误的安全感。
因此,基本的原则是,在使用之前对其进行净化,并具体针对该用途;而不是预先处理。
(请注意,我不是在谈论SQL输出转义,而是仅针对显示。但仍然请转义绑定到SQL字符串的数据)。
我希望保留数据的原始形式。
只有在使用数据的特定场合下,我才会进行转义/过滤。
至少有两种过滤/净化类型需要注意:
显然,第一个必须在将数据插入数据库之前/之时处理,以防止SQL注入。但是您已经知道了这一点,因此我不会再多说了。
另一方面,第二个问题更有趣:
所以:
htmlspecialchars
或等效项,这可能并不会占用太多CPU...因此可能并不重要
顺便说一句,如果用户在输入数据时使用类似于bbcode/markdown/wiki的东西,并且您正在将其呈现为HTML,则第一种解决方案也很好...
至少,在它被更新之前经常显示它--尤其是如果您不使用任何缓存来存储干净的HTML版本。
如果需要,在将其放入数据库之前,为数据库清理数据(即如果您未使用处理此操作的数据库互动层)。在显示之前,为显示清理数据。
以目前不必要的引用形式存储东西只会导致太多问题。