0

我在下面做了:

  1. 过滤了危险字符

  2. 在保存到 SQL Server 2008 之前对表单数据进行编码

    public static string EncodeData(string str)
    {
            string getStr = str;
            getStr = getStr.Replace(";", " ");
            getStr = getStr.Replace("&", "");
            getStr = getStr.Replace("<", "");
            getStr = getStr.Replace(">", "");
            getStr = getStr.Replace("'", "");
            getStr = getStr.Replace("--", "");
            getStr = getStr.Replace("/", " ");
            getStr = getStr.Replace("%", "");
            getStr = getStr.Replace("*", "");
            getStr = getStr.Replace(":", "");
            getStr = getStr.Replace("!", "");
            return HttpUtility.HtmlEncode(getStr);
    }
    

我所做的是否正确?

4

3 回答 3

2

那是完全的,100%,错误的。

您应该使用参数,以便数据库引擎将文本与 SQL 查询分开发送。

您不应随意剥离字符或应用不相关的转义符。

于 2013-07-05T16:24:34.200 回答
2

在存储之前不要编码,而是在离输出最近的点编码。通过在存储之前进行编码,您会遇到一些问题

  1. 您将数据限制为单一格式。例如,如果您想将该数据作为 JSON 返回怎么办?还是RSS?编码规则不同,您现在几乎已经强制将数据转换为 HTML。
  2. 如果编码器由于错误修复而发生变化怎么办?您存储的所有数据都不会应用该错误修复,因为您在将其从存储中取出后没有进行编码。

顺便说一句,我同意您应该使用参数化查询或为您执行此操作的 ORM,这样您就可以防止 SQL 注入,而无需尝试手动剥离字符。

于 2013-07-05T17:18:06.353 回答
0

将字符保存到数据库并不是什么大问题。更大的问题是在网页上显示数据。如果你不确定你的字符串有多安全,那么在向浏览器发送数据时可以随意使用 HtmlEncode/HtmlDecode。

于 2013-07-05T16:31:50.650 回答