我在这里看到一些人指出,使用串联查询mysql_real_escape_string
不会(完全)保护您免受SQL注入攻击。
但是,我还没有看到一个输入示例,该示例说明了mysql_real_escape_string
无法保护您免受攻击的攻击。大多数示例都忘记了mysql_query
仅限于一个查询并且使用mysql_real_escape_string
不正确。
我能想到的唯一示例如下:
mysql_query('DELETE FROM users WHERE user_id = '.mysql_real_escape_string($input));
这不会保护您免受以下输入的影响:
5 OR 1=1
我认为这是不正确的用法,mysql_real_escape_string
而不是缺点,它是为字符串而非数字值设计的。您应该转换为数字类型,或者如果要在消毒时将输入视为字符串,则应在查询中执行相同的操作,并在其周围引起双引号。
谁能提供一个mysql_real_escape_string
不依赖于数字值错误处理而又mysql_query
可以仅执行一个查询的输入示例吗?
编辑mysql_real_escape_string
。
mysql_real_escape_string
一般而言,或mysql_扩展名的主要缺点是,与其他更现代的API(尤其是准备好的语句)相比,要正确地应用它比较困难。mysql_real_escape_string
应该仅在一种情况下使用:转义用作引号之间SQL语句中的值的文本内容。例如:
$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
^^^^^^
mysql_real_escape_string
确保$value
上述上下文中的不会弄乱SQL语法。它不起作用,您可能会在这里想到:
$sql = "... `foo` = $value ...";
或在这里:
$sql = "... `$value` ...";
或在这里:
$sql = mysql_real_escape_string("... `foo` = '$value' ...");
如果将其应用于在除SQL语句中带引号的字符串之外的任何上下文中使用的值,它将被错误地使用,并且可能会或可能不会干扰所得的语法和/或允许某些人提交可能启用SQL注入攻击的值。的用例mysql_real_escape_string
非常狭窄,但很少能正确理解。
使自己陷入困境的另一种方法mysql_real_escape_string
是使用错误的方法设置数据库连接编码。你应该做这个:
mysql_set_charset('utf8', $link);
您 也 可以这样做:
mysql_query("SET NAMES 'utf8'", $link);
问题是后者绕过了mysql_
API,后者仍然认为您正在使用latin1
(或其他方式)与数据库进行通信。mysql_real_escape_string
现在使用时,它将假定错误的字符编码和转义字符串与数据库稍后解释它们的方式不同。通过运行SET NAMES
查询,您在mysql_客户端API如何处理字符串与数据库如何解释这些字符串之间创建了一条裂痕。这可以用于某些多字节字符串情况下的注入攻击。
mysql_real_escape_string
我知道, 如果正确应用 , 则 没有基本的注入漏洞 。
同样,主要问题是,错误地应用它非常容易,这会带来漏洞。
问题内容: 所以这是我们所有人都应该知道的事情,当我第一次看到它时就在我脑海中浮现。 我知道该版本从5.3开始弃用,但的实际区别是什么。 我以为那是完全一样的,除了需要为mysql资源提供第二个参数。 因此,我当时很好地认为,字符串的处理方式一定有所不同,因为不需要2个函数。 因此,我当时认为区别完全在于语言环境和字符编码。? 谁能为我解决这个问题? 问题答案: 不同之处在于,仅将字符串视为原始字
问题内容: 我正在使用PHP版本5.3并尝试在我的代码中使用,但是出现错误: 我仍然可以连接到数据库。为什么不可用? 我正在使用PHP版本5.3。 问题答案: 更新 中提到的评论,一直以来5.5弃用: 自PHP 5.5起不推荐使用mysql扩展。应该改用mysqli或PDO扩展名。否决已在mysql_deprecation中确定,可以在此找到对该决定背后原因的讨论。 并 在PHP 7中删除 。 是
问题内容: 即使在使用函数时,也有可能注入SQL吗? 考虑此示例情况。SQL是用PHP构造的,如下所示: 我听到很多人对我说,这样的代码仍然很危险,即使使用了函数也可能被黑。但是我想不出任何可能的利用方式? 像这样的经典注射: 不工作。 您是否知道上面的PHP代码会进行任何可能的注入? 问题答案: 考虑以下查询: 不会保护您免受此侵害。 在查询中的变量周围 使用单引号()的事实可以防止这种情况的发
问题内容: 是否有Java等价于PHP的mysql_real_escape_string()? 这是为了避免在将SQL注入尝试传递给Statement.execute()之前进行尝试。 我知道我可以改用PreparedStatement,但让我们假设这些只是一次声明,所以准备它们会导致性能降低。我已经将代码更改为使用PreparedStatement,但是考虑到现有代码的结构方式,escape()
问题内容: 有些人认为这样做存在一些缺陷,即使正确使用也无法保护您的查询。 带一些化石的物品作为证明。 因此,问题是:mysql [i] _real escape_string()完全不可接受吗? 还是仍然可以使用此功能来创建自己的预备语句? 请提供校对码。 问题答案: 从MySQL的C API函数描述 : 如果需要更改连接的字符集,则应使用函数而不是执行(或)语句。的工作方式类似,但也会影响所使
问题内容: 我很沮丧 我希望能够在数据库名称中插入单引号-例如O’Connor。 因此,当插入数据库时,我这样做: 然后,我将$ lname插入数据库。 在数据库中时,它显示为O 'Connor。 因此,如果要在Web应用程序中记住该姓氏,则必须使用: 这一切似乎都很好。但是,我有一个搜索功能,可以搜索姓氏并显示结果。当我搜索时,我必须搜索O 'Connor以获得任何结果。 您会发现,在搜索之