Я делаю предположение, что переменные $ _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?