我希望保护我的代码免受XSS攻击,但我所阅读的所有示例都涉及直接用户输入验证(例如联系表单或登录)。
如果我无法直接输入(例如,我的网站只是从数据库中读取而不是写入它),我是否需要保护我的代码,我有点困惑?我仍然认为我需要这样做,因为我将数据库归类为外部源,并且回显的变量中的数据仍来自其他地方。
我是否正确地认为任何读取的数据仍构成用户输入并应相应处理?另外,如果我添加了一个联系表单,那么我是否需要在每个页面中验证/清理/清除从我的数据库中提取的每一条信息,或者只在表单本身处理它?</ p>
答案 0 :(得分:4)
忘记术语“用户输入”,并根据“未知字符串”进行思考。任何你不知道知道的内容都包含在正确的上下文中的潜在危险或破坏性。
记住所有案例都没有单一解决方案也很重要。例如,这些都需要不同类型的消毒或逃避:
<a href="$unknown">
<p>$unknown</p>
<script>var B = $unknown;</script>
SELECT * from $unknown
.myClass { color:$unknown; }
通常,您应该(如果可能)避免在HTML属性,CSS或Javascript中使用未知数据 - 因为这些地方可能会变得复杂。对于大多数情况,只需转义HTML字符即可。
这里的关键词是 context ,这就是为什么你永远不想“清理”输入,而是输出的原因之一。相同的数据可以在不同的上下文中使用,并且需要不同的转义或过滤措施。
我强烈建议使用OWASP作为资源来了解一般的XSS和安全性:https://www.owasp.org/index.php/Cross-site_Scripting_(XSS)
答案 1 :(得分:1)
我是否正确地认为任何读取的数据仍构成用户输入并应相应处理?
总的来说 - 是的。大多数数据库主要包含纯文本和数字。
但也有例外。例如,如果您在那里明确地存储HTML,并确保在输入时它是安全的(或至少是可信任的),那么当您提取数据时,您不必担心保护自己免受XSS攻击。一个例子是CMS(例如Wordpress),它允许用户将HTML输入文章。
另外,如果我添加了一个联系表单,我是否需要在每个页面中验证/清理/清除从我的数据库中提取的每一条信息,或者只在表单本身处理它?</ p>
表单允许输入系统外部的数据。当您将数据放在任何地方时,您需要采取适合的任何措施。如果将其放入SQL字符串中,则需要将其转义为SQL。如果您将其放入电子邮件主题,那么您需要为此进行转义。如果将其放入HTML文档中,则需要将其转义为该文档。 (依此类推)。