Как обрабатывать ошибочные данные? - PullRequest
1 голос
/ 22 мая 2009

Как вы работаете с пользовательским вводом (Unicode), когда вам нужно ограничиться определенным набором значений, и вы хотите минимизировать риск для приложений, которые вы передаете данные для дальнейшего продвижения по линии. Например, если бы я должен был хранить данные в SQL, я бы хотел исключить любую возможность внедрения SQL. Если бы я отправил его по сети через HTTP, я бы хотел убедиться, что он не искажает запрос и т. Д.

Я думаю, что я спрашиваю, есть ли какой-нибудь общий метод для очистки данных?

Ответы [ 3 ]

1 голос
/ 22 мая 2009

У каждого интерфейса есть свои проблемы, когда речь идет о способах взлома системы. Если вы хотите быть осторожнее, вам нужно будет настроить валидации в соответствии с проблемами и / или угрозами, которые актуальны в текущем контексте.

Если для ввода чисел должно использоваться определенное текстовое поле в пользовательском интерфейсе, убедитесь, что пользователь не может набирать (или вставлять) в него что-либо не числовое. Если для сбора даты от пользователя используется определенный элемент управления, убедитесь, что данное значение действительно является действительной датой (возможно, оно даже должно попадать в определенный диапазон; проверьте это тоже).

Убедитесь, что URL кодирует все, что передается как значение строки запроса в запросе http. Используйте хранимые процедуры и передайте значения в качестве параметров.

И так далее. К сожалению, нет бесплатного обеда.

0 голосов
/ 22 мая 2009

Как предположил ночной кодер, параметры - это способ избежать внедрения 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 лучшим выбором.

Ура!

0 голосов
/ 22 мая 2009

В случае сохранения в базе данных это очень просто. Просто используйте параметры (объекты 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();
...