- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我们都知道我们应该使用准备好的语句或适当的替换/格式化规则来防止我们的应用程序中的 sql 注入(inject)。
但是,当查看 MySQL 的字 rune 字列表时,我注意到它包含以下字符:
\0
一个 ASCII NUL (0x00
) 字符。\'
单引号 ('
) 字符。\"
双引号 ("
) 字符。\b
一个退格字符。\n
换行符。\r
一个回车符。\t
制表符。\Z
ASCII 26 (Ctrl+Z)。请参阅表格后的注释。\\
一个反斜杠 (\
) 字符。\%
%
字符。\_
_
字符。现在,虽然 %
和 _
字符需要转义,以防止将不需要的通配符注入(inject) LIKE 语句,而 '
(单引号)、\
(反斜杠)和 "
(双引号)都需要转义以防止注入(inject)任意 SQL - 可以有任何这些未转义的其他字符直接导致 SQL 注入(inject)漏洞,否则不会存在?有没有人有任何此类漏洞利用的真实示例?
假设我们正在构建我们的查询:
SELECT * FROM users WHERE username='$user'
$user
是否有任何值,其中唯一未转义的字 rune 字是 \b
(退格键)、\0
( NUL)、\n
(换行)、\r
(换行)、\t
(制表符)或 \Z
(Ctrl+Z) 允许将任意 SQL 注入(inject)此查询?
最佳答案
考虑 mysql_real_escape_string() 中的以下行手册:
MySQL requires only that backslash and the quote character used to quote the string in the query be escaped. mysql_real_escape_string() quotes the other characters to make them easier to read in log files.
MySQL 中的 SQL 注入(inject)不应该单独使用这些特殊字符:\b
\0
\n
\r
\t
\Z
.
然而,字符串文字手册指出以下但指定(或不指定)的原因与 SQL 注入(inject)无关:
If you want to insert binary data into a string column (such as a BLOB column), you should represent certain characters by escape sequences. Backslash (“\”) and the quote character used to quote the string must be escaped. In certain client environments, it may also be necessary to escape NUL or Control+Z. The mysql client truncates quoted strings containing NUL characters if they are not escaped, and Control+Z may be taken for END-OF-FILE on Windows if not escaped.
此外,在一个简单的测试中,不管上面列出的特殊字符是否被转义,MySQL 产生了相同的结果。换句话说,MySQL 甚至不介意:
$query_sql = "SELECT * FROM `user` WHERE user = '$user'";
对于上面列出的字符的非转义和转义版本,上述查询的工作方式类似,如下所示:
$user = chr(8); // Back Space
$user = chr(0); // Null char
$user = chr(13); // Carriage Return
$user = chr(9); // Horizontal Tab
$user = chr(26); // Substitute
$user = chr(92) .chr(8); // Escaped Back Space
$user = chr(92) .chr(0); // Escaped Null char
$user = chr(92) .chr(13); // Escaped Carriage Return
$user = chr(92) .chr(9); // Escaped Horizontal Tab
$user = chr(92) .chr(26); // Escaped Substitute
简单测试中使用的测试表和数据:
-- Table Structure
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(10) CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- Table Data
INSERT INTO `user` ( `user` ) VALUES
( char( '8' ) ),
( char( '0' ) ),
( char( '10' ) ),
( char( '13' ) ),
( char( '9' ) ),
( char( '26' ) );
关于mysql - 哪些字符实际上能够导致 MySQL 中的 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14370670/
我正在使用 Java 编写一个时钟程序,该程序能够“滴答作响”,但它存在问题。我认为它与 getter 和 setter 或 toString() 方法有关。 计数器类 package clock;
const Index = () => { // Ref Links const frefLinks = { 1: useRef(1), 2: useRef(2), 3: useRef(3
所以我读了here不能 pickle 装饰函数。确实: import multiprocessing as mp def deco(f): def wrapper(*args, **kwarg
我在go1.11.2 linux/amd64 版本。当包godog使用 go get github.com/DATA-DOG/godog/ 安装,godog 可执行文件在 $GOPATH/bin/中创
如何正确压缩字符串,以便 PHP 能够解压缩? 我试过这个: public static byte[] compress(String string) throws IOException {
我们这里的问题是表明 在测试中使用 Kleene 代数。 在 b 的值由 p 保留的情况下,我们有交换条件 bp = pb;两个程序之间的等价性简化为等式 在 b 的值不被 p 保留的情况下,我们有交
我有一个与我的网络相关的非常奇怪的问题,我在具有多个接口(interface)的 VirtualBox 上安装了 RDO Grizzly OpenStack。 虚拟盒子: eth0 - managem
我正在尝试使用 Passport.js授权谷歌OAuth2在 Node.js .我整个星期都在尝试让它工作,但不知道为什么它不工作,所以现在我求助于 stack 寻求一些潜在的帮助。我已经尝试了所有在
我是一名优秀的程序员,十分优秀!