转义字符串是啥意思?

Posted

技术标签:

【中文标题】转义字符串是啥意思?【英文标题】:What does it mean to escape a string?转义字符串是什么意思? 【发布时间】:2012-05-25 15:28:52 【问题描述】:

我正在阅读Does $_SESSION['username'] need to be escaped before getting into an SQL query?,它说“您需要转义传递给 sql 查询的每个字符串,无论其来源如何”。现在我知道这样的事情真的很基本。谷歌搜索出现了超过 20,000 个结果。仅 *** 就有 20 页的结果,但没有人真正解释什么是转义字符串或如何进行转义。这只是假设。你能帮助我吗?我想学习,因为我一如既往地使用 php 制作 Web 应用程序。

我看过: Inserting Escape Characters, What are all the escape characters in Java?, Cant escape a string with addcslashes(), Escape character, what does mysql_real_escape_string() really do?, How can i escape double quotes from a string in php?, MySQL_real_escape_string not adding slashes?, remove escape sequences from string in php 我可以继续说下去,但我相信你明白了。这不是懒惰。

【问题讨论】:

PS 我本来可以问一个朋友而不是自欺欺人,但我想会有很多人和我一样想知道每个人都在谈论的东西是什么。 【参考方案1】:

转义字符串意味着减少该字符串中使用的引号(和其他字符)中的歧义。例如,当您定义一个字符串时,通常用双引号或单引号将其括起来:

"Hello World."

但是如果我的字符串中有双引号呢?

"Hello "World.""

现在我有歧义 - 解释器不知道我的字符串在哪里结束。如果我想保留我的双引号,我有几个选择。我可以在我的字符串周围使用单引号:

'Hello "World."'

或者我可以逃避我的报价:

"Hello \"World.\""

任何以斜线开头的引号都被转义,并被理解为字符串值的一部分。

当涉及到查询时,MySQL 会监视某些关键字,我们不能在查询中使用这些关键字,否则会造成一些混乱。假设我们有一个值表,其中一列名为“Select”,我们想选择它:

SELECT select FROM myTable

我们现在在查询中引入了一些歧义。在我们的查询中,我们可以通过使用反引号来减少这种歧义:

SELECT `select` FROM myTable

这消除了我们在选择字段名称时使用错误判断所引入的混淆。

只需将您的值传递给mysql_real_escape_string(),就可以为您处理很多事情。在下面的示例中,您可以看到我们通过此函数传递用户提交的数据,以确保它不会对我们的查询造成任何问题:

// Query
$query = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

还有其他方法用于转义字符串,例如add_slashesaddcslashesquotemeta 等,但您会发现,当目标是运行安全查询时,大部分开发人员更喜欢@987654333 @ 或 pg_escape_string(在 PostgreSQL 的上下文中。

【讨论】:

需要注意的是,执行字符串转义来解决 SQL 注入问题被认为是不好的做法,如果执行不当很容易导致安全问题(尤其是在处理某些类型的格式错误的多线程时)字节字符攻击)。出于这个原因,请不要使用字符串转义,而是使用参数化的 sql 查询或存储过程。 “任何以斜线开头的引号都会被转义”。其实是反斜杠?【参考方案2】:

某些字符对您使用的 SQL 数据库具有特殊含义。在查询中使用这些字符时,它们可能会导致意外和/或意外行为,包括允许攻击者破坏您的数据库。为了防止这些字符以这种方式影响查询,需要对它们进行转义,或者换一种说法,需要告知数据库不要将它们视为此查询中的特殊字符。

mysql_real_escape_string() 的情况下,它会转义 \x00\n\r\'"\x1a,因为这些在未转义时会导致先前提到的问题包括使用 MySQL 数据库进行 SQL 注入。

【讨论】:

【参考方案3】:

为简单起见,您基本上可以将反斜杠“\”想象为运行时对解释器的命令。

例如在解释这句话时:

$txt = "Hello world!";

在词法分析阶段(或将语句拆分为单独的标记时)这些将是识别的标记 $txt="Hello world!";

但是,字符串中的反斜杠会产生一组额外的标记,并被解释为对紧随其后的字符执行某些操作的命令: 例如

$txt = "this \" is escaped";

产生以下标记: $txt="this\"is escaped";

解释器已经知道(或者已经预设了它可以采取的路线)根据\ 标记之后的字符要做什么。因此,在" 的情况下,它继续将其视为一个字符,而不是作为字符串结尾的命令。

【讨论】:

以上是关于转义字符串是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

&nbsp是啥意思删了有影响吗

java 转义符是啥?起啥用?怎么用?

请问split("\\.")是啥意思?(JAVA代码)

java中的转义字符的作用是啥?

java 中的空格的转义字符是啥

任意定界符/转义字符处理的最佳算法是啥?