为了账号安全,请及时绑定邮箱和手机立即绑定

逃避一个字符串是什么意思?

/ 猿问

逃避一个字符串是什么意思?

慕粉4167745 2019-09-02 09:51:21

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


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


查看完整描述

2 回答

?
慕慕森

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


"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_slashes,addcslashes,quotemeta,和更多的,但你会发现,当我们的目标是运行安全的查询,由大开发商喜欢mysql_real_escape_string或pg_escape_string(在PostgreSQL中的上下文。


查看完整回答
反对 回复 2019-09-02
?
拉风的咖菲猫

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

在的情况下mysql_real_escape_string(),它避开\x00\n\r\'"\x1a作为这些中,当没有逃脱,可引起前面提到的问题,其包括与一个MySQL数据库的SQL注入。


查看完整回答
反对 回复 2019-09-02

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信