#php #escaping
#php #экранирование
Вопрос:
У меня есть файл на моем сервере, к которому я хочу получить доступ. Имя файла является ken's book.doc
Но в моей базе данных она была сохранена как ken's book.doc
(Я исправил проблему с обратной косой чертой, но все еще испытываю проблемы с доступом к ранее загруженным файлам на сервере.
Я использовал addslashes для добавления обратной косой черты, но она отображается как: ken/'s book.doc
(это прямая косая черта вместо обратной.
Я использовал:
str_replace("'", "'", $filename);
тем не менее, она отображается как косая черта.
Как я могу это исправить?
Спасибо
Редактировать
Дополнительная информация: Я использую новое значение как часть ссылки. это:
<a href="<?php echo str_replace("'", "'", $filename);?>">View</a>
Комментарии:
1. Какую платформу и версию php вы используете?
2. Имя файла
"ken's book.doc"
? Я почему-то сомневаюсь в этом. Для меня это не имеет смысла.3. да, исходное имя файла — ken’s book.doc кажется, magic quotes был включен, и он добавил косые черты
4. @Tomalak Имена файлов, по-видимому, могут содержать обратную косую черту в файловых системах unix, но, вероятно, их нужно заключить в кавычки. Смотрите ссылку. @Ogugua Если
str_replace("'", "'", $filename);
возвращает строку с косой чертой, то$filename
для начала она должна была содержать косую черту.5. @Tomalak , уверен, что косой черты нет. @Ancide, пожалуйста, добавил дополнительную информацию в мой пост
Ответ №1:
Если у вас есть имя файла, содержащее обратную косую черту на диске, я бы сначала исправил это. Ваша вторая проблема, по-видимому, не использовалась mysql_real_escape_string
при сохранении этого имени файла в базе данных (почему оно оказалось там без обратной косой черты).
addslashes
кстати, сам по себе косые черты не добавляются. Эта часть вашей истории не соответствует действительности. И чтобы удалить их снова, вам не понадобится изворотливый str_replace
вызов, а просто stripslashes
.
Фактической проблемой (после вашей правки) оказывается html-ссылка. Это просто потому, что браузеры имеют привычку превращать обратную косую черту в прямую в URL-адресах. Чтобы предотвратить это, применяйте urlencode()
<a href="<?=urlencode(stripslashes($filename));?>">View</a>
Комментарии:
1. я думаю, что при извлечении данных из базы данных удаляются косые черты, которые были добавлены ранее. Я использовал addslashes, чтобы у меня было то же имя файла, что и на диске. Она добавила косые черты, но реальная проблема заключается в том, на что вы указали в своем последнем абзаце
2. База данных не удаляет обратную косую черту при извлечении. Это происходит при вставке. Для вставки материала в DB он должен быть правильно экранирован.
3. urlencode не решает мою проблему. добавлено больше забавных символов. пожалуйста, есть ли у них какой-либо другой вариант?
4. Дополнительно
htmlspecialchars
. В противном случае это какое-то другое обстоятельство, о котором вы не сообщили.5. @Ogugua @mario Попробуйте
rawurlencode()
вместоurlencode()
.urlencode()
преобразует пробелы в ‘ ‘, которые, похоже, не нравятся браузерам (в фактическом URL).rawurlencode()
преобразует пробелы в , что нормально.