Возьмите этот код в качестве примера:
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.
Я обычно проверяю, является ли 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}'"
SQL CRUD Functions
на стороне БД, создавая хранимые процессыid
в вашем вопросе целым числом? Если это так, то самое большее неправильный идентификатор может быть добавлен, но без текста запроса.