首先,感谢您花时间阅读本文。我很确定这不是我的 google-fu 的失败。
我正在尝试构建一个自动化工具来访问具有 HTTP/HTML 接口(interface)的设备。 (具体来说,它是一个 IP 电话。)登录页面有一个用户名字段和一个密码字段,但该表单不会提交。在提交隐藏表单之前,隐藏表单将使用来自设备的额外数据(用作 RSA key )、MD5 散列和 AES 加密字符串的组合进行填充。
它还通过 Javascript 设置 session cookie,并通过 Ajax 获取 session ID。一两年前,当我陷入尝试将 Javascript 函数移植到 php 和/或复制结果的泥潭时,我放弃了一个类似的项目,但我必须相信有比这更好的方法。
function ajaxSucceedCallBack(req, res)
{
if (/^[\w,]+$/.test(res))
{
var res = res.split(",");
}
var rsa = new RSAKey();
var sessid = "";
if (res.length == 3)
{
rsa.setPublic(res[0], res[1]);
sessid = res[2];
document.cookie = "JSESSIONID=" + sessid;
}
var key = CryptoJS.MD5(Math.random().toString()).toString();
document.formInput2.key.value = rsa.encrypt(key);
key = CryptoJS.enc.Hex.parse(key);
var iv = CryptoJS.MD5(Math.random().toString()).toString();
document.formInput2.iv.value = rsa.encrypt(iv);
iv = CryptoJS.enc.Hex.parse(iv);
var data = "rand=" + Math.random() + ";";
data += "sessionid=" + sessid + ";";
data += "username=" + document.formInput.username.value + ";";
data += "pwd=" + document.formInput.pwd.value + ";";
data = "MD5=" + CryptoJS.MD5(data) + ";" + data;
var encrypted = CryptoJS.AES.encrypt(data, key,
{ iv:iv, mode:CryptoJS.mode.CBC, padding:CryptoJS.pad.ZeroPadding });
document.formInput2.data.value = encrypted.toString();
document.getElementById("notice").innerHTML="";
document.formInput2.submit();
}
最终目标是在单个系统上拥有一个 Web 界面,能够自动登录并从/向所有设备下载和上传配置文件。我在 php 中开始这个,但如果它有效,我对 perl、python、调用curl 甚至 bash 脚本(如果它完成了工作)感到满意。
感谢您的宝贵时间。
最佳答案
如果您不关心自动化的性能,一个简单的方法是使用 WebDriver。请参阅 Python 中的示例: http://selenium-python.readthedocs.io/getting-started.html
本质上,它会启动一个可以通过 Python(或其他语言)控制的浏览器。如果您不想启动浏览器的开销,您可以使用 Node.js。
关于javascript - 尝试自动访问使用 Javascript 加密表单数据的 Web 界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44731109/