Krótka odpowiedź na twoje pytanie brzmi "tak".
Blokuję próby włamań za pomocą trzech metod.
Używam cfqueryparam we wszystkich zapytaniach do bazy danych. Będę używał cfparam na szczycie plików template/cfm dla zmiennych zakresu URL.
Użyłem Portcullis lub jego wariantów. Możesz go uzyskać od http://portcullis.riaforge.org/. Portcullis będzie także bronić się przed atakami typu cross-site scripting.
Używam Windows IIS 7.5 (Windows Server 2008 R2). Używam funkcji URL Rewrite, aby zablokować większość ataków opartych na adresach URL. Możesz robić podobne rzeczy z Apache i przepisywaną przez niego obsługą. Oto moje reguły przepisywania URL IIS:
<?xml version="1.0" encoding="UTF-8"?>
<appcmd>
<CONFIG CONFIG.SECTION="system.webServer/rewrite/globalRules" path="MACHINE/WEBROOT/APPHOST" overrideMode="Inherit" locked="false">
<system.webServer-rewrite-globalRules>
<rule name="SQL Injection - EXEC - SCRIPT_NAME" stopProcessing="true">
<match url="^.*EXEC\s*[\(|%28].*$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - EXEC - QS" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{QUERY_STRING}" pattern="^.*EXEC\s*[\(|%28].*$" />
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - CAST - SCRIPT_NAME" stopProcessing="true">
<match url="^.*CAST\s*[\(|%28].*$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - CAST - QS" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{QUERY_STRING}" pattern="^.*CAST\s*[\(|%28].*$" />
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - DECLARE - SCRIPT_NAME" stopProcessing="true">
<match url="^.*DECLARE.*$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - DECLARE - QS" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{QUERY_STRING}" pattern="^.*DECLARE.*$" />
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - NVARCHAR - SCRIPT_NAME" stopProcessing="true">
<match url="^.*CHAR\s*[\(|%28].*$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - NVARCHAR - QS" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{QUERY_STRING}" pattern="^.*CHAR\s*[\(|%28].*$" />
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - sp_password - SCRIPT_NAME" stopProcessing="true">
<match url="^.*sp_password.*$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - sp_password - QS" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{QUERY_STRING}" pattern="^.*sp_password.*$" />
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - xp - SCRIPT_NAME" stopProcessing="true">
<match url="^.*%20xp_.*$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
<rule name="SQL Injection - xp - QS" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="{QUERY_STRING}" pattern="^.*%20xp_.*$" />
</conditions>
<serverVariables>
</serverVariables>
<action type="CustomResponse" statusCode="403" statusReason="Forbidden" statusDescription="Forbidden" />
</rule>
</system.webServer-rewrite-globalRules>
</CONFIG>
</appcmd>
Przepisy te są dodawane do katalogu C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config plik dla IIS. Jednak robię **** NOT **** zalecam, aby bezpośrednio edytować ten plik. Jeden błąd i IIS nie zostaną załadowane. Zamiast tego skopiuj & i wklej powyższe reguły i zapisz je jako "iis-global-rewrite.xml". Następnie uruchom następujące plik wsadowy, aby dodać reguły do serwera IIS: Reguły przepisywania
C:\Windows\System32\inetsrv\appcmd.exe set config -in < iis-global-rewrite.xml
IIS powinien pracować z IIS 7.0 (Windows Server 2008), ale ja jej nie testowane.
Te reguły można również zastosować do pojedynczej witryny za pomocą pliku web.config, jeśli nie masz dostępu do serwera.
Dlaczego używam trzech różnych metod ochrony? Ponieważ żaden z nich nie obejmuje wszystkich baz. Zasady przepisywania IIS chronią tylko przed atakami opartymi na adresach URL. Hakerzy mogą również używać ataków polegających na przesyłaniu formularzy, które robią to samo. Wolę reguły IIS jako pierwszą linię ochrony, ponieważ będzie działać ze wszystkimi lokacjami na serwerze, w tym PHP, ASP, itp. Portcullis jest dobrą drugą linią obrony dla ColdFusion, ponieważ będzie przechwytywał ataki oparte na formularzach i niektóre skrypty cross site ataki. Ostatnią linią obrony jest kod cfqueryparam/cfparam, który chroni przed atakami typu SQL injection opartymi na adresie URL/formularzu.
Jeśli wszystkie trzy z tych metod są używane serwer/witryna powinna być bardzo bezpieczna. Nadal zalecałbym przeglądanie dzienników serwera od czasu do czasu, gdy ataki będą ewoluować i ulepszać się.
Wow, to jest po prostu idealne. W rzeczywistości używam CF w IIS, więc na pewno zajrzę do zabezpieczenia mojej aplikacji internetowej za pomocą bardziej zaawansowanych reguł przepisywania. Dzięki! – Eleeist
Internetowe przepychanki w IIS i Apache mod_rewrite są bardzo przydatnymi narzędziami do obrony i SEO. http://blogs.iis.net/ruslany/archive/2009/04/08/10-url-rewriting-tips-and-tricks.aspx zawiera kilka przydatnych przykładów na przeprogramowanie URL-a IIS. –