Re[2]: [Linq2db] InsertWithIdentity и Sql Injection
От: elcolex  
Дата: 04.01.16 18:31
Оценка:
Здравствуйте, rameel, Вы писали:

R>Здравствуйте, elcolex, Вы писали:


E>>Написал, все работает. Потом присмотрелся... И думаю: а какого фига не используются bind-переменные?!..


R>Потому что используешь константы. Используй переменные и будут тебе параметры.


R>Для информации, инлайнингом параметров при использовании переменных можно управлять через свойство InlineParameters у DataConnection и DataContext.

R>
R>var name = "John";
R>// Какой именно запрос будет сгенерирован зависит от значения свойства InlineParameters
R>db.Persons.Insert(() => new Person {Name = name});
R>


E>> Это был для меня прям удар в спину. Тут же ведь значения из полей модели прямо вставляются в sql. Вот это косяк!


R>Тебе только кажется. Все безопасно, так как строковые параметры при необходимости эскейпятся.


E>>И что интересно, метод Insert генерит SQL с bind-переменными!


R>Вот эти методы, вызываемые напрямую у DataConnection и DataContext генерируют параметризованный sql.

R>
R>db.Insert(new Person {Name = "John"});
R>db.InsertWithIdentity(new Person {Name = "John"});
R>


R>Остальные от того, что ты используещь: константы или переменные (в последнем еще зависит от свойства InlineParameters).


E>>Но он не очень удобный, потому что не возвращает ид записи.


R>Есть метод:

R>
R>db.InsertWithIdentity(new Person {Name = "John"});
R>


Про свойство InlineParameters я знаю. Как раз в дебаггере смотрел, оно по-умолчанию false. И использую я переменные (значения приходят с формы ввода): в linq2db есть такой способ прикольный — db.Value().Value().Value().InsertWithIdentity(). Это чтобы не все поля таблицы инсертить.
Но я не совсем понял, а для чего такие сложности? Константы это или не константы. Всегда использовать бинд-переменные да и не волноваться — а правильно ли мы заэскейпили?
Вот, реальный пример: в поле ввода введено значение (без ковычек) "---юЩУЯ----"
И у меня при инсерте выдаёт оракловую ошибку "ORA-01008 not all variables bound". И я не понимаю что произошло. Т.е. это значение не вставилось в таблицу.

И потом не объяснишь разработчику, что вот этот InsertWithIdentity не используй, потому что он не совсем безопасный, а вот этот используй.
Эх, такая классная библиотека. Это ж надо...
я не разделяю ваших галлюцинаций...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.