使用 rawurlencode() 对 url 中的参数值进行编码,可以防止注入攻击。该函数会将输入字符串中所有非保留字符(字母、数字、-、_、.、~)原样保留,其余字符转换为十六进制格式并加上百分号前缀,从而确保用户输入不会破坏 url 结构或引入恶意指令。

rawurlencode() 如何处理特殊字符?
rawurlencode() 遵循 RFC 3986 标准,将空格转为 %20,加号转为 %2B,斜杠转为 %2F,其他特殊符号如 #、& 等也按规则转义。这种处理方式保证了参数值在 URL 中作为独立单元存在,不会被解析器误读为分隔符或控制字符。

$input = "hello world & test"; echo rawurlencode($input); // 输出: hello%20world%20%26%20test
上述代码展示了普通字符串经过编码后的结果。空格变为 %20,& 符号变为 %26。这种转换是确定性的,相同的输入总是产生相同的输出,便于后续解码还原。
立即学习“PHP免费学习笔记(深入)”;
与 urlencode() 的区别是什么?
urlencode() 是旧版 PHP 提供的函数,它将空格编码为 +,而 rawurlencode() 将其编码为 %20。在构建查询字符串时,两者均可用于表单数据,但在构造路径段或完整 URL 时,推荐使用 rawurlencode() 以符合现代 Web 标准。

$query = "name=John Doe"; echo urlencode($query); // name=John+Doe echo rawurlencode($query); // name=John%20Doe
对比显示,urlencode() 使用加号表示空格,这在某些上下文中可能引起歧义。例如,如果服务器端期望严格遵循 RFC 3986,加号可能被解释为字面量而非空格。因此,在处理非表单数据的 URL 组件时,应优先选择 rawurlencode()。
如果输入包含已编码的百分号会怎样?
当输入字符串中已经包含百分号(如 %20)时,rawurlencode() 会再次对其进行编码,变成 %2520。这是因为函数无法区分哪些百分号是原始数据的一部分,哪些是预编码的结果。它始终对所有非安全字符执行转义操作,包括百分号本身。
$encoded_input = "hello%20world"; echo rawurlencode($encoded_input); // 输出: hello%2520world
这一行为意味着,如果你需要对已经编码过的数据进行二次编码,必须意识到百分号会被进一步转义。在实际应用中,应避免对同一数据进行多次编码,除非有明确的协议要求。若需解码,可使用对应的 rawurldecode() 函数,它会逐层还原编码内容。



















