Создание экземпляра типа без конструктора по умолчанию в C# с помощью отражения

MySQL: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса для использования рядом с ... at line ...

Эта ошибка часто возникает из-за того, что вы забыли правильно удалить данные, переданные в MySQL-запрос .

Пример того, что не делать («Плохая идея»):

$query = "UPDATE `posts` SET my_text='{$_POST['text']}' WHERE id={$_GET['id']}";
mysqli_query($db, $query);

Этот код может быть включен в страницу с формой для отправки с URL-адресом например http://example.com/edit.php?id=10 (для редактирования сообщения n ° 10)

Что произойдет, если представленный текст содержит одинарные кавычки ? $query закончится:

$query = "UPDATE `posts` SET my_text='I'm a PHP newbie' WHERE id=10';

И когда этот запрос будет отправлен в MySQL, он будет жаловаться, что синтаксис неверен, потому что в середине есть отдельная одинарная кавычка.

Чтобы избежать таких ошибок, вы ДОЛЖНЫ всегда избегать данных перед использованием в запросе.

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

Документация:

91
задан nawfal 27 September 2013 в 15:57
поделиться

3 ответа

Я первоначально отправил этот ответ здесь , но здесь являюсь перепечаткой, так как это не тот же самый вопрос, но имеет тот же ответ:

FormatterServices.GetUninitializedObject() создаст экземпляр, не вызывая конструктора. Я нашел этот класс при помощи Отражатель и роющий через часть ядра.Net классы сериализации.

я протестировал его с помощью примера кода ниже, и похоже, что это работает отлично:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Runtime.Serialization;

namespace NoConstructorThingy
{
    class Program
    {
        static void Main(string[] args)
        {
            MyClass myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass)); //does not call ctor
            myClass.One = 1;
            Console.WriteLine(myClass.One); //write "1"
            Console.ReadKey();
        }
    }

    public class MyClass
    {
        public MyClass()
        {
            Console.WriteLine("MyClass ctor called.");
        }

        public int One
        {
            get;
            set;
        }
    }
}
132
ответ дан Community 24 November 2019 в 06:43
поделиться

Используйте эту перегрузку метода CreateInstance:

public static Object CreateInstance(
    Type type,
    params Object[] args
)

Создает экземпляр указанного типа с помощью конструктора что лучшие соответствия указанные параметры.

См.: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx

71
ответ дан Nick 24 November 2019 в 06:43
поделиться

Хорошие ответы, но неприменимый минута в минуту сетевая компактная платформа. Вот решение, которое будет работать над CF.Net...

class Test
{
    int _myInt;

    public Test(int myInt)
    {
        _myInt = myInt;
    }

    public override string ToString()
    {
        return "My int = " + _myInt.ToString();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var ctor = typeof(Test).GetConstructor(new Type[] { typeof(int) });
        var obj = ctor.Invoke(new object[] { 10 });
        Console.WriteLine(obj);
    }
}
4
ответ дан Autodidact 24 November 2019 в 06:43
поделиться
Другие вопросы по тегам:

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