关于搜索接口被攻击,如何优化思路
今天突然发现数据库崩了,最后定位到一条慢查询sql,然后追踪是客户端的搜索接口。这个接口应该是没有限制或者鉴权校验,被攻击者恶意攻击了。
select * from `publish_contents` where `status` = '1' and `column_id` in ('17', '1', '2', '19', '20', '21', '57', '89', '93', '116', '135', '139', '685', '700', '6', '7', '8', '9', '10', '11', '12', '13', '14', '29', '30', '31', '899', '903', '904', '905', '906', '907', '989', '34', '35', '36', '37', '732', '733', '38', '722', '723', '724', '725', '726', '727', '752', '973', '1248', '1249', '1266', '39', '729', '730', '43', '44', '45', '82', '83', '84', '85', '900', '901', '46', '47', '48', '49', '50', '51', '87', '88', '52', '53', '18', '32', '59', '60', '61', '63', '65', '66', '67', '68', '69', '72', '73', '74', '75', '76', '77', '708', '711', '721', '997', '1217', '1235', '33', '55', '98', '101', '677', '678', '679', '680', '712', '734', '735', '737', '743', '744', '745', '746', '750', '753', '1040', '1121', '1258', '1259', '1260', '1264', '90', '91', '682', '683', '94', '95', '117', '118', '119', '120', '121', '713', '872', '136', '137', '140', '686', '687', '688', '689', '690', '219', '220', '221', '229', '230', '231', '232', '233', '235', '250', '263', '266', '267', '268', '271', '272', '280', '283', '294', '496', '539', '581', '582', '588', '590', '593', '594', '595', '599', '600', '601', '602', '607', '660', '693', '694', '695', '696', '697', '698', '699', '709', '890', '891', '892', '893', '894', '895', '710', '715', '731', '736', '738', '739', '740', '741') and (`title` like '%file:///c:/windows/win.ini%') order by `is_top` desc, `weight` desc, `order_id` desc limit 12 offset 204
大家能看出来这个sql的问题吗?
大量in查询条件以及sql注入,导致慢查询。
个人觉得以下几点优化:
-
限制查询的ID数量:在接口中设置最大允许查询的ID数量,超过限制的请求将被拒绝。可以通过在接口中设置一个合理的默认值,并在文档中明确说明该限制。
-
接口鉴权:为接口添加鉴权机制,只允许授权用户调用接口。用户需要提供有效的访问令牌或者身份验证信息才能进行查询操作。这样可以控制用户的调用频率和权限
-
防止SQL注入:对用户传入的ID参数进行严格的校验和过滤,避免恶意用户利用SQL注入攻击进行非法查询。可以使用参数化查询或者ORM框架来防止SQL注入。
-
监控和报警:设置监控系统来监控接口的请求频率和响应时间,如果发现异常情况,及时发出报警并采取相应的应对措施。
-
数据库优化:对于频繁进行in查询的接口,可以考虑对数据库进行索引优化或者数据分区,提高查询性能。可以在查询记录较多的字段上添加索引,或者使用分表分库等技术手段。
-
接口限流:根据业务需求,在接口中添加限流策略,限制每个用户的请求频率。可以使用令牌桶算法或者漏桶算法来实现接口限流,避免用户滥用接口资源。
大家还有什么宝贵的优化有建议吗?一起讨论一下吧。