我读不$ _SESSION [“用户名”]需要进入一个SQL查询之前进行转义? 它说:“你需要逃避每次传递给SQL查询字符串,不管它的起源”。 现在我知道这样的事情实在是基本的。 谷歌搜索打开了超过20万次的结果。 计算器独自砍下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 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_slashes
, addcslashes
, quotemeta
,更多的,虽然你会发现,当我们的目标是运行安全的查询,由大开发商宁愿mysql_real_escape_string
或pg_escape_string
(PostgreSQL中的上下文。
某些字符具有特殊含义正在使用的SQL数据库。 当在查询中使用这些字符,他们可能会导致意外和/或意外行为,包括允许攻击者危害您的数据库。 为了防止这些字符以影响这种方式,它们需要进行转义,或者说,它以不同的方式查询,数据库需要被告知没有把他们在此查询为特殊字符。
在的情况下mysql_real_escape_string()
它避开\x00
, \n
, \r
, \
, '
, "
和\x1a
,因为这些中,当没有逃脱,可引起前面提到的问题,其包括与一个MySQL数据库的SQL注入。