2012-02-18 3 views
0

以下のスクリプトの出力は次のとおりです。ルアで数値のキー値を持つテーブルをどのように参照していますか?

AD[1] = [variable not found] 
AD['2'] = bar 

どのように私は両方のケースのためにVの値を返すために、関数のgetFieldを変更することができますか?

function getfield (f) 
    local v = _G  
    for w in string.gfind(f, "[%w_]+") do 
    v = v[w] 
    end 
return v 
end 

AD = {[1] = 'foo', ['2'] = 'bar'} 
data = {"AD[1]","AD['2']"} 

for i,line in ipairs(data) do 
    s = getfield(line) 
    if s then 
     print(line .. " = " .. s) 
    else 
    print(line .. " = [variable not found]") 
    end 
end 

UPDATE: 私は90%確信している、これは私のために仕事に行くされています

function getfield (f) 
    local v = _G  
    for w in string.gfind(f, "['%w_]+") do 
     if (string.find(w,"['%a_]")==nil) then 
     w = loadstring('return '..w)() 
     else 
     w = string.gsub(w, "'", "") 
     end 
     v=v[w] 
    end 
    return v 
end 

答えて

1

これは

function getfield (f) 
    local v = _G  
    for w in string.gfind(f, "['%w_]+") do 
    local x = loadstring('return '..w)() 
    print(w,x) 
    v = v[x] or v[w] 
    end 
return v 
end 

AD = {[1] = 'foo', ['2'] = 'bar'} 
data = {"AD[1]","AD['2']"} 

for i,line in ipairs(data) do 
    s = getfield(line) 
    if s then 
     print(line .. " = " .. s) 
    else 
    print(line .. " = [variable not found]") 
    end 
end 

を動作するように起こるが、それはかなり壊れやすいです。

パターンに'を追加しました。

場合によっては、wが名前(キー)を表す文字列であることがあり、数値を表す文字列であることがあります。後者の場合は、文字列から数値に変換する必要があります。しかし、文脈や文法が必要です。ここで

は私が意味する脆弱性のようなものだ:

>  data = {"math[pi]","AD['2']"} 
>  
>  for i,line in ipairs(data) do 
>>  s = getfield(line) 
>>  if s then 
>>    print(line .. " = " .. s) 
>>  else 
>>   print(line .. " = [variable not found]") 
>>  end 
>>  end 
math table: 0x10ee05100 
pi nil 
math[pi] = 3.1415926535898 
AD table: 0x10ee19ee0 
'2' 2 
AD['2'] = bar 


> pi = 3 
> math[3] = 42 
>  data = {"math[pi]","AD['2']"}> 
>  for i,line in ipairs(data) do 
>>  s = getfield(line) 
>>  if s then 
>>    print(line .. " = " .. s) 
>>  else 
>>   print(line .. " = [variable not found]") 
>>  end 
>>  end 
math table: 0x10ee05100 
pi 3 
math[pi] = 42 
AD table: 0x10ee19ee0 
'2' 2 
AD['2'] = bar 

math[pi]は変わりませんが、getfieldは、グローバルな文脈でパイを解釈し、3のでmathの間違ったフィールドが返されます。

+0

何が失敗するのでしょうか? – shaun5

+0

「脆弱性の種類」という言葉の補遺を参照してください。 –

+0

シナリオが失敗することはありません。私は思った:AD = {[1] = 'foo'、['1'] = 'foobar'、['2'] = 'bar'}はそれをするだろうが、まだ動作します..シナリオは何ですか? – shaun5

0

あなたは、文字列'1'"'2'"を取得します。

v = v[loadstring('return ' .. w)()] 

彼らは任意のコードを実行する可能性があるため、文字列は、(ユーザー入力または何かのように)しかし、信頼できないソースから来た場合は、これを行わないでください:あなたはそれが何であれ、オブジェクトにそれを回すためにそれを評価する必要があります。

+0

v = v [w]をコードに置き換えたときにエラーが発生しました... – shaun5

+0

@ shaun5とエラーは? –

+0

ローカルの 'v '(nil値)のインデックスを作成しようとしました – shaun5

関連する問題