我理解SQL注入攻击的基本过程。我的问题与SQL注入预防有关。有人告诉我,防止这种攻击的一种方法是频繁更改表名!这可能吗?
如果是这样,有人可以给我一个链接来阅读更多内容,因为我无法在网上找到有关它的解释。
答案 0 :(得分:3)
没有。这是没有意义的。您要么必须更改引用该表的每行代码,要么必须留下类似于具有与旧表完全相同的旧表名的视图。没有理智的人会这样做。此外,它并不像表格中有大量合理的名称,所以你做了一些疯狂的事情,比如说表A
存储客户数据,AA
存储雇主数据和{ {1}}是客户和雇主之间的交集。
SQL注入几乎可以简单地防止。使用带有绑定变量的预准备语句不要动态构建SQL语句。完成。当然,实际上,要确保新开发者不会因为他们不知道更好或者因为他们可以在更短的时间内破解某些东西而违反这个格言,如果他们只是做了一点点字符串连接使它更复杂一些。但基本方法很简单。
答案 1 :(得分:2)
Pffft。什么?经常更改表名?
这是一个虚假的建议,至于"阻止SQL注入"。
SQL注入漏洞的唯一预防措施是编写不易受攻击的代码。在绝大多数情况下,非常很容易做到。
更改表名并不会任何来关闭SQL注入漏洞。它可能使成功的攻击向量更不可重复,需要攻击者进行一些调整。但它 nothing 阻止SQL注入。
作为研究 SQL注入的起点,我建议 OWASP (打开Web应用程序安全项目)
从这里开始:https://www.owasp.org/index.php/SQL_Injection
如果您遇到"更改表名"作为缓解,请告诉我。我从未尝试过将其作为SQL Injection漏洞的预防或缓解措施。
答案 2 :(得分:1)
您可以采取以下措施来阻止SQL注入:
使用封装SQL调用的ORM,并为数据库记录提供友好的层。其中大部分都非常擅长编写高质量的查询,并且仅仅因为您使用它们而保护您免受注入错误。
尽可能使用预备语句和占位符值。写这样的查询:
INSERT INTO table_name (name, age) VALUES (:name, :age)
要非常小心,正确转义通过任何其他方法插入SQL的任何和所有值。这总是一件冒险的事情,所以你写的任何代码应该有任何逃避你做的非常明显,以便快速的代码审查可以验证它是否正常工作。永远不要隐藏在scrub
或clean
等可爱名称的抽象或方法之后逃避。这些方法可能会被巧妙地打破,你永远不会注意到。
绝对确定任何表格名称参数(如果是动态的话)与已知良好值的白名单进行比较。例如,如果您可以创建多个类型的记录,或者将数据放入多个表中,请确保提供的参数有效。
信任用户提供的无。假设每一位数据都被污染和恶意,除非你已经麻烦地清理它。如果您从其他来源获得数据库,例如继承历史项目,那么数据库中的任何内容都会加倍。偏执狂并非没有根据,这是预期的。
编写代码,以便删除行不会引入安全问题。这意味着永远不要这样做:
$value = $db->escaped(value);
$db->query("INSERT INTO table (value) VALUES ('$value')");
你离这里失败只有一条线路。如果必须执行此操作,请按以下方式编写:
$value_escaped = $db->escaped(value);
$db->query("INSERT INTO table (value) VALUES ('$value_escaped')");
这样删除执行转义的行不会立即导致注入错误。此处的默认设置为安全失败。
通过积极地对其进行防火并限制对实际需要访问的访问权限,尽一切努力阻止直接访问您的数据库服务器。实际上,这意味着阻止端口3306并使用SSH进行任何外部连接。如果可以,请取消SSH并使用安全的VPN连接到它。
永远不要生成错误,这些错误会显示通常包含对攻击者非常有用的信息的堆栈跟踪。例如,包含表名,脚本路径或服务器标识符的错误提供了太多信息。有这些用于开发,并确保在生产服务器上抑制这些消息。
随机更改表名完全没有意义,这将使您的代码成为一场噩梦。要保持所有代码与表在任何特定时刻所假定的随机名称同步,将非常困难。如果没有某种解码器实用程序,它还可以使备份和恢复数据几乎不可能。
任何建议这样做的人都会为已经解决的问题提出一个毫无意义的天真解决方案。
建议随机更改表名修复任何事情都表明对SQL注入错误的形式缺乏了解。知道表名是一件好事,它使你的生活更容易作为攻击者,但许多攻击不需要知道这一点。常见的攻击是通过在WHERE
条件中注入其他子句来强制以管理员身份登录,表名无关紧要。