Skip to main content
 首页 » 编程设计

c#之我应该如何处理表单中的单引号以帮助防止 SQL 注入(inject),使用 WebMatrix razor (C#)

2024年01月25日26hnrainll

目前我根本不允许撇号(连同其他字符,如您所见),对每个字段重申:

foreach(char c in Comments) 
    { 
        if(c=='\'' || c=='$' || c=='\"' || c=='&' || c=='%' || c=='@' || c=='-' || c=='<' || c=='>') 
        { 
            errorMessage = "You have entered at least one invalid character in the \"Comments\" field. Invalid characters are: [\'], [\"], [&], [$], [@], [-], [<], [>], and [%]"; 
        } 
    } 

我编写这个代码已经有一段时间了,而且我越来越好,但真正的问题是,虽然我确信有一种方法可以有效地“去除”或以其他方式验证用户输入,但我不确定哪种方法是最好的,并且在安全危机迫在眉睫之前可能不会。

如果必须的话,我会决定根本不允许在表单中使用单引号(就像现在这样),但是这可能会激怒任何名为 say...Bill O'Reilly 的名称字段等。等

可能还有其他的(我不知道怎么调用它们,“插件”?“外部程序?”)可以为我完成这项工作,但这实际上是无用的,因为我不仅有不知道如何集成它,我不知道如何专门针对我的 Web 界面/数据库对其进行定制。

是否有任何代码可以帮助我从普通的撇号中检测到 sql 注入(inject)撇号(可能是通过它周围的字符?)?请记住,我的某些字段最多可容纳 500 个字符(文本区域),而一个字段最多可容纳 1,000 个字符。

感谢任何想法或帮助!

请您参考如下方法:

没有多少输入编码/清理会像参数化查询一样安全。

参见 SqlCommand.Parameters有关参数化查询的详细信息。

string commandText = "SELECT * FROM Sales WHERE CustomerID = @ID;"; 
 
using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    SqlCommand command = new SqlCommand(commandText, connection); 
    command.Parameters.Add("@ID", SqlDbType.Int); 
    command.Parameters["@ID"].Value = customerID; 
    var reader = command.ExecuteReader(); 
    //..... 
}