程序开发 > C# > 正文

无刷新 AjaxPro 编写代码易忽略的漏洞

亮术网 2020-08-23 本网原创

用 AjaxPro 实现网页无刷新功能方便许多,少写一些 javascript 脚本,但编写代码时容易忽略一些漏洞。比如有些操作是需要登录后才能操作的,结果在 AjaxPro 所调用的方法中却没有判断用户是否登录,此种情况多见于网页后台页面已经继承了需要登录才能访问的基类,或者已经验证了用户已经登录,而 AjaxPro 方法又是写在该页面下而误认为已经验证过用户是否登录毋须再验证。实际情况并非如此,网页后台验证用户是否登录的管辖范围并不包括 AjaxPro 方法,也就是说用户没有登录仍然能通过前台的 Javascript 脚本调用后台的 AjaxPro 方法。这是十分危险的,比如后台的 AjaxPro 方法是删除操作,那用户不登陆也可以随便删除网站数据,网站还有安全可言吗?

 

无刷新 AjaxPro 编写代码易忽略的漏洞举例

1、判断用户是否登录的基类

所有需要登录才能访问的页面继承该基类。如果用户已登录,则转向所请求页面;如果用户未登录,则重定向到登录页面。代码如下:

public class IsLogin : System.Web.UI.Page
  {
    public IsLogin()
    {
    }

  protected override void OnLoad(EventArgs e)
    {
      if (HttpContext.Current.Session["user"] == null)
      {
        //用户未登录,重定向到登录页
        HttpContext.Current.Response.Redirect("登录页网址");
        return;
      }
      base.OnLoad(e);
    }
  }

 

2、AjaxPro 实现无刷新删除页面

假如无刷新删除一条记录,首先要在后台引用 AjaxPro,然后注册;前台 javascript 代码如下:

<script type="text/javascript" language="javascript">
  function del(id) {
    var res = testpro.AjaxProDel.Delete(id).value;
    if (res) {
      alert("删除成功");
    }
    else {
      alert("删除失败");
    }
  }
  </script>

 

后台代码如下:

using AjaxPro;

namespace testpro
  {
    public partial class AjaxProDel : IsLogin//继承判断是否登录基类
    {
      protected void Page_Load(object sender, EventArgs e)
      {
        Utility.RegisterTypeForAjax(typeof(AjaxProDel));//注册 AjaxPro
      }

    [AjaxMethod]
      public bool Delete(int id)
      {
        if (id <= 0) return false;

      //编写从数据库删除记录的代码
        if ("删除记录成功")
          return true;
        else
          return false;
      }
    }
  }

上面的代码就犯了文章开头所说的错误,页面后台虽然继承了判断是否登录基类 IsLogin 类,但用户仍然在没有登录的情况下调用后台的 Delete(int id) 方法;AjaxPro 方法中应该判断用户是否登录,修正后的代码为:

[AjaxMethod(AjaxPro.HttpSessionStateRequirement.Read)]
  public bool Delete(int id)
  {
    if (HttpContext.Current.Session["user"] == null)
      return false;//用户未登录返回假,不进行删除操作

  if (id <= 0) return false;

  //编写从数据库删除记录的代码
    if ("删除记录成功")
      return true;
    else
      return false;
  }

修改后的代码仍然还有一个漏洞,不知您发现没有,相信您经过一翻思索后一定会发现,如果不行,编写代码多了经验积累到一定程度也会发现,所谓量变积累到一定程度会发生质变。