转义字符串是啥意思?
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_slashes
、addcslashes
、quotemeta
等,但您会发现,当目标是运行安全查询时,大部分开发人员更喜欢@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
、"
和;
解释器已经知道(或者已经预设了它可以采取的路线)根据\
标记之后的字符要做什么。因此,在"
的情况下,它继续将其视为一个字符,而不是作为字符串结尾的命令。
【讨论】:
以上是关于转义字符串是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章