それは次のように注入してもよい:
declare @sqlstring varchar(MAX)
declare @colName varchar(500) = 'Password'
declare @colCheck varchar(500) = 'StudentName'
declare @condition varchar(500) = 'Zeebo'' or ''''='''
SET @sqlString = N'SELECT ' + @colName + ' FROM Student WHERE ' + @colCheck + ' = ''' + @condition + ''''
PRINT (@sqlString)
結果:StudentName = 'Zeebo' または '' = '学生FROM
SELECTパスワード'
''=''
意志常に真実であると評価されるので、それはあなたにすべてのものを返すでしょう、それはユーザのパスワードのために災害になるでしょう。
SQLインジェクションを避ける簡単な方法は、ユーザー変数を文全体とは別の単位として扱うことです。たとえば、QuoteName
を使用してユーザー変数をラップすると、動的部分は入力としてのみ解析され、クエリ全体には影響しません。例えば
:
declare @sqlstring varchar(MAX)
declare @colName varchar(500) = 'Password'
declare @colCheck varchar(500) = 'StudentName'
declare @condition varchar(500) = 'Zeebo'' or ''''='''
SET @sqlString = N'SELECT ' + QUOTENAME(@colName) + ' FROM Student WHERE ' + QUOTENAME(@colCheck) + ' = ''' + QUOTENAME(@condition) + ''''
戻る前の注入方法を使用するには、@conditionのためのユーザ入力は、最終的な@sqlStringを構築する上でどんな役割を果たしていない、PUREの文字列として扱われます。 そして、その結果は次のようになります。でも、正しいSQLステートメントではありません[StudentName] = '[Zeebo' や '' = ']学生FROM
SELECT [パスワード]'
。
ああ!私はちょうどあなたの注射を試み、それは働いた QUOTENAMEが働いたおかげで男。 しかし、私はC#テキストボックスからこの注入を試みたが、うまくいかなかった。 方法はありますか? –
ダイのように 'Linq'を試してみてください、主なアイデアは同じです。そして、あなたが持っているエラーメッセージに基づいて注入欠陥をテストすることができます。 – LONG