精华内容
下载资源
问答
  • 目前很多网站为了防止恶意提交表单信息,大多都采用了加密的方式对提交信息进行处理,...那么我们同样可以利用WebBrowser来执行JS脚本,达到加密的目的。 就以移动MM的登录获取验证码为例子,简单描述一下WebBro...

      目前很多网站为了防止恶意提交表单信息,大多都采用了加密的方式对提交信息进行处理,加密处理后通过POST提交给服务器验证,这种操作一般都是用Javascipt进行加密,若是我们想要正确提交表单到网站,就需要对javascipt的加密操作进行模拟。那么我们同样可以利用WebBrowser来执行JS脚本,达到加密的目的。

       就以移动MM的登录获取验证码为例子,简单描述一下WebBrowser执行JS的过程。
    jQuery.ajax({
    url: "/portal/web/SmsRandomSendAction.do",
    dataType: "json",
    type: "POST",
    data: {
    "loginName": strEnc(loginName,"1234567","",""),
    "type": type
    },
    success: function(json){
    if (json.ret == 1) {
    ranpastor.showMessage("两次发送下载短信间隙不能小于1分钟");
    ranpastor.disabled(); //超出限制次数不能再次发送,不能发送
    return;
    }
    if (json.ret == 0) {//确认发送短信秘密成功,可以短输入信秘吗,60秒后可再次发送
    ranpastor.disabled();//失效
    ranpastor.startAutomaticavAilable();//启动自动恢复有效状态
    var message = "验证码已发出,如您"
    message += '<span id="resend_time_count">'+ranpastor.disabledTime+'</span>';
    message +="秒还没有收到,请点击按钮重新获取";
    ranpastor.showMessage(message);
    } else {//发送失败,可重新发送
    var message = json.message || "发送失败!"
    if (json.ret == 5) {
    message = '您今天下发短信密码的次数超过最大短信密码下发次数,请使用最近一次您收到的短信密码,或者使用固定密码方式登录, 如果不记得固定密码, 请使用您的手机发送短信"CZMM"到"10658800",系统会自动为您下发新的固定密码到您手机上,谢谢您的支持!'
    }
    ranpastor.available();
    ranpastor.showMessage(message);
    }
    return false;
    }
    以上代码即为移动MM获取验证码所用的JS代码,我们可以在代码中看到在过程中LoginName被strEnc加密后在提交到网站的。而strEnc是http://mm.10086.cn/moneditor/cs/include/js/common/core/core.js提供的,那么我们只需要执行这个strEnc便能够得到加密后的密文。

    首先,我们先写一个执行strEnc的html方便我们调用。
    <html>
    <head>
    <script type='text/javascript' src='http://mm.10086.cn/moneditor/cs/include/js/common/core/core.js'></script>
    <script type='text/javascript'>
    function getPwd(phoneNum) {
    var result=strEnc(phoneNum,'1234567','','');
    return result; }
    </script>
    </head>
    <body></body>
    </html>

    先将窗口类设置为COM可访问
    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public partial class FrmDemo : Form
    然后将之前我们写好的js代码放到WebBrowser里。
     webBrowser1.DocumentText="<html> <head>  <script type='text/javascript' src='http://mm.10086.cn/moneditor/cs/include/js/common/core/core.js'></script>  <script type='text/javascript'> function getPwd(phoneNum)  {   var result=strEnc(phoneNum,'1234567','',''); return result;  } </script> </head> <body> </body> </html>";
       
    到这里,准备工作就已经做完了,接下来就是调用这个js函数的问题了。
     
    在WebBrowser中,我们可以这样调用JS
     
    webBrowser1.Document.InvokeScript("getPwd", new object[] { "18780110000" })
    会返回一个object的值,函数中返回的一定是一个加密后的字符串,将它转换为string就可以了。

    注意一下,不要将调用代码写在Form_Load事件里面。

    Demo Download

    转载于:https://www.cnblogs.com/Dersoul/archive/2011/11/27/2265142.html

    展开全文
  • 来自:...winform的WebBrowser控件,可以方便的载入页面并执行一些操作,我们可以注入自己的js脚本在页面中执行,方法如下: HtmlElement head = web

    来自:http://outofmemory.cn/code-snippet/1706/c-winform-program-WebBrowser-control-execution-javascript-script

    winform的WebBrowser控件,可以方便的载入页面并执行一些操作,我们可以注入自己的js脚本在页面中执行,方法如下:

    HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
    HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
    IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
    element.text = "function sayHello() { alert('hello') }";
    head.AppendChild(scriptEl);
    webBrowser1.Document.InvokeScript("sayHello");
    

    另外如果你的脚本非常简单也可以用下面的方法:

    string jCode = "alert("Hello");"
    // or any combination of your JavaScript commands
    // (including function calls, variables... etc)
    
    // WebBrowser webBrowser1 is what you are using for your web browser
    webBrowser1.Document.InvokeScript("eval", new object[] { jCode });
    

    Enjoy Coding!!!


    展开全文
  • http://www.cnblogs.com/wuhuacong/archive/2010/11/08/1871866.html
    http://www.cnblogs.com/wuhuacong/archive/2010/11/08/1871866.html
    展开全文
  •  上面的运行Javascript脚本,需要先把用到的脚本全部下载,把内容组合起来,然后添加一个虚拟的函数,运行得到返回结果接口,虚拟的函数一定要写正确,否则出来很多错误,得不到结果。  上面的代码有 source =...

    为了有效阻止恶意用户的攻击,一般登录都会采用验证码方式方式处理登录,类似QQ的很多产品的验证码处理,但在一些OA系统中,系统通过非对称加密方式来处理登录的密码信息,登录页面每次提供对密码进行加密的公钥是不同的,因此如果要模拟登录,就需要先获取公钥,然后根据公钥把输入的密码加密,然后通过POST提交给服务器进行验证登录。由于公钥是页面刷新变化的,而加密是通过Javascript脚本进行加密,如下面的登录页面源码所示。

     

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
    <link rel="stylesheet" type="text/css" href="/templates/2008/index.css"> 
    <link rel="shortcut icon" href="/images/tongda.ico"> 
    <script src="/inc/js/rsa/jsbn.js"></script><script src="/inc/js/rsa/prng4.js"></script><script src="/inc/js/rsa/rng.js"></script><script src="/inc/js/rsa/rsa.js"></script> 
    <script type="text/javascript"> 
    function CheckForm()
    {
       
    var rsa = new RSAKey();
       rsa.setPublic(
    "97e256ec6147b7aadc46a353b5c5d707a895b402d114290c0c24a28919507569""10001");
       
    try{
          document.form1.PASSWORD.value 
    = rsa.encrypt(document.form1.PASSWORD.value);
       }
       
    catch(ex){
          
    return false;
       }
       
    return true;
    }
    </script> 
    </head> 
     
    <body onload="javascript:document.form1.PASSWORD.focus();"> 
    <br> 
    <br> 
    <br> 
    <br> 
     
    <div align="center"> 
    <form name="form1" method="post" action="logincheck.php" autocomplete="off" onsubmit="return CheckForm();"> 
     
      
    <table cellspacing="0" cellpadding="0" align="center"> 
        
    <tr class="img_field"> 
          
    <td align="center"><img src="/attachment/2090997160/index_1.jpg" width="651" height="241"></td> 
        
    </tr> 
        
    <tr height="37" class="login_field"> 
          
    <td align="center"> 
            
    <b>用户名</b> <input type="text" class="text" name="UNAME" size="15" onmouseover="this.focus()" onfocus="this.select()" value=""> 
            
    <b>密码</b> <input type="password" class="text" name="PASSWORD" onmouseover="this.focus()" onfocus="this.select()" size="15" value=""> 
    <select name="UI"> 
                
    <option value="0">标准界面</option></select> 
             
    &nbsp;<input type="submit" name="submit" class="submit" value="登 录"> 
          
    </td> 
        
    </tr> 
      
    </table> 
      
    <br> 
      
    </form> 

    为了模拟登录,我们需要先获取页面的公钥信息,然后通过在C#中运行Javascript脚本,传递公钥和明文密码,然后获取脚本加密的结果,再提交给服务器处理。

    如下面代码所示,获取公钥就是分析HTML源码,通过正则表达式匹配即可获取到,相对比较简单,但是要获取Javascript脚本的运行结果,就需要花点功夫了。

                        ///inc/js/rsa/jsbn.js /inc/js/rsa/prng4.js /inc/js/rsa/rng.js /inc/js/rsa/rsa.js
                        string scriptUrl = "http://www.abc.cn:8080/inc/js/rsa/jsbn.js";
                        
    string scriptUrl2 = "http://www.abc.cn:8080/inc/js/rsa/prng4.js";
                        
    string scriptUrl3 = "http://www.abc.cn:8080/inc/js/rsa/rng.js";
                        
    string scriptUrl4 = "http://www.abc.cn:8080/inc/js/rsa/rsa.js";
                        
    string referen = "http://www.abc.cn:8080";
                        HttpHelper helper 
    = new HttpHelper();
                        helper.Encoding 
    = Encoding.Default;

                        
    string mainContent = helper.GetHtml(referen, cookie, referen);

                        
    string regex = "rsa.setPublic\\(\"(?<publicKey>.*?)\",\\s*\"(?<encrypt>.*?)\"\\);";
                        Regex re 
    = new Regex(regex, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace);
                        Match mc 
    = re.Match(mainContent);
                        
    if (mc.Success)
                        {
                            
    string publicKey = mc.Groups["publicKey"].Value;
                            
    string encrypt = mc.Groups["encrypt"].Value;
                            
    string pass = config.AppConfigGet("ContactPassword");

                            
    string source = "";//"var appName = \"Microsoft Internet Explorer\"; " + Environment.NewLine;
                            source += helper.GetHtml(scriptUrl);
                            source 
    += helper.GetHtml(scriptUrl2);
                            source 
    += helper.GetHtml(scriptUrl3);
                            source 
    += helper.GetHtml(scriptUrl4);
                            
    //source = source.Replace("navigator.", "");
                            source = getJS(source);

                            encryptPass 
    = scriptEngine.Eval("getRSAKey()",
                                                 source 
    +
                                                 
    "\r\nfunction getRSAKey(){\r\nvar RSA = new RSAKey();\r\nRSA.setPublic(\"" +
                                                 publicKey + "\",\"" + encrypt + "\");\r\nvar Res = RSA.encrypt('" + pass + "');\r\nreturn Res;\r\n}").ToString();


                        } 
                        
    #endregion

     上面的运行Javascript脚本,需要先把用到的脚本全部下载,把内容组合起来,然后添加一个虚拟的函数,运行得到返回结果接口,虚拟的函数一定要写正确,否则出来很多错误,得不到结果。

     上面的代码有source = getJS(source);这一句,是为了避免脚本调用navigator.appName来处理浏览器类型和版本的判断,有两种方式可以跳过这个处理,一个增加一个appName的变量,如var appName =**这样,然后统一替换navigator. 的字符,使得脚本判别浏览器代码失效;二是通过正则表达式替换掉响应的判断代码即可

             private string getJS(string strJS)

            {
                
    if (!Regex.IsMatch(strJS, @"if\(j_lm \&\& \(navigator.appName == ""Microsoft Internet Explorer""\)\) {.+?dbits = 28;.+?}", RegexOptions.Singleline) ||
                    
    !Regex.IsMatch(strJS, @"if\(navigator.appName == ""Netscape"" && navigator.appVersion < ""5"" && window.crypto\) {.+?}", RegexOptions.Singleline))
                {
                    
    return string.Empty;
                }

                strJS 
    = Regex.Replace(strJS,
                                         
    @"if\(j_lm \&\& \(navigator.appName == ""Microsoft Internet Explorer""\)\) {.+?dbits = 28;.+?}",
                                         
    "BigInteger.prototype.am = am2;\r\ndbits = 30\r\n", RegexOptions.Singleline);
                strJS 
    = Regex.Replace(strJS,
                                         
    @"if\(navigator.appName == ""Netscape"" && navigator.appVersion < ""5"" && window.crypto\) {.+?}",
                                         
    string.Empty, RegexOptions.Singleline);
                
    return strJS;
            }

    得到处理过的密码密文 ,一般通过POST方式提交登录页面,即可完成系统的登录了,然后继续可以通过HttpRequest方式获取系统各种页面的信息了(如联系人等),如下面所示。

                 string referen = "http://www.abc.cn:8080/";

                string loginUrl = "http://www.abc.cn:8080/logincheck.php";
                
    string login = "test";
                
    string loginPostData = string.Format("UNAME={1}&PASSWORD={0}&UI=0&submit={2}", encryptPass, login, "%B5%C7+%C2%BC");

                
    string conctactUrl = "http://www.abc.cn:8080/general/ipanel/user/search.php";
                
    string itemRegex = "<tr\\s*class=\"TableLine\\d\">\\s*(.*?)\\s*</tr>";
                
    string memberRegex = "<td.*?>\\s*(.*?)\\s*</td>";

                List
    <ContactInfo> contactList = new List<ContactInfo>();
                HttpHelper helper 
    = new HttpHelper();
                helper.Encoding 
    = Encoding.Default;

                
    string result = helper.GetHtml(loginUrl, cookie, loginPostData, true"", loginUrl);

     最后程序处理登录后,自动获取联系人的界面效果如下所示:

     

     除了上面的操作方式,还有一种途径是通过WebBrowser控件实现数据的自动提交,WebBrowser控件处理脚本的运行更加方便,但缺点是这个控件相对较慢,首先我介绍一下这种方式,在按钮触发中调用控件的Navigate函数,打开相应的登录链接地址。

    webBrowser1.Navigate("http://www.abc.cn:8080");

    接着在浏览器控件的页面完成函数处理中对数据进行处理,处理的思路就是调用脚本对输入的内容进行加密,然后再触发提交按钮即可完成页面的登录,记录登录的信息,然后再去获取相关的页面内容信息,不过这种控件处理相对没那么大的弹性处理,不过可以作为一些功能的补充使用。

            private int numtries = 0;
            
    private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                
    if (webBrowser1.Document.GetElementById("UNAME"!= null)
                {
                    webBrowser1.Document.GetElementById(
    "UNAME").SetAttribute("value""陈建才");
                    webBrowser1.Document.GetElementById(
    "PASSWORD").SetAttribute("value""voowoo770916");

                    
    if (numtries < 2)
                    {
                        IHTMLWindow2 login 
    = (mshtml.IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
                        
    //login.execScript("document.forms[0].submit();", "javascript");
                        login.execScript("CheckForm();""javascript");
                        
    string value = webBrowser1.Document.GetElementById("PASSWORD").GetAttribute("value");
                        encryptPass 
    = value;

                        GetContact();
                        numtries
    ++;
                    }
                }
                
    if (webBrowser1.Document.GetElementById("userName"== null)
                {
                    numtries 
    = 0;

                    
    //string cookieString = webBrowser1.Document.Cookie;

                    
    //CookieCollection cc = new CookieCollection();
                    
    //CookieManger.SetCKAppendToCC(cc, cookieString, "http://www.abc.cn:8080");
                    
    //cookie.Add(cc);

                }
            }

     通过浏览器接口,我们可以实现页面内容在不可以见的浏览器控件中呈现,然后获取相应的页面对象或者页面源码进行分析,可以得到更加丰富的数据,模拟浏览器的实际操作和获得真实的显示结果。

    本文转自博客园伍华聪的博客,原文链接:Winform下动态执行JavaScript脚本获取运行结果,谈谈网站的自动登录及资料获取操作,如需转载请自行联系原博主。



    展开全文
  • 1)在c#中调用js函数 如果要传值,则可以定义object[]数组。 具体方法如下例子: 首先在js中定义被c#调用的方法: function Messageaa(message) { alert(message); } 在c#调用js方法Messageaa private void button1_...
  • 1.首先具备 msscript.ocx 2.引用刚才的文件 3.ScriptControl sc = new ScriptControl(); sc.Language = "javascript"; sc.AllowUI = false;... sc.AddCode(脚本语言,比如function c(a){ return a})
  • U3D.exe嵌入winform脚本,发布出来的u3d的.exe程序嵌入到winform窗口程序中并实现数据交互。
  • JsInWinform(在winform中调用JS代码)

    热门讨论 2012-04-28 12:26:27
    winform使用JS脚本的方法,在winform使用JS脚本的方法,在winform使用JS脚本的方法,
  • 场景描述 今天做了个功能,要访问第三方系统数据, 他们提供 Com 组件,我们使用的是 winform 调用 com组件访问对方提供的xml数据!...我们拿到了这个测试页,在本地运行也没问题!比较怪异啊~~~~~~ 是在没
  • webBrowser控件内是可以打开HTML页面的1、winform后台代码调用js脚本函数:设置webBrowser可调用控件内的脚本代码,在构造函数内执行webBrowser.ObjectForScripting = this;就能通过下面方法把数据传递到HTML页面并...
  • 在实际应用中我们可能需要WebBrowser控件主动执行我们需要的脚本执行脚本现在有两种方法。 1、WebBrowser控件加载脚本,简单方便,适用于简短的脚本,无法执行复杂操作。 webBrowser.Navigate("javascript:...
  • BingWay原创作品,转载请注明作者和出处。 最近做了一个小东西,用于WinForm应用程序获取网站的用户登录信息...scripttype="text/javascript">2functionGetData()//用此方法,会弹出“缺少对象”错误3{45varu...
  • WinForm脚本的交互

    2007-05-18 13:52:00
    这是去年学习SmartClient时写下的,有兴趣可以看看 将Winform Control嵌入IE,很多时候需要JS脚本与Control进行交互。一方面是在脚本中使用控件的属性,调用控件的方法,另外一方面是脚本中能够响应控件的事件。对于...
  • C# winformJavascript的相互调用

    千次阅读 2011-11-11 10:25:34
    转自:...   C# winformJavascript的相互调用 Code html> head>  meta http-equiv="Content-Language" content="zh-cn">  scri
  • winform嵌入网页项目中,如何在网页中通过js脚本调用winform中类的方法?此demo可以帮到你
  • c# winform 调用js

    2016-06-07 18:10:00
    1. 在winform中加入一个 WebBrowser 控件; 2. webBrowser控件加载html文件,html文件中包含了js代码, 代码如下(必须在 InitializeComponent(); 后加载): public Form1() { InitializeComponent(); ...
  • 解决方案 1.工程引用 Interop.MSScriptControl.dll 2.创建一个类,代码如下: using System;using System.Collections.Generic;using System.Text;using MSScriptControl;... /// 脚本类型 ...
  • 目前很多网站为了防止恶意提交表单信息,大多都采用了加密的方式对提交信息...那么我们同样可以利用WebBrowser来执行JS脚本,达到加密的目的。 就以移动MM的登录获取验证码为例子,简单描述一下WebBrowser执行J...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,754
精华内容 1,101
关键字:

winform执行js脚本