我们的网站 100% 基于 API(带有 SPA 客户端)。最近,一名黑客通过 SQL 注入(并破解 pwd)成功地获取了我们的管理员密码(使用 SHA-256 哈希),如下所示:
https://example.com/api/products?userId=3645&type=sqlinject here
这只是一个例子,但它对我们来说是致命的。幸运的是,这是一个很好的黑客,他刚刚给我们发了一封关于黑客攻击的电子邮件。对于一个在其存在 5 年中不断受到攻击的网站来说是幸运的。
是的,我们知道在将数据发送到 MySQL 之前,我们需要在任何地方检查用户输入并正确格式化/转义/准备语句。我们知道,我们正在修复它。但是我们没有足够的开发人员/测试人员来确保它 100% 安全。
现在假设我们有 0.1% 的机会以某种方式被注入 SQL。我们如何让黑客更难找到它并尽可能限制损害?
到目前为止,我们所做的快速修复/附加测量:
在所有 API 共享的输出“门”处,我们不再像以前那样发送原始 PDOException 和消息。但是我们仍然必须告诉客户端发生了异常:
{type: exception, code: err643, message: 'contact support for err643'}
我知道如果黑客看到异常,他会继续尝试......
PHP 用来连接 MySQL 的用户只能对表进行 CRUD。这足够安全吗?
重命名所有表(我们使用开源,因此黑客可以猜测表名)。
我们还应该做什么?
更新:由于有很多评论,我想提供一些侧面信息
- 首先,这是 LEGACY 应用程序,由一些类似学生的人开发,而不是企业级。开发团队无处可寻,现在只有 1-2 个混合开发测试人员处理数百个数据访问类。
- 密码是用 SHA-256 散列的,是的,很糟糕。我们正在将其更改为推荐的 php 方式。
- SQL注入已经17岁了。为什么它还在?
- 准备好的语句对 SQL 注入是否 100% 安全?