如何处理需要限制为某组值的用户输入(unicode),并且希望最大程度地降低将数据传递到更远的应用程序的风险。例如,如果我要将数据存储在SQL中,我希望删除任何SQL注入的机会。如果我通过HTTP通过网络发送它,我想确保它不会使请求不正确等。
我想我要问的是有没有通用的数据清理方法?
答案 0 :(得分:1)
在涉及破坏系统的方法时,每个接口都有自己的问题。如果您想要安全地玩,您需要定制验证以适应当前环境中相关的问题和/或威胁。
如果用户界面中的某个文本框应用于数字输入,请确保用户无法在其中键入(或粘贴)任何非数字。如果某个控件用于从用户收集日期,请验证给定值确实是一个有效日期(可能它甚至应该在一定范围内;也验证它)。
确保url编码在http请求中作为查询字符串值传递的任何内容。使用存储过程并将值作为参数传递给它们。
等等。不幸的是,没有免费的午餐。
答案 1 :(得分:0)
如果保存到数据库,这非常简单。只需使用参数(DbParameter对象) - 它们将保护您免受SQL注入,并在必要时添加转义符号。
代码可以是这样的:
OleDbConnection cn = new OleDbConnection(strConn);
cn.Open();
strSQL = "INSERT INTO customers (Name) VALUES (@Name)";
OleDbCommand cmd = new OleDbCommand(strSQL, cn);
cmd.Parameters.Add("@Name", "John O'Brian");
cmd.ExecuteNonQuery();
答案 2 :(得分:0)
与nightcoder一样,参数是避免SQL注入的方法。如果您正在使用SQL,请考虑使用SqlClient命名空间,因为它比OleDb对应项更有效,并且专门为SQL Server 7及更高版本创建。
使用夜间编码器上面的例子:
SqlConnection cn = new SqlConnection(strConn);
cn.Open();
strSQL = "INSERT INTO customers (Name) VALUES (@Name)";
SqlCommand cmd = new SqlCommand(strSQL, cn);
cmd.Parameters.Add(new SqlParameter("@Name", SqlDbType.Varchar)).Value = "John O'Brian";
cmd.ExecuteNonQuery();
关于SqlClient命名空间需要注意的是,如果您正在编写旧系统(Win98),那么可能存在兼容性问题,使OldDBxxx成为更好的选择。
干杯!