- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
昨晚我正在阅读有关防止 SQL 注入(inject)的内容,我遇到了这个答案:
How can I prevent SQL injection in PHP?
来自“你的常识”的评论听起来像是功能失调/不安全。然而,在我的(虽然有限的)测试中,我发现 php 的“bin2hex($var)”可以处理我扔给它的任何东西 - 文字数字,数字字符串,文本字符串 - 即使匹配数字(tinyint)列。
我的问题是:当每个用户输入都通过十六进制处理时,有没有办法注入(inject) SQL?本质上,任何时候进行查询,它看起来都是这样的:
$query="SELECT * FROM table WHERE someidentifier=UNHEX('".bin2hex($unsafe_user_input)."') LIMIT 1"
基本上翻译成:
SELECT * FROM table WHERE someidentifier=UNHEX('0b99f') LIMIT 1
这种类型的安全性是否存在漏洞?
PS - 我不只是在寻找诸如“为什么不将 PDO 或 MySQLi 与准备好的语句一起使用?”之类的答案。它可能属于先发制人优化的巨大邪恶,但我宁愿不加倍我的查询开销(是的,我知道它可以更快地处理多个相同的查询,但这不是我经常遇到的情况)。
最佳答案
Is there a way to inject SQL when every user input is sanitized via hexing it?
如果您知道为什么会发生 SQL 注入(inject),您就可以自己回答这个问题。
让我们看看。 CWE describes SQL injections (CWE-89)如下:
The software constructs all or part of an SQL command using externally-influenced input […], but it does not neutralize or incorrectly neutralizes special elements that could modify the intended SQL command […]
此外:
Without sufficient removal or quoting of SQL syntax in user-controllable inputs, the generated SQL query can cause those inputs to be interpreted as SQL instead of ordinary user data.
所以基本上:生成的 SQL 查询中受外部影响的输入未按预期解释。这里的重要部分是:未按预期解释。
如果用户输入旨在被解释为 MySQL string literal但它不是,它是一个 SQL 注入(inject)。但为什么会这样?
嗯,string literals有特定的语法,SQL 解析器通过这些语法来识别它们:
A string is a sequence of bytes or characters, enclosed within either single quote (“
'
”) or double quote (“"
”) characters.
另外:
Within a string, certain sequences have special meaning […]. Each of these sequences begins with a backslash (“
\
”), known as the escape character. MySQL recognizes the escape sequences shown in Table 9.1, “Special Character Escape Sequences”.
此外,为了能够在字符串文字中使用引号:
There are several ways to include quote characters within a string:
- A “
'
” inside a string quoted with “'
” may be written as “''
”.- A “
"
” inside a string quoted with “"
” may be written as “""
”.- Precede the quote character by an escape character (“
\
”).- A “
'
” inside a string quoted with “"
” needs no special treatment and need not be doubled or escaped. In the same way, “"
” inside a string quoted with “'
” needs no special treatment.
由于后面提到的所有这些序列对于字符串文字都是特殊的,因此有必要对任何旨在解释为字符串文字的数据进行适当处理以符合这些规则。这尤其意味着:如果要在字符串文字中使用上述任何字符,则必须按照上述方式之一编写。
因此,如果您从这个角度来看,这甚至不是安全问题,而只是处理数据以便按预期解释数据。
这同样适用于其他文字以及 SQL 的其他方面。
那么你的问题呢?
My question is this: Is there a way to inject SQL when every user input is sanitized via hexing it? In essence, any time a query was made, it would look something like this:
$query="SELECT * FROM table WHERE someidentifier=UNHEX('".bin2hex($unsafe_user_input)."') LIMIT 1"
是的,这样可以避免 SQL 注入(inject)。 bin2hex
返回仅包含十六进制字符的字符串。在 MySQL 字符串文字中使用这些字符时,它们都不需要特殊处理。
但严肃地说,当存在提供参数化/准备语句等方便技术的库和框架时,为什么有人要使用这些繁琐的格式化技术?
关于php - 十六进制输入是否足以清理 SQL 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22567944/
我是一名优秀的程序员,十分优秀!