使用这个PHP函数逃避是不安全的?

时间:2009-10-19 08:31:47

标签: php escaping sql-injection

如果我使用

转义数据
addcslashes($input,chr(0x00) . chr(0x0d) . chr(0x0a) . chr(0x1a) . chr(0x5c) . chr(0x27) . chr(0x22));

这足以阻止SQLi吗?我有所有必需的字符,所以,只要$ input是UTF-8,就不会有问题本身。当然无效使用该方法或类似的东西可能会导致SQLi。我正在使用它,因为我想在不连接数据库的情况下逃脱,我知道我的输入是UTF-8,如果不是,我将其转换。

3 个答案:

答案 0 :(得分:4)

  

我正在使用它,因为我想在不连接数据库的情况下逃脱

对于MySQL的特定情况,根本不可能。在建立连接之前,PHP不知道使用什么字符编码与数据库通信,因此它不知道字符串中的哪个'字节对应于'个字符。如果您的连接始终是UTF-8,那么您将是安全的,但如果该代码部署在默认为Shift-JIS的服务器上,则可能会错误地转义部分字符'字节导致 SQL注入,之前没有。

对于其他数据库,这是错误的完全逃避; ANSI SQL和大多数DBMS使用加倍''来表示字符串文字中的撇号,并且不会转义任何其他字符。 MySQL也可以通过NO_BACKSLASH_ESCAPES配置选项支持这一点;再次,PHP无法知道该选项是否在进行连接之前正在使用。

答案 1 :(得分:1)

更好的选择是使用内置的filter方法,并且如上所述,专用于防止注入的功能。除了所有这些之外,您还可以使用预准备语句。不要试图依靠你自己的这样的消毒尝试 - 有日常使用的经过试验和测试的常用功能,如果你发现它们的错误或缺陷,请务必告诉我们。

答案 2 :(得分:0)

如果您正在使用MySQL函数库,documentation强烈建议您使用他们的方法来清理数据库输入。

  

[mysql_real_escape_string]必须始终(少数例外)在向MySQL发送查询之前使数据安全。

编辑:我知道您不想先连接到数据库来执行此操作;但是,这被PHP视为最佳实践。 @ Bobince的答案解释了为什么会出现这种情况的细节