Защита вашего кода от уязвимостей SQL-инъекций, когда вы используете QueryBuilder, хитрая и тонкая.
Вкратце, вы должны убедиться, что ваш код и только ваш код управляют такими частями запроса, как выбор, проекция и порядок сортировки, которые используются для построения окончательного запроса. Вы не должны позволять использовать какой-либо ненадежный контент для частей вашего запроса.
Вот статья о внедрении SQL в поставщиках контента, в которой приводятся примеры того, как ненадежный контент может вызывать уязвимости внедрения SQL, и более подробно рассматриваются особенности разработки под Android:
https: // solidgeargroup .com / sql-инъекция в контент-провайдерах андроида и как быть защищенным
TL; DR этого:
[ 1112]Проекция: проверяет, существуют ли поля для запроса (имя, размер, формат в примере выше) в таблице, из которой мы хотим получить данные.
[111 ]Выбор: использовать параметризованные методы запроса.
blockquote>
Нет, OpenFileDialog и SaveFileDialog оба получены из FileDialog, который по сути модален, таким образом (насколько я знаю) нет никакого способа создать немодальную версию любого из них.
Вы можете создать поток, и он будет размещать OpenFileDialog. В примере кода отсутствует какая-либо синхронизация, но он работает.
public partial class Form1 : Form
{
OFDThread ofdThread;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
ofdThread = new OFDThread();
ofdThread.Show();
}
}
public class OFDThread
{
private Thread t;
private DialogResult result;
public OFDThread()
{
t = new Thread(new ParameterizedThreadStart(ShowOFD));
t.SetApartmentState(ApartmentState.STA);
}
public DialogResult DialogResult { get { return this.result; } }
public void Show()
{
t.Start(this);
}
private void ShowOFD(object o)
{
OpenFileDialog ofd = new OpenFileDialog();
result = ofd.ShowDialog();
}
}
С помощью этого кода вы можете добавить что-то, чтобы запускать событие в потоке пользовательского интерфейса (будьте осторожны с вызовом!), Чтобы знать, когда они будут выполнены. Вы можете получить доступ к результату диалогового окна по
DialogResult a = ofdThread.DialogResult
из потока пользовательского интерфейса.