转义字符串是什么意思


What does it mean to escape a string?

我在读 $_SESSION['用户名'] 在进入 SQL 查询之前需要转义吗? 它说"你需要转义你传递给sql查询的每个字符串,无论其来源如何"。现在我知道这样的事情真的很基本。谷歌搜索出现了超过20, 000个结果。仅 Stackoverflow 就有 20 页的结果,但没有人真正解释什么是转义字符串或如何做到这一点。这只是假设。你可以帮我吗?我想学习,因为我一如既往地用PHP制作一个Web应用程序。

我看过:插入转义字符,Java中所有的转义字符是什么?无法转义带有 addcslashes(( 的字符串,转义字符,mysql_real_escape_string(( 到底是做什么的?如何在 php 中从字符串中转义双引号?MySQL_real_escape_string不添加斜杠?从 PHP 中的字符串中删除转义序列我可以继续,但我相信你明白这一点。这不是懒惰。

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

"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等,尽管您会发现当目标是运行安全查询时,开发人员总体上更喜欢mysql_real_escape_stringpg_escape_string(在PostgreSQL的上下文中(。

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

mysql_real_escape_string()的情况下,它会'x00'n'r''"'x1a进行转义,因为这些如果不转义,可能会导致前面提到的问题,包括MySQL数据库的SQL注入。

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

例如,在解释本声明时:

$txt = "Hello world!";

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

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

$txt = "this '" is escaped";

生成以下令牌: $txt="this'"is escaped";

解释器已经知道(或具有可以采用的预设路由(根据'标记后面的字符要做什么。因此,在"的情况下,它继续将其视为字符,而不是字符串结尾命令。