对所有变量使用带参数的参数化语句(就像您正在做的那样),您无需担心 SQL 注入。
HTML 和 JS 注入与页面输出阶段有关,与数据库存储无关。尝试在数据库层进行 HTML 转义或验证将令人沮丧且徒劳无功:这不是处理这些问题的正确位置,您会错过或错误处理数据,并且 SQL 中用于字符串操作的工具很弱。
不要考虑检测“攻击”,因为黑名单总是会失败。相反,旨在正确处理所有文本,然后您将获得安全作为准确的副作用。放入 HTML 文件的可变文本需要进行 HTML 转义;您放入 JavaScript 字符串文字的可变文本需要进行 JS 转义。
如果您使用标准 .NET 模板,请使用<%:
HTML 转义文本的语法。使用它作为你的输出标签而不是<%=
你会没事的。同样,如果您使用 WebForms,请使用其Text
属性自动进行 HTML 转义的控件。(不幸的是,这是不一致的。)如果您必须直接生成标记,请HttpUtility.HtmlEncode
显式使用。
JavaScript 字符串文字的编码有点棘手。有HttpUtility.JavaScriptStringEncode
,但是 JS 字符串通常存在于 HTML<script>
块中(使得</
序列在原生 JS 中不存在的地方很危险),或者在 HTML 内联事件处理程序中(您需要先进行 JS 编码,然后再进行HTML 编码)。data-
使用常规 HTML 转义(例如在属性或DOM 中)对要发送到 DOM 中的 JS 的数据进行编码<input type="hidden">
,并让 JS 从 DOM 中获取值,这往往是一种更好的策略。
如果您确实必须允许用户输入自定义标记,那么您需要在输入时将其过滤到批准的元素和属性的小白名单中。使用现有的 HTML 净化器库。