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

Voi*_*ing 1 c# sql sql-injection webmatrix razor

目前我根本不允许使用撇号(以及你可以看到的其他角色),对每个字段重复:

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 [%]";
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已经编写了一段时间,我正在变得更好,但真正的问题是,虽然我确信有一种方法可以有效地"剥离"或以其他方式验证用户输入,但我不确定方法是最好的,可能直到安全危机迫在眉睫.

如果必须的话,我会决定永远不会允许单引号进入表格(就像现在一样),但是这可能会加剧任何名字的人... Bill O'Reilly的名字字段等等.

可能还有其他(我不知道该怎么称呼它们,'插件?''在程序之外?')可以为我做这个工作,但这实际上是无用的,因为我不仅不知道如何为了整合它,我不知道如何专门定制它到我的Web界面/数据库.

是否有任何代码可以帮助我从正常的撇号中检测sql注入撇号(通过它周围的字符?)?请记住,我的一些字段最多可容纳500个字符(textareas),最多可容纳1,000个字符.

感谢您的任何想法或帮助!

Ale*_*kov 5

没有任何输入编码/清理会像参数化查询一样安全.

有关参数化查询的详细信息,请参阅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();
    //.....
}
Run Code Online (Sandbox Code Playgroud)