Для последних версий Chrome (46+) текущий ответ больше не верен. unsafe-inline
все еще не имеет эффекта (в тегах заголовка манифеста и в meta
), но в документации вы можете использовать описанную здесь здесь , чтобы расслабить ограничение .
Использование хэшей для
элементов
Директива
script-src
позволяет разработчикам присваивать белый список конкретному встроенному скрипту, указывая его хэш как разрешенный источник сценария.Использование прост. Сервер вычисляет хеш содержимого конкретного блока сценария и включает в себя кодировку base64 этого значения в заголовке
Content-Security-Policy
:blockquote>Content-Security-Policy: default-src 'self'; script-src 'self' https://example.com 'sha256-base64 encoded hash'
Пример
Рассмотрим следующее:
manifest.json:
{ "manifest_version": 2, "name": "csp test", "version": "1.0.0", "minimum_chrome_version": "46", "content_security_policy": "script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='", "background": { "page": "background.html" } }
background.html:
Дальнейшие исследования
Я также опробовал установку применимой директивы в теге
meta
вместо манифеста. Хотя CSP, указанный в сообщении консоли, включал содержимое тега, он не выполнил встроенный скрипт (в Chrome 53).new background.html:
Приложение: Генерация хэшей
Вот два метода генерации хэшей:
- Python ( передайте JS на stdin, проведите его где-то еще):
import hashlib import base64 import sys def hash(s): hash = hashlib.sha256(s.encode()).digest() encoded = base64.b64encode(hash) return encoded contents = sys.stdin.read() print(hash(contents))
- В JS, используя Стэнфордскую библиотеку криптоваторов в Javascript :
var sjcl = require('sjcl'); // Generate base64-encoded SHA256 for given string. function hash(s) { var hashed = sjcl.hash.sha256.hash(s); return sjcl.codec.base64.fromBits(hashed); }
Убедитесь, что при хэшировании встроенных скриптов включено все содержимое тега скрипта (включая все ведущие / завершающие пробелы). Если вы хотите включить это в свои сборки, вы можете использовать что-то вроде cheerio , чтобы получить соответствующие разделы. В общем случае для любого
html
вы можете:var $ = cheerio.load(html); var csp_hashes = $('script') .map((i, el) => hash($(el).text()) .toArray() .map(h => `'sha256-${h}'`) .join(' '); var content_security_policy = `script-src 'self' 'unsafe-eval' ${csp_hashes}; object-src 'self'`;
Это метод, используемый в hash-csp , плагин gulp для генерации хэшей.
Какое поле - это? Оператор IN не может использоваться с единственным полем, но предназначен, чтобы использоваться в подзапросах или с предопределенными списками:
-- subquery
SELECT a FROM x WHERE x.b NOT IN (SELECT b FROM y);
-- predefined list
SELECT a FROM x WHERE x.b NOT IN (1, 2, 3, 6);
при поиске строки пойдите для оператора LIKE (но это будет медленно):
-- Finds all rows where a does not contain "text"
SELECT * FROM x WHERE x.a NOT LIKE '%text%';
, Если Вы ограничиваете его так, чтобы строка Вы искали, должен запуститься с данной строки, это может использовать индексы (если существует индекс на том поле) и быть довольно быстрым:
-- Finds all rows where a does not start with "text"
SELECT * FROM x WHERE x.a NOT LIKE 'text%';
SELECT * FROM table WHERE field1 NOT LIKE '%$x%';
(Удостоверяются, что Вы выходите из $x правильно заранее для предотвращения Внедрения SQL)
Редактирование: NOT IN
делает что-то немного различное - Ваш вопрос не полностью ясен так выбор который использовать. LIKE 'xxx%'
может использовать индекс. LIKE '%xxx'
или LIKE '%xxx%'
не может.