【问题标题】:Python/mechanize on javascript page with csrf带有 csrf 的 javascript 页面上的 Python/mechanize
【发布时间】:2016-04-09 02:00:58
【问题描述】:

我想使用 python/mechanize 来控制我的调制解调器/路由器盒。虽然我可以登录并浏览菜单,但我无法更改任何值(浏览器提交无效)。这些页面使用 javascript,但我认为我在脚本中使用 mechanize 进行了等效操作。可能是因为 antiCSRF.js 文件包含阻止我更改任何值吗?

页面的html/js代码:

<head>
<script type="text/javascript">
        function main_reboot_button()
        {
            var confrm = confirm("Do you want to continue...")
            if(confrm){         
                document.getElementById("main_reboot").value = "1";
                document.getElementById("main-reboot-form").submit();
                return false;
            }
            else {
                return false;
            }
        }
</script>
</head>
<body>
<div class="panel-body panel-align">
<div class="panel panel-default accor_brd accor_brd_RB_Curved content_blk">
  <form method="post" action="bbox-maintenance.lp" id="main-reboot-form" style="padding-top:20px;">
  <div class="control_blk clearfix">
    <input type="hidden" name= "main_reboot" id="main_reboot" value="0"></input>
    <label for="input01" class="control-label txt-head">Reboot Modem</label>
    <button class="btn_proximus_standalone" onclick='return main_reboot_button()'>Restart</button>
  </div>
  </form> 
</div>
</div>
</body>
<script type='text/javascript' src='js/antiCSRF.js'></script>

antiCSRF.js 文件:

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1,c.length);
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
  }
 return null;
}
var forms=document.getElementsByTagName("form");
var rn = readCookie('xAuth_SESSION_ID');
for (var i=0; i<forms.length; i++)
{
  var temp = document.createElement("INPUT");
  temp.type = "hidden";
  temp.name = "rn";
  temp.value = rn;
  forms[i].insertBefore(temp, forms[i].firstChild);
}

我用来发出请求的python代码部分(登录后):

browser.open("http://192.168.1.1/bbox-maintenance.lp")    
browser.select_form(nr = 0)
browser.form.find_control("main_reboot").readonly = False
browser.form['main_reboot'] = "1"
browser.submit()

因此,该盒子没有重新启动,而它本应重新启动。 python脚本没有显示错误。

【问题讨论】:

    标签: javascript python mechanize csrf


    【解决方案1】:

    我终于找到了解决方案(通过更好地了解 antiCSRF 的工作原理)。我需要读取 cookie 值,在表单中添加一个名为“rn”的新元素并将其设置为 cookie 值。

    在 browser.select_form 之后添加这些行就可以了:

    browser.form.new_control('text','rn',{'value':''})
    browser.form.fixup()
    browser.form['rn'] = cj[0].value 
    

    【讨论】:

      猜你喜欢
      • 2012-08-07
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      相关资源
      最近更新 更多