jas*_*son 18
在显示用户提交的数据时,普遍接受的口号是"过滤输入,转义输出".
在进入数据库之前,我建议不要转义像html实体之类的东西,因为你永远不知道什么时候HTML不会成为你的显示媒体.此外,不同类型的情况需要不同类型的输出转义.例如,在Javascript中嵌入字符串需要与HTML中不同的转义.以前这样做可能会让自己陷入虚假的安全感.
因此,基本的经验法则是,在使用前进行消毒,特别是用于该用途; 不是先发制人.
(请注意,我不是在讨论转义SQL的输出,只是为了显示.请继续转义绑定SQL字符串的数据).
Ber*_*Ott 11
我喜欢以原始形式存储/存储数据.我只根据我使用它的位置来逃避/过滤数据.
您应该关注至少两种类型的过滤/清理:
显然,第一个必须在将数据插入数据库之前/之后进行处理,以防止SQL注入.
但是你已经知道了,正如你所说,所以我不会再谈论它了.
另一方面,第二个是一个更有趣的问题:
所以:
htmlspecialchars或等效,这可能不是一个CPU吃的人......所以它可能没关系
BTW,第一个解决方案也很好,如果用户在输入数据时使用bbcode/markdown/wiki之类的东西,并且你用HTML呈现它......
至少,只要它显示的频率高于它的更新 - 并且特别是如果您不使用任何缓存来存储干净的HTML版本.
如果需要(例如,如果您没有使用为您处理的数据库交互层),请在将数据库放入数据库之前对其进行清理.在显示之前将其消毒以进行显示.
以目前不必要的引用形式存储东西只会导致太多问题.
小智 6
在将它们传递到需要逃脱的地方之前,我总是说要逃避它们.您的数据库不关心HTML,因此在存储到数据库之前转义HTML是不必要的.如果您希望输出HTML以外的内容,或者更改允许/禁止哪些标记,您可能需要先做一些工作.此外,在需要完成时,比在过程的早期阶段更容易记住进行转义.
值得注意的是,HTML转义字符串可能比原始输入长得多.如果我在注册表单中放入日语用户名,原始字符串可能只有4个Unicode字符,但HTML转义可能会将其转换为长字符串"〹𐤲䡈穩" .那么我的4个字符的用户名对于你的数据库字段来说太长了,并且存储为两个日文字符加上一半的转义代码,这也可能阻止我登录.
请注意,浏览器往往会在提交的表单本身中忽略某些非英语文本等内容,并且总会有智能手机在任何地方都使用日语用户名.所以,你可能想实际UNESCAPE存储之前的HTML.