C # String Параметры для защиты от инъекций? - PullRequest
0 голосов
/ 18 декабря 2018

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

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.

1 Ответ

0 голосов
/ 18 декабря 2018

Я обычно проверяю, является ли 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.

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

$"SELECT * FROM `foo` where FooID = '{id}'"
...