这意味着什么逃避一个string?

我正在阅读$ _SESSION ['username']是否需要在进入SQL查询之前转义? 它说:“你需要转义每一个string,你传递给SQL查询,不pipe它的起源”。 现在我知道这样的事情是非常基本的。 Google的search结果超过了20,000。 单独的Stackoverflow有20页的结果,但没有人实际解释了逃避一个string是或如何做到这一点。 这只是假设。 你可以帮我吗? 我想学习,因为我一直在用PHP制作一个networking应用程序。

我已经看过: 插入转义字符 , Java中的所有转义字符是什么? ,不能使用addcslashes() , escapestring , mysql_real_escape_string()真的做什么? , 我怎样才能从一个string在PHP中的双引号? , MySQL_real_escape_string不添加斜杠? , 从PHPstring中删除转义序列我可以继续,但我相信你明白了。 这不是懒惰。

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

"Hello World." 

但是如果我的string里有双引号呢?

 "Hello "World."" 

现在我含糊不清 – 解释者不知道我的string在哪里结束。 如果我想保留双引号,我有几个选项。 我可以在我的string周围使用单引号:

 'Hello "World."' 

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

 "Hello \"World.\"" 

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

当涉及到查询时,MySQL有一些关键字,我们不能在查询中使用它,而不会造成混淆。 假设我们有一个列的名称为“Select”的值表,我们想要select:

 SELECT select FROM myTable 

我们现在已经在我们的查询中引入了一些不明确之处。 在我们的查询中,我们可以通过使用back-tick来减less模糊性:

 SELECT `select` FROM myTable 

这消除了我们在select字段名称时使用差的判断而引入的混乱。

只需通过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)); 

还有其他一些逃避string的方法,比如add_slashesaddcslashesquotemeta等等,尽pipe你会发现当目标是运行一个安全的查询时,大部分开发者更喜欢mysql_real_escape_string或者pg_escape_string (在PostgreSQL的上下文中)。

某些字符对您正在使用的SQL数据库有特殊意义。 在查询中使用这些字符时,可能会导致意外的和/或意外的行为,包括允许攻击者危害您的数据库。 为了防止这些字符以这种方式影响查询,他们需要被转义,或者以不同的方式说出来,数据库需要被告知不要在这个查询中把它们当作特殊字符。

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