MongoDB日志分析工具 mtools

mtools 是一组用于分析mongodb日志文件的小工具集,它们的功能就和你想象中的一样。 mlogfilter: 帮助我们方便地从全部日志文件中筛选出部分数据,比如只看特定时间内的日志或者特定数据集合的日志 mplotqueries:根据条件生成对应的图表数据,比如对集合的查询操作随时间变化的分布及每次查询的扫表次数 mlogvis:和mplotqueries类似,不过是web版的 借助图表,我们可以更容易地观察到一些现象并得出结论,比如某种数据的查询次数随时间变换的规律,或者是发现某类查询的扫表次数特别的高,这也许是因为涉及的条件字段没有加索引导致的,诸如此类。 更多细节可以参考 官方文档…

还在随手修改数据表?!试试DB Migrations吧

在项目迭代的过程中,数据库结构常常需要跟随业务需求的变化做出调整,尤其在迭代的初期阶段,加一个字段减一个字段的需求更是家常便饭。在小型团队中,往往是负责开发功能模块的程序员在完成本地开发环境数据库的变更后,直接到生产环境中更新数据库结构。 这样的工作方式虽然看起来很轻松,但却可能给你的团队带来不小的麻烦。 首先,是团队成员之间数据库环境的同步问题。为了使团队中的其他开发者及时了解数据库环境的变化,你不得不在每一次修改数据表结构后,都告知整个团队你对当前数据库所做的变更,并确保所有人正确更新了他们开发环境中的数据库。 另外,变更数据库的程序员还需要同时对可能存在几个环境负责,如测试环境,项目展示环境(UAT)等都需要一一进行更新,靠人手动去维护成本高,速度慢,并且容易出错。在持续交付已经逐渐成为软件开发标准流程的今天,再继续这样的做法实在不够敏捷的。 不过幸运的是,现在我们已经有了成熟的方案来应对这样的麻烦。既然我们可以通过版本控制的方式让代码同步变得更加轻松,那为什么我们不用同样的方式来管理数据库的变更呢?这就是 Database Migrations。下面我将以Doctrine Migrations为例,来说明我们应当如何解决这样的问题。 安装 composer require doctrine/migrations Doctrine Migrations 提供了两种调用方式供你选择。一个是注册命令行工具, 另外,你也可以选择直接使用 Doctrine Migrations可执行文件(.Phar)…

降低SQL注入带来的危害

参考 记一次标准化SQL注入 的流程,再次注入了 某网站, 同时也证明程序的漏洞确实无处不在,所以作为用户千万别把什么都搁网上.作为开发者必须对自己的代码更加负责,尽可能减少被攻击的可能性以及受到攻击后将可能的危害设在一个可控的范围内,否则,很可能造成非常严重的损失. 大部分程序员对自己写的代码非常有信心,认为自己编写的代码是非常严谨的而对其他方面的安全性问题放松了警惕,这往往是最危险的做法.其实,如果稍微做一点工作,即使出现漏洞,大部分攻击也很难对程序(或网站)造成实质性的破坏,以下是目前想到的一些简单的防范措施,经供参考: 对不同的项目配置独立的数据库权限,避免因为某一个网站的漏洞而造成大面积的跨库攻击.同时,也不要给项目数据库用户提供mysql, infomation_schema 等系统级数据库的权限,避免攻击者很容易就得到数据库的结构信息. 数据表的命名不要过于常规,如 user 等,实在是太容易被猜到了. 关闭各种报错信息,可以有效提高攻击的难度,如果不是有目的的攻击者,遇到只能盲注的一般也就放弃了. 到现在还有大量的开发者认为MD5是安全的加密方式, google一下,做各种 Hash型密码破解 的网站真的是越来越牛逼,8位以下的数字密码不用付费都给你了, 作为被攻击并被爆表后,网站的最后一道防线,请重视一点,至少不要使用太常规的加密方式,不然真的没办法了.…

记一次标准化SQL注入

以下是对某网站一次教科书式的SQL注入攻击,因为该类漏洞大量存在于比较陈旧的网站中,具有很强的可复制性,写下来仅供参考. 注入点 同一个服务器上可能部署了多个网站,甚至是已经废弃但是还没有被关闭的旧版网站,新开发的网站一般都会使用一些开发框架或者是基于开源系统的二次开发,存在严重漏洞的机会相对较小,而攻击就可以从那些老旧的网站入手. http://www.xxxxx.edu.cn/xxxx/team_intro.php?id=41' 这是老版网站中的一个注入点,加 ' 注入,直接爆出表名. 有效信息: 表名 : ee_team_intro 获取字段数 因为使用UNION SELECT查询时,要求被拼接的两张表的字段数必须相等,所以需要首先知道当前表的字段数量,以及字段与页面数据的对应关系. url_decode %23 = # ,作用是注释掉之后的SQL语句. http://www.xxxxx.edu.cn/2011/xxxxx/team_intro.…

mysql批量更新数据为不同的值

当多条数据需要根据条件分别更新为不同值的时候,应该如何完成? 当数据都要被更新为相同的值时,mysql可以很简单的实现,如: UPDATE user SET name = 'Tom' WHERE user_id = '100'; 而当多条数据都需要更新且更新的数据不同时,如果直接采用循环的方法,虽然可以达到目的,但是当数据量比较大时,大量的mysql操作会使性能变得很差,并且造成阻塞。 Google了一下,找到了可行的解决办法,当需要把多条数据分别更新为不同的值时,可以采用 UPDATE SET WHEN THEN 的语法,例如: UPDATE user_info SET `username` = case user_id WHEN 100 THEN 'Tom' WHEN 101 THEN 'Sue' END , `age` = case user_…