这意味着什么逃避一个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_slashes
, addcslashes
, quotemeta
等等,尽pipe你会发现当目标是运行一个安全的查询时,大部分开发者更喜欢mysql_real_escape_string
或者pg_escape_string
(在PostgreSQL的上下文中)。
某些字符对您正在使用的SQL数据库有特殊意义。 在查询中使用这些字符时,可能会导致意外的和/或意外的行为,包括允许攻击者危害您的数据库。 为了防止这些字符以这种方式影响查询,他们需要被转义,或者以不同的方式说出来,数据库需要被告知不要在这个查询中把它们当作特殊字符。
在mysql_real_escape_string()
的情况下,它会转义\x00
, \n
, \r
, \
, '
, "
和\x1a
,如果不逃避,可能会导致前面提到的问题,包括SQL注入MySQL数据库。