一种攻击方法是“加载”攻击。
首先,您将用户名、银行转账消息等注入其中
转移0.01
至:02020.020202.200202
名称:johnny table';drop table foobar --
将被逃逸到
johnny tables\';drop table foobar --
到目前为止,一切都很好。保护生效。我们的附加失败了。我们尝试加载攻击。
现在我们要做一个预定的付款订单。
这是假设发生了一个常见错误,即一旦插入数据库,该值就是“安全的”,因为它已经被检查过一次。
转移0.01
至:02020.020202.200202
名称:johnnytables';drop table foobar--
日程:1天后
将订单存储在数据库中
'johnny tables\';drop table foobar--'
将被存储为
约翰尼表';删除表 foobar--
现在,在午夜,调度程序启动并开始迭代预定的付款
select name from scheduled where time > x and < y
所以银行代码开始被压缩
String name = result['name'];
String acct = result['acct'];
String amt = result['amt'];
string query = "insert into payment_process (name,acct,amt) values('"+name+"','"+acct+"','"+amt+"');
砰,你的桌子掉了。*
当您采用手动路线时,您必须确保变量的所有、每个实例都被转义,所有 unicode 字符都被考虑在内,数据库引擎的所有特殊行为都被考虑在内。
此外,使用准备好的语句可以显着提高速度,因为您不必重建查询。您只需构建一次,将它们存储在缓存中,然后交换参数即可。
特别是在迭代大型列表时,它们是天赐之物。
根本问题是他可能不理解准备好的语句,不理解get他们如何工作。不安全感的触发可能会导致某种方式的攻击性和保护性,甚至是狂热,只是为了阻止承认你只是不知道它们是如何运作的。
尝试与他谈谈这件事,如果他不想听理由,请去找他的经理并解释问题,并且如果网站/应用程序被黑客攻击,这将由您的同事和您的同事承担经理,并告诉他风险是巨大的。以最近的黑客攻击为例,像 swift 黑客攻击一样,大量资金被盗。
*
实际上可能不起作用,取决于实际的查询、连接、联合等。这是一个非常简单的例子