安全性 - 保护插入语句免受恶意代码的攻击

时间:2013-07-14 16:38:01

标签: sql sql-server security

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

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

例如:

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

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

刚开始使用这些安全资料,显然这很重要。

非常感谢你。

1 个答案:

答案 0 :(得分:4)

  1. 使用参数化语句(如您所做的那样)和所有变量的参数,您无需担心SQL注入。

  2. HTML和JS注入与页面输出阶段有关,而不是数据库存储。尝试在数据库层中进行HTML转义或验证将是令人沮丧和无效的:它不是处理这些问题的正确位置,您将错过或错误处理数据,并且SQL中的字符串操作工具很弱。

  3. 不要考虑检测“攻击”,因为黑名单总会失败。相反,目标是正确处理所有文本,然后您将是安全的,因为准确的副作用。放入HTML文件的变量文本需要进行HTML转义;您放入JavaScript字符串文字的变量文本需要进行JS转义。

    如果您使用的是标准.NET模板,请使用<%:语法来转换HTML转义文本。使用它作为输出标记而不是<%=,你会没事的。同样,如果您使用的是WebForms,请使用Text属性自动进行HTML转义的控件。 (不幸的是,这是inconsistent。)如果必须直接生成标记,请明确使用HttpUtility.HtmlEncode

    JavaScript字符串文字的编码有点棘手。有HttpUtility.JavaScriptStringEncode,但JS字符串通常存在于HTML <script>块中(使</序列在本地JS中不存在危险)或HTML内联事件处理程序(在哪里)需要JS编码和然后 HTML编码)。使用常规HTML转义(例如在data-属性或<input type="hidden">中编码要在DOM中发送给JS的数据的策略往往更好,并让JS抓住来自DOM的价值。

    如果您真的必须允许用户输入自定义标记,那么您需要在输入时将其过滤为已批准元素和属性的小白名单。使用现有的HTML净化器库。