3

我遇到了一种在 POST 参数值中仅对以下 4 个字符进行编码的方法:# ; & +. 如果有的话,它会导致什么问题?

我个人不喜欢这样的黑客。我问这个问题的原因是我和它的发明者发生了争执。

更新。澄清一下,这个问题是关于POST 正文中的编码参数,而不是关于在服务器端转义 POST 参数,例如在将它们输入外壳、数据库、HTML 页面或其他任何东西之前。

4

3 回答 3

1

rfc1738(如果您使用application/x-www-form-urlencoded编码传输数据):

不安全:

由于多种原因,字符可能不安全。空格字符是不安全的,因为当 URL 被转录或排版或接受文字处理程序的处理时,重要的空格可能会消失,并且可能会引入无关紧要的空格。字符“<”和“>”是不安全的,因为它们被用作自由文本中 URL 的分隔符;引号 (""") 在某些系统中用于分隔 URL。字符 "#" 是不安全的,应始终进行编码,因为它在万维网和其他系统中用于将 URL 与片段/锚定分隔开可能跟随它的标识符。字符“%”是不安全的,因为它用于其他字符的编码。其他字符是不安全的,因为已知网关和其他传输代理有时会修改这些字符。这些字符是“{”、“}”、“|”、“\”、“^”、“~”、“[”、“]”和“`”。

所有不安全的字符必须始终在 URL 中进行编码。例如,即使在通常不处理片段或锚标识符的系统中,字符“#”也必须在 URL 中编码,因此如果将 URL 复制到另一个使用它们的系统中,则无需更改网址编码。

于 2010-02-26T22:47:14.977 回答
0

通常(总是?)转义元字符是为了防止注入攻击。不同的系统具有不同的元字符,因此每个系统都需要自己的防止注入的方法。不同的系统有不同的转义字符的方法。有些系统不需要转义字符,因为它们有不同的控制和数据通道(例如准备好的语句)。此外,通常最好在将数据引入系统时执行过滤。

最大的问题是只转义这四个字符不会提供完整的保护。过滤您提到的四个字符后,仍然可以进行 SQL、HTML 和 shell 注入攻击。

于 2010-02-26T21:14:51.010 回答
0

考虑一下:$sql ='DELETE * fromarticles WHEREid='.$_POST['id'].';
然后输入以下表格:1' OR '10
然后变成这样:$sql ='DELETE * fromarticles WHEREid='1' OR '10';

于 2010-02-26T21:21:45.053 回答