jinguojie-loongson / loongson-app

龙芯应用公社 Loongson Application Community
http://app.loongnix.org
GNU General Public License v2.0
13 stars 3 forks source link

下载计数:增加安全限制 #11

Closed jinguojie-loongson closed 7 years ago

jinguojie-loongson commented 7 years ago

现在调用incAppDownloadCount.php就能够加1, 需要严格判断来自于客户端的安装。

jiangxinshang-loongson commented 7 years ago

一种可能的方法: app.php出现时,内部记录一个临时code,code只对一次安装生效

曾经设想过:单位时间内的下载频率

jiangxinshang-loongson commented 7 years ago

显示安装按钮的时候:

  1. PHP生成一个随机的code,存在Session里面; 同时以隐藏域保存在HTML中。
  2. 前台用户点击按钮,调用Ajax接口时,要上传隐藏域中的code
  3. PHP中以前台提交的code,和Session中的code相比较,只有相同时才认为是合法安装。
  4. PHP写数据库以后,立即清除Session

这种方式,能够消除“直接访问Ajax接口”的攻击方式,但是不能消除“使用Load Runner录制脚本”的攻击方式(只能通过加手工校验码):

  1. code不再直接出现在页面中,只出现code混淆后的图片
  2. 人工观察图片,输入验证吗,页面 把验证码提交给后台进行验证 —— code永远不出现在页面中。

争取能够找到不使用验证吗的方法,降低用户复担。

另外一个方法:变换控件id

另外一个方法:浏览器ID

jinguojie-loongson commented 7 years ago

Jin、Jiang再次讨论:

  1. 问题本质定义:如何区分“用户手工点按钮”和“LoadRunner、浏览器插件工具”? 或者说:什么事情只能人做、而工具不能做? 以往:验证码只能人眼处理

  2. 类似软件:网络抢票

  3. 按钮id随机变化:可以防备Load Runner,不能防备浏览器插件自动点击按钮

  4. 为什么Youku不防下载:可以通过事后追查,视频中含有水印

  5. 另一种思路:不在服务器上检查,而是在客户端上 客户端保存一个数据文件:“所以已经安装过的应用、版本号” 只要已经安装过,重复安装不增加户数。 数据文件不容易被修改。 <-- 这应该是最终采用的方法,下一版本中再实现。

来次先实现双Token的方案,解决90%的问题。

jinguojie-loongson commented 7 years ago
  1. getrandcode():如果只有app.php使用,就放到_app.inc中。 如果系统中其它页面也可能使用,放到_util.inc中。

  2. 改成一个函数调用

    create_new_token() { md5(getrandcode) $_SESSION["token"]赋值 return }

  3. unset($_SESSION['token']); 也封装成函数 clear_token()

写任何的代码的时候,都要假定这段代码将来是会被重用的。

  1. 断 言:给程序员自己看的 assert( 表达式 ); // 一个程序,在一些关键环节,针对一些关键变量,写上一些错误检查 运行过程中,如果表达式不成立,程序会报错

if (表达式) throw new XXXException("message");

http://www.cnblogs.com/DreamDrive/p/5417283.html

  1. 错误提示:给其它模块的,给用户的 返回错误信息,或者 在页面上显示