Изображение веб-сайта, кэширующееся с Apache

Как вы можете видеть, люди предлагают вам максимально использовать подготовленные заявления. Это не так, но когда ваш запрос выполняется всего один раз за процесс, будет небольшое снижение производительности.

Я столкнулся с этой проблемой, но я думаю, что решил ее в очень сложном пути - как хакеры используют, чтобы избежать использования кавычек. Я использовал это в сочетании с эмулированными подготовленными заявлениями. Я использую его, чтобы предотвратить все возможные типы инъекций SQL.

Мой подход:

  • Если вы ожидаете, что ввод будет целым, убедитесь, что он действительно целое число. В языке с переменным типом, таком как PHP, этот очень важен. Вы можете использовать, к примеру, это очень простое, но мощное решение: sprintf("SELECT 1,2,3 FROM table WHERE 4 = %u", $input);
  • Если вы ожидаете чего-то еще от целого шестнадцатеричного значения. Если вы отбросите его, вы полностью избежите ввода. В C / C ++ есть функция, называемая mysql_hex_string() , в PHP вы можете использовать bin2hex() . Не беспокойтесь о том, что экранированная строка будет иметь размер в 2 раза по сравнению с исходной длиной, потому что даже если вы используете mysql_real_escape_string, PHP должен выделять одну и ту же емкость ((2*input_length)+1), что то же самое.
  • hex метод часто используется при передаче двоичных данных, но я не вижу причин, почему бы не использовать его во всех данных для предотвращения атак SQL-инъекций. Обратите внимание, что вам необходимо предварительно добавить данные с помощью 0x или использовать функцию MySQL UNHEX.

Так, например, запрос:

SELECT password FROM users WHERE name = 'root'

Будет:

SELECT password FROM users WHERE name = 0x726f6f74

или

SELECT password FROM users WHERE name = UNHEX('726f6f74')

Hex - идеальный выход.

Разница между функцией UNHEX и префиксом 0x

В комментариях было некоторое обсуждение, поэтому я, наконец, хочу дать понять. Эти два подхода очень похожи, но в некоторых отношениях они немного различаются:

Префикс ** 0x ** может использоваться только для столбцов данных, таких как char, varchar, text, block, binary, и т. д. Кроме того, его использование немного сложно, если вы собираетесь вставить пустую строку. Вам придется полностью заменить его на '', или вы получите сообщение об ошибке.

UNHEX () работает в любом столбце; вам не нужно беспокоиться о пустой строке.


Hex-методы часто используются в качестве атак

Обратите внимание, что этот шестиугольный метод часто используется как атака SQL-инъекции, где целые числа точно так же, как и строки mysql_real_escape_string. Тогда вы можете избежать использования кавычек.

Например, если вы просто делаете что-то вроде этого:

"SELECT title FROM article WHERE id = " . mysql_real_escape_string($_GET["id"])

атака может очень легко ввести вас . Рассмотрим следующий введенный код, возвращенный из вашего скрипта:

SELECT ... WHERE id = -1 union all select table_name from information_schema.tables

и теперь просто извлеките структуру таблицы:

SELECT ... WHERE id = -1 union all select column_name from information_schema.column где table_name = 0x61727469636c65

И тогда просто выберите нужные данные. Разве это не круто?

Но если кодер инъекционного сайта будет шестнадцатеричным, инъекция не будет возможна, потому что запрос будет выглядеть следующим образом: SELECT ... WHERE id = UNHEX('2d312075...3635')

43
задан Marco Demaio 5 April 2012 в 20:03
поделиться

2 ответа

Истекает , модуль в Apache решает это

a2enmod expires

, это должно быть загружено в конфигурации сервера и настроено в .htaccess (или в конфигурации сервера).

С Истекает заголовок, ресурс только требуют в первый раз. Перед датой истечения срока последующие запросы обработаны от кэша браузера. После того, как требуемое время истекает, и ресурс необходим, только тогда это требуют снова (условно - 304 будут возвращены для неизменного ресурса). Единственный надежный способ очистить его от кэша, прежде чем это истечет, вручную, или путем принуждения обновления (обычно Ctrl-F5). (Это могло быть проблемой, если ресурс изменяется тем временем, но статические изображения не изменяются очень часто.)

# enable the directives - assuming they're not enabled globally
ExpiresActive on

# send an Expires: header for each of these mimetypes (as defined by server)
ExpiresByType image/png "access plus 1 month"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"

# css may change a bit sometimes, so define shorter expiration
ExpiresByType text/css "access plus 1 days"

Для favicon.ico, немного больше работы необходимо (Apache обычно не распознает файлы значков Windows и отправляет это как текст/плоскость по умолчанию).

# special MIME type for icons - see http://www.iana.org/assignments/media-types/image/vnd.microsoft.icon
AddType image/vnd.microsoft.icon .ico
# now we have icon MIME type, we can use it
# my favicon doesn't change much
ExpiresByType image/vnd.microsoft.icon "access plus 3 months"

И вуаля, Это Worksв „ў!

57
ответ дан rubo77 26 November 2019 в 22:49
поделиться

Если Вы установите Expires заголовок на Вашем http ответе для Ваших статических изображений, то Ваш сервер не будет проверен снова на то изображение после первой загрузки, пока определенное время не передало, например, если я загружаю файл с Вашего сервера теперь, когда дает, это Expires заголовок как

Expires: Fri, 1 Jan 2010 00:00:01 GMT 

тогда, мой браузер не будет искать его с Вашего сервера снова до 2010, если я не очищу мой кэшировать / обновление силы (Ctrl+F5 на окнах).

существует простое введение в установку этого здесь , и список других возможно полезных ответов, законченных в Википедия

3
ответ дан ConroyP 26 November 2019 в 22:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: