0

我正在建立一个评论系统。注释被发送到 SQL 中的存储过程。

防止将 html、脚本或 SQL 查询注入表的最佳方法是什么?我想做这个服务器端。

例如:

INSERT INTO MyTable (UserID, Comment) VALUES (@UserID, @Comment)

处理评论字段并删除任何潜在的 HTML、脚本或查询以防止攻击的最佳方法是什么?或者如果插入包含某些字符则删除?最终我希望用户能够插入一个链接,这将在网站上呈现为可点击的链接......

刚接触这个安全的东西,显然它很重要。

太感谢了。

4

1 回答 1

4
  1. 对所有变量使用带参数的参数化语句(就像您正在做的那样),您无需担心 SQL 注入。

  2. 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 净化器库。

于 2013-07-14T18:20:10.477 回答