转义字符串是什么意思?


84

我在阅读$ _SESSION ['username']进入SQL查询之前是否需要转义?它说:“无论源如何,都需要转义传递给sql查询的每个字符串”。现在我知道类似这样的事情确实很基础。Google搜索显示超过20,000个结果。仅Stackoverflow就有20页的结果,但是没有人真正说明转义字符串是什么或如何转义。只是假设。你能帮助我吗?我想学习,因为我一如既往地使用PHP制作网络应用。

我看过: 插入转义字符Java中所有的转义字符是什么?,不能 使用addcslashes()转义字符串转义字符mysql_real_escape_string()的作用是什么?如何在php中的字符串中转义双引号?MySQL_real_escape_string不添加斜杠?, 我可以继续从php中的字符串中删除转义序列,但是我确定你明白了。这不是懒惰。


10
PS,我本可以问一个朋友,而不是自欺欺人,但我认为会有很多人像我一样,想知道每个人都在谈论什么。
布雷特(Brett)2012年

Answers:


136

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

"Hello World."

但是,如果我的字符串中包含双引号怎么办?

"Hello "World.""

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

'Hello "World."'

或者我也可以避免引用:

"Hello \"World.\""

任何带斜杠的引号是 转义,并应理解为字符串值的一部分。

当涉及查询时,MySQL会监视某些关键字,这些关键字我们不能在查询中使用而不会引起混淆。假设我们有一个值表,其中一列被命名为“选择”,我们想选择该值:

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,和更多的,但你会发现,当我们的目标是运行安全的查询,由大开发商喜欢mysql_real_escape_stringpg_escape_string(在PostgreSQL中的上下文。


6
应该注意的是,执行字符串转义以解决SQL Injection的问题被认为是不好的做法,如果执行不当(尤其是在处理某些类型的格式错误的多字节字符攻击时尤其容易),则很容易导致安全问题。出于这个原因,请不要使用字符串转义,而应使用参数化的sql查询或存储过程。
Cheekysoft

22

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

在的情况下mysql_real_escape_string(),它避开\x00\n\r\'"\x1a作为这些中,当没有逃脱,可引起前面提到的问题,其包括与一个MySQL数据库的SQL注入。


1

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

例如,在解释此语句时:

$txt = "Hello world!";

在词法分析阶段(或当分裂的语句转换成单独的标记),这些将是令牌识别 $txt="Hello world!",和;

但是,字符串中的反斜杠会导致额外的标记集,并被解释为使用紧随其后的字符进行操作的命令:例如

$txt = "this \" is escaped";

结果在以下的标记: $txt="this\"is escaped",和;

解释器已经知道(或具有可以采用的预设路线)基于后继\令牌的字符做什么。因此,在这种情况下,"它将继续将其视为字符而不是字符串结尾命令。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.