На первый взгляд кажется, что вы идете по несколько странному пути написания системы входа в систему. Я не уверен, что простые текстовые файлы в каталоге в файловой системе - это разумный путь, если не по какой-либо другой причине, кроме как ненормальной, и вы, скорее всего, пропустите многие тонкости, которые уже продуманы при более распространенной аутентификации системы. Например, если вы хотите хранить хэшированные и соленые пароли, вам нужно подумать о том, как реализовать это в вашей схеме, и вы можете ошибиться, что приведет к проблеме безопасности. Однако использование хорошей библиотеки PEAR или даже компонента Zend_Auth из Zend Framework даст вам четкую и хорошо документированную отправную точку.
В любом случае, если у вас есть причины для соглашения, которое вы описываете в своем вопросе, функция basename (), скорее всего, то, что вам нужно в этом случае. Он удалит все, кроме имени файла, так что они не смогут атаковать каталог, как вы описали в своем вопросе.
Так что, если ввод от пользователя:
.. / .. / важный
Вы можете запустить:
$cleanUsername = basename($input);
$filename = '/path/to/password/files/' . $cleanUsername . '.txt';
if (file_exists($filename)) {
[...]
}
Имеет смысл?