如果我使用
转义数据addcslashes($input,chr(0x00) . chr(0x0d) . chr(0x0a) . chr(0x1a) . chr(0x5c) . chr(0x27) . chr(0x22));
这足以阻止SQLi吗?我有所有必需的字符,所以,只要$ input是UTF-8,就不会有问题本身。当然无效使用该方法或类似的东西可能会导致SQLi。我正在使用它,因为我想在不连接数据库的情况下逃脱,我知道我的输入是UTF-8,如果不是,我将其转换。
答案 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的答案解释了为什么会出现这种情况的细节