发现某网站低级致命漏洞引发的对多用户系统安全性讨论

之所以写这个,是因为本人曾经写过太多太烂的程序,犯过很多低级的致命的错误;而想起来写这个导火线是最近在开发新的系统的时候看自己过去的代码还有这样的错误没有改回来,突然想起来业内做的最好的一家公司的系统(同行参照的学习的对象),似乎也存在一个很低级的致命的错误,也是我刚学.net开发前半年一直范的低级错误,之前的公司主要在乎我们的开发进度,对于网站的安全性考虑的不多。我发现公司里有多年开发经营的前辈也一直重复的范这种低级的错误。

这家公司刚刚获得亿元的投资,人数也是好几百人,虽然成立没多久,但是范这么低级的错误好像非常不应该。然后我又看了很多类似的管理系统,发现很多系统都存在这样的低级错误,有的真的非常致命,不过还好,多数要么是使用的人真的很少(这样的系统也难怪没多少人使用),要么就是对内使用。

以下是所犯的低级错误:

删除:在系统中,当我们需要删除某一条数据的时候,我们只需要知道那条数据的主键,在网页上将主键传入后台,sql语句为:delete * from Table where id = @id;但是这样写存在一个非常致命的问题是,操作者可以在网页上随便传入id从0到足够大,这样操作这个可以删除其他用户对应表中的所有数据。这个时候,我们需要做的是借助session[“userid”] 来判断传入的id是不是本用户的操作。sql语句:delete * from Table where id=@id and userid=@userid ,这样当操作者恶意传入id的时候,id非本用户的则 不删除数据。

查询编辑:除了删除操作,还有我们查询的时候,当用查询的数据不是直接通过userid的外键查询的时候。比如一个用户(主键userid)可以有多个门店系统,门店(storeid)有对应的商品订单信息,当我们查询门店信息的时候,我们可以直接给后台传入storeid就可以获取到我们想到的数据列表,sql:select * from table where storeid=@storeid 。同样操作者可以跨用户查询编辑信息,比如查询的页面是通过地址传参数storeid到后台,那么地址是url?storeid=storeid,当用户恶意修改storeid的时候可以编辑修改对应storeid的数据。同样我们的操作还是结合用户主键userid = session[“userid”];sql:select * from table where storeid=@storeid and userid=@userid;

虽然真的很简单,当然,上面的列子只是打个比方,实际情况中会复杂的多的多,错误还是那个错误。我上个公司中现在在用的系统也满是这样的低级错误,人家每年花几千到几万用你的系统,只要随意传个参数,人家数据就可以随便更改删除,不是很恐怖的事情么?所以我觉得有必要分享一下。咨询 请加 QQ:点击这里给我发消息;QQ群:C#.NETWEB程序开发交流

原文地址:https://www.cnblogs.com/net-xiejun/p/4539993.html