Ruby代码出现NoMethodError错误的原因是什么?
Ruby代码NoMethodError错误原因分析
你的代码
require 'httparty' require 'base64' URL = 'http://ptl-a4b5e023-f4db1f7c.libcurl.so/' def login(username) res = HTTParty.post(URL+'login.php',body:{username:username,password: 'Password1'}> return res.headers["set-cookie"].split("=")[1] end cookie = login("administ") signature1 = Base64.decode64(cookie).split("__")[1] def xor(str1, str2) ret ="" str1.split(//).each_with_index do |c, i| ret[i] = (str1[i].ord ^ str2[i].ord).chr end return ret end username2 = xor("rator\00\00\00",signature1) cookie2 = login(username2).gsub("%2B","+") puts cookie2 signature2 = Base64.decode64(cookie2).split("__")[1] puts signature2 puts Base64.encode64("administrator--#{signature2}")
错误信息
ruby cbcccccc.rb cbcccccc.rb:17:in `block in xor': undefined method `[]' for nil (NoMethodError) ret[i] = (str1[i].ord ^ str2[i].ord).chr ^^^ from cbcccccc.rb:16:in `each' from cbcccccc.rb:16:in `each_with_index' from cbcccccc.rb:16:in `xor' from cbcccccc.rb:22:in `<main>'
错误原因
语法错误导致前置数据异常
login方法里的HTTParty.post调用末尾符号写错了,应该是})却写成了}>。这个语法错误会让login方法执行出错,返回的cookie值不符合预期,进而导致signature1的长度或内容异常,为后续XOR操作埋下问题。XOR函数未处理字符串长度不匹配场景
xor函数直接遍历str1的每个字符,但没检查str2的长度是否和str1一致。调用xor("rator\00\00\00", signature1)时,如果signature1的长度比"rator\00\00\00"短,循环到str2没有覆盖的索引位置时,str2[i]会返回nil,此时调用ord方法就会触发NoMethodError。
内容的提问来源于stack exchange,提问作者Batman
相关产品推荐
相关产品推荐

