转义字符串是什么意思?

2022-08-30 07:37:41

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

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


答案 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));

存在其他用于转义字符串的方法,例如,,,等,尽管您会发现,当目标是运行安全查询时,开发人员通常更喜欢or(在PostgreSQL的上下文中。add_slashesaddcslashesquotemetamysql_real_escape_stringpg_escape_string


答案 2

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

在它转义的情况下,,,, ,,并且由于这些,如果不转义,可能会导致前面提到的问题,其中包括MySQL数据库的SQL注入。mysql_real_escape_string()\x00\n\r\'"\x1a


推荐