Как я выполняю простой бит кода в новом потоке?

Я использую три разных способа предотвращения уязвимости моего веб-приложения для SQL-инъекции.

  1. Использование mysql_real_escape_string(), которое является предопределенной функцией в PHP , и этот код добавляет обратную косую черту к следующим символам: \x00, \n, \r, \, ', " и \x1a. Передайте входные значения в качестве параметров, чтобы свести к минимуму вероятность внедрения SQL.
  2. Самый продвинутый способ - использовать PDO.

Надеюсь, это поможет вам.

Рассмотрим следующий запрос:

$iId = mysql_real_escape_string("1 OR 1=1"); $sSql = "SELECT * FROM table WHERE id = $iId";

mysql_real_escape_string () здесь не защитит. Если вы используете одиночные кавычки ('') вокруг ваших переменных внутри вашего запроса, это то, что защищает вас от этого. Ниже приведено ниже решение:

$iId = (int) mysql_real_escape_string("1 OR 1=1"); $sSql = "SELECT * FROM table WHERE id = $iId";

В этом вопросе есть хорошие ответы.

Я предлагаю , наилучшим вариантом является использование PDO.

Изменить:

mysql_real_escape_string() устарел с PHP 5.5.0. Используйте либо mysqli, либо PDO.

Альтернативой mysql_real_escape_string () является

string mysqli_real_escape_string ( mysqli $link , string $escapestr )

Пример:

$iId = $mysqli->real_escape_string("1 OR 1=1");
$mysqli->query("SELECT * FROM table WHERE id = $iId");

325
задан p.campbell 4 April 2013 в 03:41
поделиться

12 ответов

Я рекомендовал бы смотреть на Jeff Richter Библиотека Поточной обработки Питания и конкретно IAsyncEnumerator. Смотрите на видео на Charlie Calvert блог, куда Richter пробегается через него для хорошего обзора.

не пугаются имени, потому что оно делает задачи асинхронного программирования легче кодировать.

0
ответ дан Robert Paulson 23 November 2019 в 00:51
поделиться

, Как к: Используйте Фоновый поток для Поиска Файлов

, необходимо быть очень осторожными с доступом с других потоков на GUI определенный материал (это характерно для многих инструментариев GUI). Если Вы хотите обновить что-то в GUI от обработки проверки потока этот ответ , что я думаю, полезно для WinForms. Поскольку WPF видят это (это показывает, как коснуться компонента в UpdateProgress () метод, таким образом, это будет работать от других потоков, но на самом деле мне не нравится он, не делает CheckAccess() прежде, чем сделать BeginInvoke через Dispathcer, видят и ищут CheckAccess в нем)

, смотрел.NET определенная книга по поточной обработке и нашел этот (свободный загружаемый). См. http://www.albahari.com/threading/ для получения дополнительной информации об этом.

я полагаю, что Вы найдете то, что необходимо запустить выполнение как новый поток на первых 20 страницах, и это имеет намного больше (не уверенный в GUI определенные отрывки, которые я имею в виду строго характерный для поточной обработки). Был бы рад услышать, какое сообщество думает об этой работе, потому что я читаю этого. На данный момент выглядел довольно аккуратным для меня (для показа.NET определенных методов и типов для поточной обработки). Также это покрывает.NET 2.0 (и не древние 1.1), что я действительно ценю.

0
ответ дан Community 23 November 2019 в 00:51
поделиться

Существует много способов выполнить отдельные потоки в.Net, у каждого есть различные поведения. Необходимо ли продолжить выполнять поток после выходов GUI? Необходимо ли передать информацию между потоком и GUI? Поток должен обновить GUI? Поток должен сделать одну задачу тогда выход, или это должно продолжить работать? Ответы на эти вопросы скажут Вам который метод использовать.

существует польза асинхронная статья метода на веб-сайте Проекта Кода, который описывает различные методы и обеспечивает пример кода.

Примечание эта статья была написана, перед асинхронный/ждущий шаблон и Библиотека Параллели Задачи была введена в.NET.

1
ответ дан Dour High Arch 23 November 2019 в 00:51
поделиться

другая опция, которая использует делегатов и Пул потоков...

принятие 'GetEnergyUsage' является методом, который берет DateTime и другой DateTime как входные параметры, и возвращает Интервал

// following declaration of delegate ,,,
public delegate long GetEnergyUsageDelegate(DateTime lastRunTime, 
                                            DateTime procDateTime);

// following inside of some client method 
GetEnergyUsageDelegate nrgDel = GetEnergyUsage;                     
IAsyncResult aR = nrgDel.BeginInvoke(lastRunTime, procDT, null, null);
while (!aR.IsCompleted) Thread.Sleep(500);
int usageCnt = nrgDel.EndInvoke(aR);
1
ответ дан Charles Bretana 23 November 2019 в 00:51
поделиться

Если Вы собираетесь использовать необработанный объект Потока затем, необходимо установить IsBackground на истинный как минимум, и необходимо также установить модель Threading Apartment (вероятно, STA).

public static void DoWork()
{
    // do some work
}

public static void StartWorker()
{
    Thread worker = new Thread(DoWork);
    worker.IsBackground = true;
    worker.SetApartmentState(System.Threading.ApartmentState.STA);
    worker.Start()
}

я рекомендовал бы класс BackgroundWorker, если Вам нужно взаимодействие UI.

2
ответ дан JHobern 23 November 2019 в 00:51
поделиться
// following declaration of delegate ,,,
public delegate long GetEnergyUsageDelegate(DateTime lastRunTime, 
                                            DateTime procDateTime);

// following inside of some client method
GetEnergyUsageDelegate nrgDel = GetEnergyUsage;
IAsyncResult aR = nrgDel.BeginInvoke(lastRunTime, procDT, null, null);
while (!aR.IsCompleted) Thread.Sleep(500);
int usageCnt = nrgDel.EndInvoke(aR);

Charles Ваш код (выше) не является правильным. Вы не должны вращаться, ожидают завершения. EndInvoke заблокируется, пока WaitHandle не сообщен.

, Если Вы хотите заблокироваться до завершения, Вам просто нужно к

nrgDel.EndInvoke(nrgDel.BeginInvoke(lastRuntime,procDT,null,null));

или альтернативно

ar.AsyncWaitHandle.WaitOne();

, Но какой смысл того, чтобы издать приказы anyc, если Вы блокируетесь? Вы могли бы также просто использовать синхронный вызов. Лучшая ставка не должна была бы заблокировать и передать в лямбде для очистки:

nrgDel.BeginInvoke(lastRuntime,procDT,(ar)=> {ar.EndInvoke(ar);},null);

Одна вещь иметь в виду состоит в том, что Вы должны вызов EndInvoke. Много людей забывает это и заканчивает тем, что пропустило WaitHandle, поскольку большинство асинхронных реализаций выпускает waithandle в EndInvoke.

3
ответ дан JHobern 23 November 2019 в 00:51
поделиться

Попытайтесь использовать класс BackgroundWorker . Вы даете ему делегатов к тому, что работать, и быть уведомленными, когда работа закончилась. Существует пример на странице MSDN, с которой я связался.

40
ответ дан Andy 23 November 2019 в 00:51
поделиться

Быстрый и грязный, но это будет работать:

Используя в вершине:

using System.Threading;

простой код:

static void Main( string[] args )
{
    Thread t = new Thread( NewThread );
    t.Start();
}

static void NewThread()
{
    //code goes here
}

я просто бросил это в новое консольное приложение для экс-клена

75
ответ дан FallenAvatar 23 November 2019 в 00:51
поделиться

ThreadPool. QueueUserWorkItem довольно идеален для чего-то простого. Единственный протест получает доступ к управлению от другого потока.

System.Threading.ThreadPool.QueueUserWorkItem(delegate {
    DoSomethingThatDoesntInvolveAControl();
}, null);
99
ответ дан Mark Brackett 23 November 2019 в 00:51
поделиться

BackgroundWorker, кажется, лучший выбор для Вас.

Вот мой минимальный пример. После нажатия на кнопку, второстепенный рабочий начнет работать в фоновом потоке и также сообщит о его прогрессе одновременно. Это также сообщит после того, как работа завершится.

using System.ComponentModel;
...
    private void button1_Click(object sender, EventArgs e)
    {
        BackgroundWorker bw = new BackgroundWorker();

        // this allows our worker to report progress during work
        bw.WorkerReportsProgress = true;

        // what to do in the background thread
        bw.DoWork += new DoWorkEventHandler(
        delegate(object o, DoWorkEventArgs args)
        {
            BackgroundWorker b = o as BackgroundWorker;

            // do some simple processing for 10 seconds
            for (int i = 1; i <= 10; i++)
            {
                // report the progress in percent
                b.ReportProgress(i * 10);
                Thread.Sleep(1000);
            }

        });

        // what to do when progress changed (update the progress bar for example)
        bw.ProgressChanged += new ProgressChangedEventHandler(
        delegate(object o, ProgressChangedEventArgs args)
        {
            label1.Text = string.Format("{0}% Completed", args.ProgressPercentage);
        });

        // what to do when worker completes its task (notify the user)
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
        delegate(object o, RunWorkerCompletedEventArgs args)
        {
            label1.Text = "Finished!";
        });

        bw.RunWorkerAsync();
    }

Примечание:

  • я поместил все в отдельный метод с помощью анонимного метода C# для простоты, но можно всегда вытаскивать их к различным методам.
  • безопасно обновить GUI в ProgressChanged или RunWorkerCompleted обработчики. Однако обновление GUI от DoWork вызовет InvalidOperationException.
192
ответ дан Will Bickford 23 November 2019 в 00:51
поделиться

Помещенный, что код в функцию (код, который не может быть выполнен на том же потоке как GUI), и инициировать выполнение того кода поместил следующее.

Thread myThread= new Thread(nameOfFunction);

workerThread.Start();

Вызов функции запуска на объекте потока вызовет выполнение Вашего вызова функции в новом потоке.

6
ответ дан Redbaron 23 November 2019 в 00:51
поделиться

Если вы хотите получить значение:

var someValue;

Thread thread = new Thread(delegate()
            {                 
                //Do somthing and set your value
                someValue = "Hello World";
            });

thread.Start();

while (thread.IsAlive)
  Application.DoEvents();
14
ответ дан 23 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: