我已经注意到一些SQL注入保护教程,导师会说“你必须在输出到页面时清理所有用户数据” - 或者其他类似的东西那... ..
但是,我很困惑为什么这样做是必要的。
其中一个原因是:你通常不会在输入到数据库时逃避和消毒数据,因此无需再次在输出上重新消毒它。
对我来说似乎有点无意义,我一直在寻找一个答案,为什么需要这个,但我似乎无法找到任何解释它如何防止任何攻击的页面。 / p>
如果有人能填补我,那将非常感激,
感谢。
答案 0 :(得分:2)
数据库不是网页。
将数据安全放在SQL字符串中的原因与将数据安全放在HTML文档中的原因不同。
即使是这样,从数据库中读取数据的行为也会为您提供未转义的数据。举一个简单的例子:给定INSERT INTO foo (a, b) VALUES ('John', 'O\'Brian'):
,\
未插入数据库。它只是阻止'
结束SQL中的字符串。
将数据插入数据库时,需要对其进行转义(或使用预处理语句)以防止SQL注入攻击。
当您将数据插入网页时,您需要将其转义(或使用基于DOM的白名单过滤器)来抵御XSS攻击。
现在,当您将数据插入数据库时,可以尝试防御XSS,而不是在将其插入页面时,但现在还为时过早,可能会导致更大的问题。这意味着您将在数据库中存储HTML而不是文本,如果您决定将文本用于其他目的(例如插入电子邮件或仅搜索),则不太有用。
答案 1 :(得分:-1)
首先,包括在将数据插入数据库之前应该转义数据的教程通常很糟糕或过时。始终使用带参数的预准备语句,而不是手动转义数据。
转发输出数据是为了防止针对您的用户的跨站点脚本(XSS)攻击。