<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Sep 26, 2016 at 4:28 AM, Anoop Alias <span dir="ltr"><<a href="mailto:anoopalias01@gmail.com" target="_blank">anoopalias01@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Ok .. reiterating my original question.<div><br></div><div>Is the usage of if / map  in nginx config  more efficient than say naxsi ( or libmodsecurity )  for something like blocking SQL injection ?</div></div></blockquote><div><br></div><div>Strictly speaking, and barring performance costs of the regexes themselves using only if/map directives in place of a full-featured WAF would likely be more less expensive, because any decent WAF will do more than just a single regular expression. That doesn't make this a better solution, though.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>For example, <a href="https://github.com/nbs-system/naxsi/blob/master/naxsi_config/naxsi_core.rules" target="_blank">https://github.com/nb<wbr>s-system/naxsi/blob/master/nax<wbr>si_config/naxsi_core.rules</a><br></div><div>rules 1000-1099 - blockes sql injection attempt</div><div><br></div><div>So ..do (to a limited extent )</div><div><br></div><div><div>## Block SQL injections</div><div>    set $block_sql_injections 0;</div><div>    if ($query_string ~ "union.*select.*\(") {</div><div>        set $block_sql_injections 1;</div><div>   ............</div></div></div></blockquote><div><br></div><div>Using multiple .* patterns like this is pretty bad form. It doesn't lead to _catastrophic_ backtracking, but there are certainly much smarter and cheaper ways to accomplish this, particularly with larger input sets.</div><div><br></div><div>Beyond this, checking like this doesn't allow you to examine request body data or arbitrary headers, which seems like a very poor approach.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div>   .....................</div><div>    if ($block_file_injections = 1) {</div><div>        return 403;</div><div>    }</div></div><div><br></div></div></blockquote><div><br></div><div>Using a simple return 403 here, without any logging or debug/audit information, could make it very very difficult to track down false positives and issues with your user base.</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>From the point of application performance which one is better .. ? Performance for a shared hosting server with around 500 vhosts. </div></div></blockquote><div><br></div><div>This smells very much like premature optimization. If you are truly concerned with securing this many sites, adopting a more feature solution should be the goal. If you are this truly focused on squeezing out every bit of performance as possible, using such a large hammer with generic regexes and hundreds of if/map blocks seems like the wrong road to take.</div><div><br></div><div>There is a reason that there is no good community solution for a WAF replacement in vanilla Nginx config syntax. It's simply not a good idea.</div><div><br></div></div></div></div>