Экранирование строки SQL в Business One

Как избежать строки, исходящей от пользователя в BusinessOne? Я видел несколько примеров (в официальных образцах!), которые кажутся разумными для внедрения SQL:

SAPbobsCOM.Recordset RecSet = ( ( SAPbobsCOM.Recordset )( oCompany.GetBusinessObject( SAPbobsCOM.BoObjectTypes.BoRecordset ) ) ); 
string QryStr = "update [@VIDS] set U_RENTED = 'Y', U_CARDCODE = '" + CardStr + "' where Code = '" + MovieStr + "'"; 
            RecSet.DoQuery( QryStr );
RecSet.DoQuery( QryStr );

Есть ли способ избежать SQL-инъекций с помощью простых SQL-запросов (без хранимых процедур)?


person Andrei I    schedule 22.07.2015    source источник


Ответы (1)


К сожалению, DI-API не предоставляет подготовленные операторы, поэтому вам необходимо вручную защитить свои входные данные. Исследование того, как это можно сделать, содержится в Как экранировать значение на сервере MSSQL. вопрос:

После прочтения Новые атаки с усечением SQL и способы их предотвращения это кажется достаточным, чтобы экранировать идентификаторы, используя [ (и удваивая каждое вхождение ]), и значения, используя ' (снова удваивая каждое вхождение '). Тем не менее было бы неплохо подсказать библиотеке, заботящейся о правильном экранировании MSSQL.

Я использую следующий код Java для экранирования идентификаторов и значений (перенос на разные языки должен быть тривиальным):

Идентификаторы цитирования

public static String identifier(final CharSequence identifier) {
    final int length = identifier.length();
    StringBuilder sb = new StringBuilder(2 + length * 2);

    sb.append('[');

    for (int i = 0; i < length; ++i) {
        char c = identifier.charAt(i);

        if (']' == c) {
            sb.append(']');
        }
        sb.append(c);
    }
    sb.append(']');

    return sb.toString();
}

Указание значений

public static String value(final CharSequence value) {
    final int length = value.length();
    StringBuilder sb = new StringBuilder(2 + length * 2);

    sb.append('\'');

    for (int i = 0; i < length; ++i) {
        char c = value.charAt(i);

        if ('\'' == c) {
            sb.append('\'');
        }
        sb.append(c);
    }
    sb.append('\'');

    return sb.toString();
}
person ooxi    schedule 10.06.2016