zoukankan      html  css  js  c++  java
  • C#执行javascript代码

    最近在做网站自动登陆小工具,遇到技术屏障。密码在submit时会使用js进行加密。这时我需要模拟这个加密过程,想到使用C#执行javascript代码。

    对于执行javascript代码,纯代码方式使用如下两种方式。

    1、Google Chrome V8引擎

    Google Chrome V8引擎在.NET上的封装,功能完善,性能相对较高。地址: http://javascriptdotnet.codeplex.com/

    using Noesis.Javascript;
    using System;
    using System.Collections.Generic;
     
    namespace JsCSharp
    {
        class Program
        {
            static void Main(string[] args)
            {
                using (JavascriptContext ctx = new JavascriptContext())
                {
                    var j = ctx.Run("function add(x,y){return x+y;};add(5,10);");
                    Console.WriteLine(j);//15
                }
            }
        }
    }

    2、使用 Microsoft.JScript

    Microsoft.JScript是微软提供的程序集,可以在vs中直接添加引用。在开发时必须引入Microsoft.JScript、Microsoft.Vsa命名空间。

    using Microsoft.JScript;
    using Microsoft.JScript.Vsa;
    using System;
     
    namespace JsCSharp
    {
        class Program
        {
            static VsaEngine Engine = VsaEngine.CreateEngine();
     
            static void Main(string[] args)
            {
                var j = EvalJScript("function add(x,y){return x+y;};add(5,10);");
                Console.WriteLine(j);//15
            }
     
     
            static object EvalJScript(string JScript)
            {
                object Result = null;
                try
                {
                    Result = Microsoft.JScript.Eval.JScriptEvaluate(JScript, Engine);
                }
                catch (Exception ex)
                {
                    return ex.Message;
                }
                return Result;
     
            }
        }
    }

    3、最后我使用的方法

    在开发中,使用加密js似乎存在缺陷,应用上面两种方法均返回“参数不匹配”错误,但是在浏览器控制台执行加密脚本没有出现任何错误。故使用替代方法。

    B/S架构web应用执行javascript

    页面执行javascript后,再提交结果到后台。

    window.$ = function (a) {
                return document.getElementById(a);
            }
            window.onload = function () {
                $('form1').onsubmit = function () {
                    var pwd = $('hfdPwd');
                    pwd.value = jingoalSHA1.hex_sha1(jingoalSHA1.hex_sha1($('txtPwd').value) + $('hfdToken').value)
                }
            }

    比较复杂逻辑,如提交数据到后台,处理后返回前端执行脚本再次提交到后台。

    C/S架构的Winform

    使用webbrowser在页面执行脚本,利用api获得值。虽没有上面两种干净和谐,但不失为一种解决方案。

  • 相关阅读:
    HDU2059(龟兔赛跑)
    pat 1012 The Best Rank
    pat 1010 Radix
    pat 1007 Maximum Subsequence Sum
    pat 1005 Sign In and Sign Out
    pat 1005 Spell It Right
    pat 1004 Counting Leaves
    1003 Emergency
    第7章 输入/输出系统
    第六章 总线
  • 原文地址:https://www.cnblogs.com/archip/p/3735102.html
Copyright © 2011-2022 走看看