可以使用WAF阻止正常的基于UNION的SQL注入,WAF会过滤UNION, SELECT
之类的关键字。但我认为可以通过SQL的内联注释语句绕过它,例如/*!UNION*/
和/*!SELECT*/
评论声明仅用于阅读目的,对吧?如果是这样,SQL服务器如何在注释中读取注入查询并执行它?
答案 0 :(得分:1)
使用WAF过滤关键字毫无意义。它无法成功。看看这个绕过它的方法列表:http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/(我在谷歌的短短几秒内发现了这个链接。)
如果代码写得正确,则没有必要。
至于你的问题,MySQL的/*!
语法是针对MySQL特定命令的。它旨在让您能够编写可移植的SQL(可以在任何数据库上运行),但仍然能够发送MySQL特殊命令。
答案 1 :(得分:0)
如果您使用支持数据占位符的数据库驱动程序,那么SQL注入根本不应成为问题。你试图用事后检测做的事情是徒劳的,比如试图用蹩脚的苍蝇拍消除蟑螂的侵扰。你不可能全部拿到它们。
最佳做法是确保首先无法将恶意数据注入您的查询。有many examples available on Booby Tables说明如何正确执行此操作。
答案 2 :(得分:0)
通过不关闭部分查询来注释部分查询可用于绕过黑名单,删除空格,混淆和确定数据库版本。
您提到的是MySQL的一种特殊注释语法。如果将代码放入此注释中,它将仅在MySQL中执行。此外,仅当服务器高于提供的版本时,您才可以使用它执行一些代码。例如:
经典内联注释SQL注入攻击示例
async ngOnInit() {
Promise.all([
await faceapi.nets.tinyFaceDetector.loadFromUri('./models'),
await faceapi.nets.faceLandmark68Net.loadFromUri('./models'),
await faceapi.nets.faceRecognitionNet.loadFromUri('./models'),
await faceapi.nets.faceExpressionNet.loadFromUri('./models')
]).then(() => {
this.startVideo();
})
}
如果MySQL版本高于3.23.02,您将得到相同的响应