Вызов метода на значении вводят результат в упаковке в.NET?

На мой взгляд, лучший способ вообще запретить SQL-инъекцию в вашем PHP-приложении (или любом веб-приложении, если на то пошло) - это думать о архитектуре вашего приложения. Если единственный способ защитить от SQL-инъекции - не забудьте использовать специальный метод или функцию, которая делает The Right Thing каждый раз, когда вы разговариваете с базой данных, вы делаете это неправильно. Таким образом, это просто вопрос времени, пока вы не забудете правильно отформатировать свой запрос в какой-то момент вашего кода.

Принятие шаблона MVC и структуры, такой как CakePHP или CodeIgniter - это, вероятно, правильный путь: общие задачи, такие как создание безопасных запросов к базе данных, были решены и централизованно реализованы в таких рамках. Они помогают организовать ваше веб-приложение разумным образом и заставляют вас больше думать о загрузке и сохранении объектов, а не о безопасном построении отдельных SQL-запросов.

24
задан Community 23 May 2017 в 11:55
поделиться

4 ответа

Вот IL для Вашего кода:

L_0001: ldc.i4.5      // get a 5 on the stack
L_0002: stloc.0       // store into x
L_0003: ldloca.s x    // get the address of x on the stack
L_0005: call instance string [mscorlib]System.Int32::ToString()  // ToString
L_000a: stloc.1       // store in s

, Таким образом, ответ в этом случае нет.

17
ответ дан plinth 28 November 2019 в 23:42
поделиться

ggf31316

"Я полагаю, что вызов ToString, Equals и Gethashcode приводит к упаковке, если структура не переопределяет методы".

я проверил ToString на Вас. Int32 действительно переопределяет ToString, таким образом, я сделал структуру, которая не делает. Я использовал Отражатель.NET , чтобы гарантировать, что структура так или иначе волшебно не переопределяла ToString (), и это не было.

, Таким образом, код был похож на это:

using System;

namespace ConsoleApplication29
{
    class Program
    {
        static void Main(string[] args)
        {
            MyStruct ms = new MyStruct(5);
            string s = ms.ToString();
            Console.WriteLine(s);
        }
    }

    struct MyStruct
    {
        private int m_SomeInt;

        public MyStruct(int someInt)
        {
            m_SomeInt = someInt;
        }

        public int SomeInt
        {
            get
            {
                return m_SomeInt;
            }
        }
    }
}

И MSIL (через ILDASM) для Основного метода это:

  IL_0000:  ldloca.s   ms
  IL_0002:  ldc.i4.5
  IL_0003:  call       instance void ConsoleApplication29.MyStruct::.ctor(int32)
  IL_0008:  ldloca.s   ms
  IL_000a:  constrained. ConsoleApplication29.MyStruct
  IL_0010:  callvirt   instance string [mscorlib]System.Object::ToString()
  IL_0015:  stloc.1
  IL_0016:  ldloc.1
  IL_0017:  call       void [mscorlib]System.Console::WriteLine(string)
  IL_001c:  ret

Теперь, несмотря ни на какой вызов упаковки, происходящий, если Вы проверяете документация об ограниченном + virt вызова, Вы найдете, что она указывает, что упаковка ДЕЙСТВИТЕЛЬНО происходит. Кавычка oOo

:

, Если thisType является типом значения и thisType, не реализует метод тогда ptr, разыменовывается, упаковывается и передается как 'этот' указатель на callvirt инструкцию по методу.

7
ответ дан Community 28 November 2019 в 23:42
поделиться

Я полагаю, что вызов ToString, Equals и Gethashcode приводит к упаковке, если структура не переопределяет методы.

4
ответ дан ggf31416 28 November 2019 в 23:42
поделиться

В случае Вы дали ответ, не, как постамент, на который указывают.

Однако это будет при вызове метода через указатель на интерфейс.

Рассмотрите код:

interface IZot
{
    int F();
}

struct Zot : IZot
{
    public int F()
    {
        return 123;
    }
}

Затем

Zot z = new Zot();
z.F();

Не приводит к упаковке:

.locals init (
    [0] valuetype ConsoleApplication1.Zot z)
L_0000: nop 
L_0001: ldloca.s z
L_0003: initobj ConsoleApplication1.Zot
L_0009: ldloca.s z
L_000b: call instance int32 ConsoleApplication1.Zot::F()
L_0010: pop 
L_0011: ret 

Однако это делает:

IZot z = new Zot();
z.F();

   .locals init (
        [0] class ConsoleApplication1.IZot z,
        [1] valuetype ConsoleApplication1.Zot CS$0$0000)
    L_0000: nop 
    L_0001: ldloca.s CS$0$0000
    L_0003: initobj ConsoleApplication1.Zot
    L_0009: ldloc.1 
    L_000a: box ConsoleApplication1.Zot
    L_000f: stloc.0 
    L_0010: ldloc.0 
    L_0011: callvirt instance int32 ConsoleApplication1.IZot::F()
    L_0016: pop 
11
ответ дан Rob Walker 28 November 2019 в 23:42
поделиться
Другие вопросы по тегам:

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