C # String Параметры для защиты от инъекций?

2

Возьмите этот код в качестве примера:

IAmazonSimpleDB client = new AmazonSimpleDBClient(Amazon.RegionEndpoint.USEast1);
        SelectResponse response = client.Select(new SelectRequest() { 
SelectExpression = "SELECT * FROM 'foo' where FooID = '" + id + "'" });

Я могу переписать это так:

IAmazonSimpleDB client = new AmazonSimpleDBClient(Amazon.RegionEndpoint.USEast1);
        SelectResponse response = client.Select(new SelectRequest() { 
SelectExpression = "SELECT * FROM 'foo' where FooID = '{0}'", id });

Но, насколько я понимаю, это все еще делает его уязвимым для инъекций, верно?

Есть ли что-нибудь еще, что я могу сделать здесь? Мы не используем SQL, поэтому я не могу использовать параметры SQL.

  • 0
    Вы пробовали поиск в Google или поиск в стеке потока о том, как правильно построить параметризованный запрос для предотвращения внедрения SQL, также я бы порекомендовал выполнять все ваши SQL CRUD Functions на стороне БД, создавая хранимые процессы
  • 0
    Лучшее, что вы можете сделать, - это внести в белый список параметры, которые вы можете использовать, что означает, что вы не используете параметры, полученные из ненадежных источников в ненадежных форматах. Например, является ли id в вашем вопросе целым числом? Если это так, то самое большее неправильный идентификатор может быть добавлен, но без текста запроса.
Показать ещё 1 комментарий
Теги:
amazon-web-services
asp.net-mvc
amazon-simpledb

1 ответ

0

Я обычно проверяю, является ли id целым числом. Таким образом, вы получите исключение или логическое значение, если оно не является целым числом. Это будет работать нормально, если вы не используете значения GUID.

var isNumeric = int.TryParse("123", out int n); //Will give a bool

Int32.Parse(yourString); //This will give an exception if it is not an possible integer

Если это что-то большее, то вы можете использовать выражение Regex для поиска странных значений и удаления символов, которых там быть не должно, например пробелов. Большинство SQL-атак не работает, если нет пробелов... Я думаю. Удалить все пробелы довольно легко, и я предполагаю, что ваш идентификатор (даже если он сложный) не будет включать пробелы.

string s = " "
string t = s.Replace(" ", ""). //It will be hard to do a sql attack if the spaces are removed.

Немного не по теме, но в С# 6.0 вы можете форматировать строку иначе; Это новая функция под названием "интерполяция строк" (спасибо, Этьен де Мартель).

$"SELECT * FROM 'foo' where FooID = '{id}'"
  • 2
    Эта «новая функция» появилась в C # 6 и известна как интерполяция строк .
  • 0
    Окей выпендреж: p
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню