Odpověď na vaši přímou otázku:Zabraňuje tento kód vkládání SQL:Ne
Zde je důkaz – protlačte tento řetězec metodou PrepareString:
Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
Dim output = PrepareString(input)
Console.WriteLine(input)
Console.WriteLine(output)
Upravil jsem metodu GetRecord, kterou jste zveřejnili, tak, aby vrátila plně připravený řetězec SQL namísto získání záznamu z databáze:
Console.WriteLine(GetRecord(output))
A toto je výstup
Input = ; Drop Table TableName; --
Output = '; Drop Table TableName; --
Query = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
Přidejte 1 řádek kódu navíc:
My.Computer.Clipboard.SetText(input)
A máte řetězec, který potřebujete zkopírovat přímo do schránky, abyste jej mohli vložit do vstupního pole na webu, abyste dokončili vkládání SQL:
'; Drop Table TableName; - -
[Upozorňujeme, že z výstupu příspěvku StackOverflow byly vynechány řídicí znaky, takže při vytváření výstupu budete muset postupovat podle příkladu kódu]
Po spuštění metody PrepareString bude mít přesně stejný výstup - Chr(8) ASCII kód je backspace, který odstraní extra "'", které připojujete k mému, což zavře váš řetězec a pak jsem na konec si mohu přidat, co chci. Váš PrepareString nevidí můj -- protože ve skutečnosti používám -- se znakem backspace k odstranění mezery.
Výsledný kód SQL, který vytváříte, pak bez zábran provede můj příkaz Drop Table a bude okamžitě ignorovat zbytek vašeho dotazu.
Zábavné na tom je, že pomocí netisknutelných znaků můžete v podstatě obejít jakoukoli kontrolu znaků, kterou vymyslíte. Nejbezpečnější je tedy používat parametrizované dotazy (což není to, na co jste se ptali, ale je to nejlepší způsob, jak se tomu vyhnout).