gpt4 book ai didi

php $_GET 是否被解释为单引号或双引号字符串?

转载 作者:行者123 更新时间:2023-12-02 04:22:46 26 4
gpt4 key购买 nike

我假设 $_GET 变量被解释为单引号字符串(而不是双引号字符串)。

我相信这是真的,因为以下测试(我自己尝试进行目录遍历攻击):

$file = "../test.php";
/**
* same as file1 but using hexadecimal encoding, which is a feature
* only available to double quoted strings
* https://www.php.net/manual/en/language.types.string.php
*/
$file2 = "\x2e\x2e\x2ftest.php";

include $file1; // will succeed in my environment
include $file2; // will succeed in my environment

但是,如果我通过 $_GET 传递十六进制符号,它会失败,包括文件:


$file3 = $_GET["path"]; // (string) \x2e\x2e\x2ftest.php
include $file3; // will fail in my environment

所以我的问题是:$_GET 变量真的被解释为单引号字符串吗?(因为如果是这样,那么从用户输入中简单地删除两个连续的点可能会阻止任何目录遍历攻击)

如果是这样,它是否写在 php 手册中的任何地方?

最佳答案

简答:$_GET['path'] 是一个变量。只有在双引号中找到转义序列,PHP 才会解释转义序列,而不是在变量中。 -> Strings Manual .

$get = "\x2e";
var_dump($get);
//string(1) "."

$get = "\\"."x2e";
var_dump($get);
//string(4) "\x2e"

关于php $_GET 是否被解释为单引号或双引号字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58395670/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com