Add readme

pull/63/head
ibuler 2016-10-11 12:28:17 +08:00
parent 83c826247e
commit d3cb774090
17 changed files with 353 additions and 516 deletions

View File

@ -2,9 +2,21 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="2eef964a-b574-48e0-859a-c282c4760328" name="Default" comment="">
<change type="DELETED" beforePath="$PROJECT_DIR$/old/README.md" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/config.lua" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/entry.lua" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/init.lua" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/logger.lua" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/waf.lua" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/wafconf/args" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/wafconf/cookie" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/wafconf/post" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/wafconf/url" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/wafconf/user_agent" afterPath="" />
<change type="DELETED" beforePath="$PROJECT_DIR$/old/wafconf/white_url" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/config.lua" afterPath="$PROJECT_DIR$/config.lua" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/core.lua" afterPath="$PROJECT_DIR$/core.lua" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/test.lua" afterPath="$PROJECT_DIR$/test.lua" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/test2.lua" afterPath="$PROJECT_DIR$/test2.lua" />
</list>
<ignored path="ngx_lua_waf.iws" />
@ -26,22 +38,38 @@
<favorites_list name="ngx_lua_waf" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="core.lua" pinned="false" current-in-tab="true">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="core.lua" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/core.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="95">
<caret line="82" column="7" selection-start-line="82" selection-start-column="7" selection-end-line="82" selection-end-column="7" />
<state relative-caret-position="266">
<caret line="164" column="53" selection-start-line="164" selection-start-column="51" selection-end-line="164" selection-end-column="53" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="README.md" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/README.md">
<provider editor-type-id="MultiMarkdownFxPreviewEditor">
<state />
</provider>
<provider selected="true" editor-type-id="split-provider[text-editor;MultiMarkdownPreviewEditor]">
<state split_layout="FIRST">
<first_editor relative-caret-position="150">
<caret line="48" column="3" selection-start-line="48" selection-start-column="3" selection-end-line="48" selection-end-column="3" />
<folding />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="test.lua" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<caret line="20" column="0" selection-start-line="20" selection-start-column="0" selection-end-line="20" selection-end-column="0" />
<state relative-caret-position="304">
<caret line="16" column="2" selection-start-line="16" selection-start-column="2" selection-end-line="16" selection-end-column="2" />
<folding />
</state>
</provider>
@ -50,8 +78,8 @@
<file leaf-file-name="test2.lua" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/test2.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="209">
<caret line="13" column="14" selection-start-line="13" selection-start-column="14" selection-end-line="13" selection-end-column="14" />
<state relative-caret-position="190">
<caret line="49" column="0" selection-start-line="49" selection-start-column="0" selection-end-line="49" selection-end-column="0" />
<folding />
</state>
</provider>
@ -60,8 +88,8 @@
<file leaf-file-name="config.lua" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/config.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="361">
<caret line="19" column="11" selection-start-line="19" selection-start-column="11" selection-end-line="19" selection-end-column="11" />
<state relative-caret-position="34">
<caret line="13" column="0" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" />
<folding />
</state>
</provider>
@ -70,8 +98,8 @@
<file leaf-file-name="iputils.lua" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/iputils.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="285">
<caret line="184" column="13" selection-start-line="184" selection-start-column="13" selection-end-line="184" selection-end-column="13" />
<state relative-caret-position="152">
<caret line="175" column="6" selection-start-line="175" selection-start-column="6" selection-end-line="175" selection-end-column="6" />
<folding />
</state>
</provider>
@ -96,10 +124,11 @@
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/init.lua" />
<option value="$PROJECT_DIR$/config.lua" />
<option value="$PROJECT_DIR$/test.lua" />
<option value="$PROJECT_DIR$/test2.lua" />
<option value="$PROJECT_DIR$/core.lua" />
<option value="$PROJECT_DIR$/config.lua" />
<option value="$PROJECT_DIR$/README.md" />
</list>
</option>
</component>
@ -110,10 +139,10 @@
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="8" />
<option name="y" value="24" />
<option name="width" value="1260" />
<option name="height" value="709" />
<option name="x" value="13" />
<option name="y" value="32" />
<option name="width" value="1151" />
<option name="height" value="650" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
@ -276,6 +305,12 @@
<method />
</configuration>
<configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
<node-interpreter>project</node-interpreter>
<node-options />
<gulpfile />
<tasks />
<arguments />
<envs />
<method />
</configuration>
<configuration default="true" type="js.build_tools.npm" factoryName="npm">
@ -421,27 +456,27 @@
<servers />
</component>
<component name="ToolWindowManager">
<frame x="8" y="24" width="1260" height="709" extended-state="0" />
<frame x="13" y="32" width="1151" height="650" extended-state="0" />
<editor active="true" />
<layout>
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.24958949" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.22272317" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="LuaJ" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.06482982" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="LuaJ" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.27598566" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="-1" side_tool="true" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
</layout>
</component>
@ -461,7 +496,7 @@
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/logger.lua">
<entry file="file://$PROJECT_DIR$/core.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
@ -469,18 +504,34 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/entry.lua">
<entry file="file://$PROJECT_DIR$/test.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="304">
<caret line="16" column="0" selection-start-line="16" selection-start-column="0" selection-end-line="16" selection-end-column="0" />
<state relative-caret-position="380">
<caret line="20" column="0" selection-start-line="20" selection-start-column="0" selection-end-line="20" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/init.lua">
<entry file="file://$PROJECT_DIR$/test2.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="212" column="24" selection-start-line="212" selection-start-column="24" selection-end-line="212" selection-end-column="24" />
<caret line="13" column="14" selection-start-line="13" selection-start-column="14" selection-end-line="13" selection-end-column="14" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="17" column="24" selection-start-line="17" selection-start-column="24" selection-end-line="17" selection-end-column="24" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/iputils.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3496">
<caret line="184" column="13" selection-start-line="184" selection-start-column="13" selection-end-line="184" selection-end-column="13" />
<folding />
</state>
</provider>
@ -493,45 +544,166 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/iputils.lua">
<entry file="file://$PROJECT_DIR$/core.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="285">
<caret line="184" column="13" selection-start-line="184" selection-start-column="13" selection-end-line="184" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="361">
<caret line="19" column="11" selection-start-line="19" selection-start-column="11" selection-end-line="19" selection-end-column="11" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test2.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="209">
<caret line="13" column="14" selection-start-line="13" selection-start-column="14" selection-end-line="13" selection-end-column="14" />
<state relative-caret-position="1406">
<caret line="74" column="31" selection-start-line="74" selection-start-column="31" selection-end-line="74" selection-end-column="31" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="16">
<state relative-caret-position="380">
<caret line="20" column="0" selection-start-line="20" selection-start-column="0" selection-end-line="20" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test2.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="13" column="14" selection-start-line="13" selection-start-column="14" selection-end-line="13" selection-end-column="14" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="17" column="24" selection-start-line="17" selection-start-column="24" selection-end-line="17" selection-end-column="24" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/iputils.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3496">
<caret line="184" column="13" selection-start-line="184" selection-start-column="13" selection-end-line="184" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitattributes">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="95">
<caret line="82" column="7" selection-start-line="82" selection-start-column="7" selection-end-line="82" selection-end-column="7" />
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="380">
<caret line="20" column="0" selection-start-line="20" selection-start-column="0" selection-end-line="20" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test2.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="247">
<caret line="13" column="14" selection-start-line="13" selection-start-column="14" selection-end-line="13" selection-end-column="14" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="323">
<caret line="17" column="24" selection-start-line="17" selection-start-column="24" selection-end-line="17" selection-end-column="24" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/iputils.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="3496">
<caret line="184" column="13" selection-start-line="184" selection-start-column="13" selection-end-line="184" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/.gitattributes">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/logger.lua" />
<entry file="file://$PROJECT_DIR$/entry.lua" />
<entry file="file://$PROJECT_DIR$/init.lua" />
<entry file="file://$PROJECT_DIR$/.gitattributes">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="0">
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="304">
<caret line="16" column="2" selection-start-line="16" selection-start-column="2" selection-end-line="16" selection-end-column="2" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/iputils.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="152">
<caret line="175" column="6" selection-start-line="175" selection-start-column="6" selection-end-line="175" selection-end-column="6" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/test2.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="190">
<caret line="49" column="0" selection-start-line="49" selection-start-column="0" selection-end-line="49" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/config.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="34">
<caret line="13" column="0" selection-start-line="13" selection-start-column="0" selection-end-line="13" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/core.lua">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="266">
<caret line="164" column="53" selection-start-line="164" selection-start-column="51" selection-end-line="164" selection-end-column="53" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/README.md">
<provider editor-type-id="MultiMarkdownFxPreviewEditor">
<state />
</provider>
<provider selected="true" editor-type-id="split-provider[text-editor;MultiMarkdownPreviewEditor]">
<state split_layout="FIRST">
<first_editor relative-caret-position="150">
<caret line="48" column="3" selection-start-line="48" selection-start-column="3" selection-end-line="48" selection-end-column="3" />
<folding />
</first_editor>
<second_editor />
</state>
</provider>
</entry>
</component>
</project>

56
README.md Normal file
View File

@ -0,0 +1,56 @@
### nginx lua waf
##### 参考
1. https://github.com/loveshell/ngx_lua_waf
2. https://github.com/p0pr0ck5/lua-resty-waf
#### 使用
1. 安装Nginx和lua插件 或者直接安装 openresty
2. git clone
3. nginx.conf 配置文件
http段
...
lua_package_path "/data/server/nginx/conf/waf/?.lua";
lua_shared_dict limit 10m;
...
4. 在location中使用
location / {
access_by_lua '
local lua_waf = require "core"
local waf = lua_waf:new("default")
waf:set_option("cc_rate", "2/60")
waf:set_option("active", true)
waf:set_option("white_ip_list", {"192.168.128.0/24", "127.0.0.1"})
waf:run()
';
...
}
5. reload
#### 说明
— 默认配置文件
_M.defaults = {
active = false,
cc_deny = true,
cc_rate = "100/600",
cc_deny_seconds = 600,
cc_deny_code = 404,
log_path = "/tmp/nginx_waf.log",
white_ip_list = {},
black_ip_list = {},
black_return_code = 403,
}
- 单独设置
waf:set_option("cc_rate", "2/60")
- 问题排查
nginx error日志 和 log_path

View File

@ -11,7 +11,6 @@ _M.version = '0.1.0'
_M.defaults = {
debug = true,
active = false,
cc_deny = true,
cc_rate = "100/600",

View File

@ -15,6 +15,7 @@ local config = require "config"
local iputils = require "iputils"
local mt = {__index=_M }
local limit = ngx.shared.limit
local _cidr_cache = {}
local function get_client_ip()
local ip = get_headers()["X-Real-IP"]
@ -71,11 +72,11 @@ function _M.deny_cc(self)
return false
end
elseif req == max_visit then
self:log("[Deny_cc] Block "..token)
limit:incr(token, 1)
if self.config.active then
ngx.exit(self.config.cc_deny_code)
end
self:log("[Deny_cc] Block "..token)
limit:incr(token, 1)
return true
else
limit:incr(token, 1)
@ -85,6 +86,32 @@ function _M.deny_cc(self)
end
end
function cidr_match(ip, cidr_pattern)
local t = {}
local n = 1
if (type(cidr_pattern) ~= "table") then
cidr_pattern = { cidr_pattern }
end
for _, v in ipairs(cidr_pattern) do
-- try to grab the parsed cidr from out module cache
local cidr = _cidr_cache[v]
-- if it wasn't there, compute and cache the value
if (not cidr) then
local lower, upper = iputils.parse_cidr(v)
cidr = { lower, upper }
_cidr_cache[v] = cidr
end
t[n] = cidr
n = n + 1
end
return iputils.ip_in_cidrs(ip, t), ip
end
function _M.log(self, msg)
ngx.log(ngx.WARN, self.config.log_path)
if log_inited[self.config.log_path] == nil then
@ -110,12 +137,10 @@ function _M.in_white_ip_list(self)
local white_ip_list = self.config.white_ip_list
if next(white_ip_list) ~= nil then
for _, wip in pairs(white_ip_list) do
if ip == wip or iputils.ip_in_cidrs(ip, wip) then
if cidr_match(ip, white_ip_list) then
limit:set(white_ip_token, true, 3600)
self:log("[White_ip] In white list passed: "..ip)
return true
end
end
end
return false
@ -135,15 +160,13 @@ function _M.in_black_ip_list(self)
local black_ip_list = self.config.black_ip_list
if next(black_ip_list) ~= nil then
for _, bip in pairs(black_ip_list) do
if ip == bip or iputils.ip_in_cidrs(ip, bip) then
if cidr_match(ip, black_ip_list) then
limit:set(block_ip_token, true, 3600)
self:log("[Black_ip] In black list denied: "..ip)
if self.config.active then
ngx.exit(self.config.black_return_code)
end
return true
end
end
end
return false

View File

@ -1,28 +0,0 @@
## ngx_lua_waf
基于 loveshell [nginx-lua-waf](https://github.com/loveshell/ngx_lua_waf)更改
### 使用方法:
1. nginx安装lua模块不再详述
2. 下载模块
cd /data/server/nginx/conf
git clone https://github.com/ibuler/ngx_lua_waf.git waf
2. nginx.conf 添加参数
lua_package_path /data/server/nginx/conf/waf/?.lua; # 模块位置
lua_shared_dict limit 10m; # 设置lua使用内存, 根据访问量设置合适值
3. location或server设置访问控制
access_by_lua_file /data/server/nginx/conf/waf/entry.lua; # 可以copy一份到不同的配置中单独修改其配置文件
## 文件说明
- config.lua 默认配置文件
- entry.lua access控制入口样例文件
- init.lua 函数所在文件,都会调用该文件
- wafconf 暂时没有使用,将来开发继续完成
### 参数说明
- debug: 调试阶段开始debug显示debug信息
- cc_deny: 开启cc_deny控制访问量
- cc_rate: 10/60 意思为 60s内访问10次超过频率会被block掉
- cc_deny_seconds: 达到阈值后,禁止访问的时间

View File

@ -1,23 +0,0 @@
debug = false
-- rule_path = "/data/server/nginx/conf/waf/wafconf/"
-- url_check = false
-- url_write_check = false
-- args_check = false
-- ua_check = false
-- ua_write_check = false
-- cookie_check = false
-- post_check = false
-- black_file_ext = {"php", "jsp"}
-- attack_log = false
-- attach_log_dir = "/data/logs/waf/"
-- redirect = false
-- redirect_url = "http://www.baidu.com"
ip_check = false
ip_white_list = {} -- {'192.168.1.*', '127.0.0.1'}
ip_black_list = {} -- {'0.0.0.0', '106.2.34.29'}
cc_deny = false
cc_rate = "100/60"
cc_deny_seconds = "600"

View File

@ -1,16 +0,0 @@
--------- Global default config -------
require 'config'
--------- Local config setting --------
debug = true
cc_deny = false
cc_rate = '10/60'
ip_check = true
ip_white_list = {}
ip_black_list = {}
--------- Access control limit --------
if ip_check and (whiteIP(ip_white_list, debug) or blackIP(ip_black_list, debug)) then
elseif cc_deny and denyCC(cc_rate, cc_deny_seconds, debug) then
else return
end

View File

@ -1,313 +0,0 @@
local match = string.match
local ngx_match = ngx.re.match
local unescape = ngx.unescape_uri
local get_headers = ngx.req.get_headers
function getClientIp()
IP = get_headers()["X-Real-IP"]
if IP == nil then
IP = ngx.var.remote_addr
end
if IP == nil then
IP = "unknown"
end
return IP
end
function write(logfile, msg)
local fd = io.open(logfile, "ab")
if fd == nil then
return
end
fd:write(msg)
fd:flush()
fd:close()
end
function log(method, url, data, tag)
if attack_log then
local realIp = getClientIp()
local ua = ngx.var.http_user_agent
local servername = ngx.var.server_name
local time = ngx.localtime()
if ua then
line = realIp.." ["..time.."] \""..method.." "..servername..url.."\" \""..data.."\" \""..ua.."\" \""..tag.."\"\n"
else
line = realIp.." ["..time.."] \""..method.." "..servername..url.."\" \""..data.."\" - \""..tag.."\"\n"
end
local filename = logpath..'/'..servername.."_"..ngx.today().."_sec.log"
write(filename, line)
end
end
------------------------------------ 规则读取函数 -----------------------------------------
-- function readRule(var)
-- file = io.open(rule_path..'/'..var, "r")
-- if file == nil then
-- return
-- end
-- t = {}
-- for line in file:lines() do
-- table.insert(t, line)
-- end
-- file:close()
-- return(t)
-- end
-- url_rules = readRule('url')
-- white_url_rules = readRule('white_url')
-- args_rules = readRule('args')
-- ua_rules = readRule('user_agent')
-- post_rules = readRule('post')
-- cookie_rules = readRule('cookie')
function debugSay(msg, debug)
if debug then
ngx.header.content_type = "text/html"
ngx.status = ngx.HTTP_FORBIDDEN
ngx.say(msg)
ngx.exit(ngx.status)
end
end
-- function whiteURLCheck()
-- if white_url_rules ~= nil then
-- for _, rule in pairs(white_url_rules) do
-- if ngx_match(ngx.var.uri, rule, "isjo") then
-- return true
-- end
-- end
-- end
-- return false
-- end
-- function fileExtCheck(ext, black_file_ext)
-- local items = Set(black_fileExt)
-- ext = string.lower(ext)
-- if ext then
-- for rule in pairs(items) do
-- if ngx.re.match(ext, rule, "isjo") then
-- if attack_log then
-- log('POST',ngx.var.request_uri,"-","file attack with ext "..ext)
-- end
-- if debug then
-- debugSay(ngx.var.request_uri.."-".."file attack with ext: "..ext)
-- end
-- end
-- end
-- end
-- return false
-- end
-- function set(list)
-- local set = {}
-- for _, l in ipairs(list) do
-- set[l] = true
-- end
-- return set
-- end
-- function checkArgs()
-- for _, rule in pairs(args_rules) do
-- local args = ngx.req.get_uri_args()
-- for key, val in pairs(args) do
-- if type(val) == 'table' then
-- if val ~= false then
-- data = table.concat(val, " ")
-- end
-- else
-- data = val
-- end
-- if data and type(data) ~= "boolean" and rule ~="" and ngx_match(unescape(data), rule, "isjo") then
-- log('GET', ngx.var.request_uri, "-", rule)
-- debugSay(ngx.var.request_uri.."-"..rule)
-- return true
-- end
-- end
-- end
-- return false
-- end
-- function url()
-- if UrlDeny then
-- for _,rule in pairs(urlrules) do
-- if rule ~="" and ngxmatch(ngx.var.request_uri,rule,"isjo") then
-- log('GET',ngx.var.request_uri,"-",rule)
-- say_html()
-- return true
-- end
-- end
-- end
-- return false
-- end
-- function ua()
-- local ua = ngx.var.http_user_agent
-- if ua ~= nil then
-- for _,rule in pairs(uarules) do
-- if rule ~="" and ngxmatch(ua,rule,"isjo") then
-- log('UA',ngx.var.request_uri,"-",rule)
-- say_html()
-- return true
-- end
-- end
-- end
-- return false
-- end
-- function body(data)
-- for _,rule in pairs(postrules) do
-- if rule ~="" and data~="" and ngxmatch(unescape(data),rule,"isjo") then
-- log('POST',ngx.var.request_uri,data,rule)
-- say_html()
-- return true
-- end
-- end
-- return false
-- end
-- function cookie()
-- local ck = ngx.var.http_cookie
-- if CookieCheck and ck then
-- for _,rule in pairs(ckrules) do
-- if rule ~="" and ngxmatch(ck,rule,"isjo") then
-- log('Cookie',ngx.var.request_uri,"-",rule)
-- say_html()
-- return true
-- end
-- end
-- end
-- return false
-- end
function denyCC(cc_rate, cc_deny_seconds, debug)
local uri = ngx.var.uri
cc_count = tonumber(string.match(cc_rate, '(.*)/'))
cc_seconds = tonumber(string.match(cc_rate, '/(.*)'))
local token = getClientIp()..uri
local limit = ngx.shared.limit
local req, _ = limit:get(token) -- 127.0.0.1_/price/v1.0: 10
local ip = getClientIp()
local block, _ = limit:get(ip) -- 127.0.0.1: 1
if block then
if debug then
ngx.say('Deny by waf.')
ngx.exit('200')
return true
else
ngx.exit(404)
end
end
if req then
if req > cc_count then
limit:set(ip, 1, cc_deny_seconds)
ngx.exit(404)
return true
else
limit:incr(token, 1)
end
else
limit:set(token, 1, cc_seconds)
end
return false
end
-- function get_boundary()
-- local header = get_headers()["content-type"]
-- if not header then
-- return nil
-- end
-- if type(header) == "table" then
-- header = header[1]
-- end
-- local m = match(header, ";%s*boundary=\"([^\"]+)\"")
-- if m then
-- return m
-- end
-- return match(header, ";%s*boundary=([^\",;]+)")
-- end
function string.split(str, delimiter)
if str==nil or str=='' or delimiter==nil then
return nil
end
local result = {}
for match in (str..delimiter):gmatch("(.-)"..delimiter) do
table.insert(result, match)
end
return result
end
function innet(ip, network)
local star = ''
for i in string.gmatch(network, '%*') do
star = star..i
end
local ip = string.split(ip, '%.')
local network = string.split(network, '%.')
if ip == nil or network == nil then
return false
end
local ip_prefix = {}
local network_prefix = {}
for i=1, 4-string.len(star) do
ip_prefix[i] = ip[i]
network_prefix[i] = network[i]
end
ip_prefix = table.concat(ip_prefix, '.')
network_prefix = table.concat(network_prefix, '.')
if ip_prefix == network_prefix then
return true
else
return false
end
end
function whiteIP(ip_white_list, debug)
if next(ip_white_list) ~= nil then
ip = getClientIp()
for _, wip in pairs(ip_white_list) do
if ip == wip or innet(ip, wip) then
if debug then
ngx.say(ip.." in white list <br />")
end
return true
end
end
end
return false
end
function blackIP(ip_black_list, debug)
if next(ip_black_list) ~= nil then
ip = getClientIp()
for _, bip in pairs(ip_black_list) do
if ip == bip or ip == "0.0.0.0" or innet(ip, bip) then
if debug then
ngx.say(ip.." in black list <br/>")
end
ngx.exit(403)
return true
end
end
end
return false
end

View File

View File

View File

@ -1,22 +0,0 @@
\.\./
\:\$
\$\{
select.+(from|limit)
(?:(union(.*?)select))
having|rongjitest
sleep\((\s*)(\d*)(\s*)\)
benchmark\((.*)\,(.*)\)
base64_decode\(
(?:from\W+information_schema\W)
(?:(?:current_)user|database|schema|connection_id)\s*\(
(?:etc\/\W*passwd)
into(\s+)+(?:dump|out)file\s*
group\s+by.+\(
xwork.MethodAccessor
(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(
xwork\.MethodAccessor
(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\/
java\.lang
\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\[
\<(iframe|script|body|img|layer|div|meta|style|base|object|input)
(onmouseover|onerror|onload)\=

View File

@ -1,20 +0,0 @@
\.\./
\:\$
\$\{
select.+(from|limit)
(?:(union(.*?)select))
having|rongjitest
sleep\((\s*)(\d*)(\s*)\)
benchmark\((.*)\,(.*)\)
base64_decode\(
(?:from\W+information_schema\W)
(?:(?:current_)user|database|schema|connection_id)\s*\(
(?:etc\/\W*passwd)
into(\s+)+(?:dump|out)file\s*
group\s+by.+\(
xwork.MethodAccessor
(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(
xwork\.MethodAccessor
(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\/
java\.lang
\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\[

View File

@ -1,19 +0,0 @@
select.+(from|limit)
(?:(union(.*?)select))
having|rongjitest
sleep\((\s*)(\d*)(\s*)\)
benchmark\((.*)\,(.*)\)
base64_decode\(
(?:from\W+information_schema\W)
(?:(?:current_)user|database|schema|connection_id)\s*\(
(?:etc\/\W*passwd)
into(\s+)+(?:dump|out)file\s*
group\s+by.+\(
xwork.MethodAccessor
(?:define|eval|file_get_contents|include|require|require_once|shell_exec|phpinfo|system|passthru|preg_\w+|execute|echo|print|print_r|var_dump|(fp)open|alert|showmodaldialog)\(
xwork\.MethodAccessor
(gopher|doc|php|glob|file|phar|zlib|ftp|ldap|dict|ogg|data)\:\/
java\.lang
\$_(GET|post|cookie|files|session|env|phplib|GLOBALS|SERVER)\[
\<(iframe|script|body|img|layer|div|meta|style|base|object|input)
(onmouseover|onerror|onload)\=

View File

@ -1,6 +0,0 @@
\.(svn|htaccess|bash_history|git)
\.(bak|inc|old|mdb|sql|backup|java|class)$
(vhost|bbs|host|wwwroot|www|site|root|hytop|flashfxp).*\.rar
(phpmyadmin|jmx-console|jmxinvokerservlet)
java\.lang
/(attachments|upimg|images|css|uploadfiles|html|uploads|templets|static|template|data|inc|forumdata|upload|includes|cache|avatar)/(\\w+).(php|jsp)

View File

@ -1 +0,0 @@
(HTTrack|harvest|audit|dirbuster|pangolin|nmap|sqln|-scan|hydra|Parser|libwww|BBBike|sqlmap|w3af|owasp|Nikto|fimap|havij|PycURL|zmeu|BabyKrokodil|netsparker|httperf|bench| SF/)

View File

@ -1 +0,0 @@
^/123/$

View File

@ -10,8 +10,44 @@
--local lua_waf = require "core"
local lua_waf = require "test"
local waf = lua_waf:new("test")
local _cidr_cache = {}
print(waf.name)
local iputils = require "iputils"
function cidr_match(ip, cidr_pattern)
local t = {}
local n = 1
if (type(cidr_pattern) ~= "table") then
cidr_pattern = { cidr_pattern }
end
for _, v in ipairs(cidr_pattern) do
-- try to grab the parsed cidr from out module cache
local cidr = _cidr_cache[v]
-- if it wasn't there, compute and cache the value
if (not cidr) then
local lower, upper = iputils.parse_cidr(v)
cidr = { lower, upper }
_cidr_cache[v] = cidr
end
t[n] = cidr
n = n + 1
end
return iputils.ip_in_cidrs(ip, t), ip
end
a = cidr_match('192.168.128.230', {'192.168.128.0/24', '127.0.0.1'})
print(a)
a = cidr_match('172.16.1.1', {'172.16.1.2'})
print(a)
--for k, v in pairs(waf["config"]) do
-- print(k, v)
--end