На мой взгляд, лучший способ вообще запретить SQL-инъекцию в вашем PHP-приложении (или любом веб-приложении, если на то пошло) - это думать о архитектуре вашего приложения. Если единственный способ защитить от SQL-инъекции - не забудьте использовать специальный метод или функцию, которая делает The Right Thing каждый раз, когда вы разговариваете с базой данных, вы делаете это неправильно. Таким образом, это просто вопрос времени, пока вы не забудете правильно отформатировать свой запрос в какой-то момент вашего кода.
Принятие шаблона MVC и структуры, такой как CakePHP или CodeIgniter - это, вероятно, правильный путь: общие задачи, такие как создание безопасных запросов к базе данных, были решены и централизованно реализованы в таких рамках. Они помогают организовать ваше веб-приложение разумным образом и заставляют вас больше думать о загрузке и сохранении объектов, а не о безопасном построении отдельных SQL-запросов.
В настоящее время известно только три процессора XSLT 2.0 и из них Saxon 9.x , вероятно, наиболее эффективен ( по крайней мере, по моему опыту) как по скорости, так и по использованию памяти. Saxon-SA (версия Saxon с поддержкой схемы, не бесплатная, как версия B (базовая)), имеет специальные расширения для потоковой обработки.
Из различных существующих процессоров XSLT 1.0 , .NET XslCompiledTransform (на основе C #, не Ява!) Кажется чемпионом.
В мире процессоров XSLT 1.0 на основе Java Saxon 6.x снова довольно хорош.
ОБНОВЛЕНИЕ :
Теперь, более чем через 3 года после того, как на этот вопрос был первоначально дан ответ, нет никаких доказательств того, что разница в эффективности между упомянутыми процессорами XSLT изменилась .
Что касается потоковой передачи :
Вот информационные сообщения Саксона, которые показывают детали о преобразовании:
Saxon 9.1.0.7J from Saxonica Java version 1.6.0_17 Stylesheet compilation time: 190 milliseconds Processing file:/C:\temp\delete\MRowst.xml Building tree for file:/C:\temp\delete\MRowst.xml using class net.sf.saxon.tinytree.TinyBuilder Tree built in 1053 milliseconds Tree size: 3075004 nodes, 1800000 characters, 0 attributes Loading net.sf.saxon.event.MessageEmitter Execution time: 1448 milliseconds Memory used: 506661648 NamePool contents: 14 entries in 14 chains. 6 prefixes, 6 URIs
Вот выдержка из документации :
В Саксонии есть два основных способа потоковой передачи:
Потоковая передача в режиме пакетной передачи. При таком подходе преобразование большого файла разбивается на последовательность преобразований небольших фрагментов файла. Каждый фрагмент в свою очередь считывается из входных данных, превращается в небольшое дерево в памяти, преобразуется и записывается в выходной файл.
Этот подход хорошо работает для файлов, которые являются довольно плоскими по структуре, например, файл журнала, содержащий миллионы записей журнала, где обработка каждой записи журнала не зависит от тех, что были раньше.
Вариант этого метода использует новую инструкцию XSLT 3.0 xsl: iterate для итерации по записям вместо xsl: for-each. Это позволяет поддерживать рабочие данные в процессе обработки записей: это позволяет, например, выводить итоговые или средние значения в конце цикла или сделать обработку одной записи зависимой от того, что было до нее в файле , Инструкция xsl: iterate также позволяет досрочно выйти из цикла, что позволяет преобразованию обрабатывать данные из начала большого файла без фактического чтения всего файла.
Потоковая передача в режиме пакетной передачи доступна как в XSLT, так и в XQuery, но в XQuery нет эквивалента конструкции xsl: iterate.
Потоковые шаблоны: этот подход следует традиционному шаблону обработки XSLT, заключающемуся в выполнении рекурсивного спуска входной иерархии XML путем сопоставления правил шаблона с узлами на каждом уровне, но делает это по одному элементу за раз, без построения дерева в памяти . [+1132]
Каждый шаблон принадлежит режиму (возможно, режим по умолчанию, безымянный режим), а потоковая передача - это свойство режима, которое можно указать с помощью нового объявления xsl: mode. Если режим объявляется потоком, то каждое правило шаблона в этом режиме должно подчиняться правилам обработки потока.
Правила для того, что разрешено в потоковой обработке, довольно сложны, но существенный принцип заключается в том, что шаблонное правило для данного узла может читать потомков этого узла только один раз, по порядку. Существуют и другие правила, налагаемые ограничениями в текущей реализации Saxon: например, хотя использование группировки теоретически согласуется с поточной реализацией, в настоящее время она не реализована в Saxon.
XSLT 3.0 будет иметь стандартную функцию потоковой передачи . Тем не менее, документ W3C все еще имеет статус «рабочий черновик», и спецификация потоковой передачи, вероятно, изменится в последующих черновых версиях. Из-за этого не существует никаких реализаций текущей черновой (потоковой) спецификации.
Предупреждение : Не каждое преобразование может быть выполнено в потоковом режиме - независимо от процессора XSLT. Одним из примеров преобразования, которое невозможно выполнить в потоковом режиме (с ограниченным объемом ОЗУ) для больших документов, является сортировка их элементов (скажем, по общему атрибуту).
Вы могли рассмотреть STX, реализация Java которого Joost. Так как это подобно XSLT, но быть потоковым процессором это в состоянии обработать огромные файлы с помощью очень небольшого количества RAM.
Joost в состоянии использоваться в качестве стандарта javax.xml.transform. TransformerFactory
См. Поддержку Saxon для потокового режима. http://www.saxonica.com/html/documentation/sourcedocs/streaming/
Если этот режим потоковой передачи не для вас, вы можете попробовать использовать крошечное дерево режим Saxon, который оптимизирован для меньшего использования памяти. (Это все равно по умолчанию)