public ModuleResults GetResults(InstanceInfo instanceInfo)
        {
            List<string> report = new List<string>();

            bool isWebSite = ProjectCodeFilesHelper.Current.IsWebSiteProject(instanceInfo.Directory);

            List<string> customerCodeFiles = ProjectCodeFilesHelper.Current.GetCustomerProjectCodeFiles(instanceInfo.Directory, instanceInfo.Version, isWebSite, true).ToList();
            if (customerCodeFiles.Count == 0)
            {
                return new ModuleResults
                {
                    ResultComment = "No customer files found.",
                    Status = Status.Good
                };
            }

            report.AddRange(customerCodeFiles);

            VulnerabilityAnalysisResults results = new VulnerabilityAnalysisResults();
            AnalyseVulnerabilities(instanceInfo.Directory, customerCodeFiles, ref results);
            string resultString = PrintResults(results);
            if (!String.IsNullOrEmpty(resultString))
            {
                report.Add(String.Empty);
                report.AddRange(resultString.Split(new[] { "<br />" }, StringSplitOptions.None));
            }

            return new ModuleResults
            {
                Result = report,
                Trusted = true
            };
        }
        /// <summary>
        /// Analyses code file for presence of security vulnerabilities.
        /// </summary>
        /// <param name="pathToKenticoInstance">Path to Kentico instance (e.g. <c>C:\inetpub\wwwroot\myKenticoInstance\CMS</c>).</param>
        /// <param name="fileWithinInstance">File to be analysed within the instance (relative paths).</param>
        /// <param name="results">Analysis results (the results are appended).</param>
        private void AnalyseVulnerabilities(DirectoryInfo pathToKenticoInstance, string fileWithinInstance, ref VulnerabilityAnalysisResults results)
        {
            var filePath = Path.Combine(pathToKenticoInstance.FullName, fileWithinInstance);
            var lines = File.ReadAllLines(filePath);
            int lineNo = 1;
            foreach (var line in lines)
            {
                string sqlInjection = null;
                string potentialSqlInjection = null;
                string potentialXss = null;

                AnalyseSqlInjection(line, ref sqlInjection, ref potentialSqlInjection);
                AnalyseXss(line, ref potentialXss);

                if (!String.IsNullOrEmpty(sqlInjection))
                {
                    results.SqlInjections.Add(String.Format("File: '{0}', line {1}: {2}", fileWithinInstance, lineNo, HttpUtility.HtmlEncode(sqlInjection)));
                }
                if (!String.IsNullOrEmpty(potentialSqlInjection))
                {
                    results.PotentialSqlInjections.Add(String.Format("File: '{0}', line {1}: {2}", fileWithinInstance, lineNo, HttpUtility.HtmlEncode(potentialSqlInjection)));
                }
                if (!String.IsNullOrEmpty(potentialXss))
                {
                    results.PotentialXss.Add(String.Format("File: '{0}', line {1}: {2}", fileWithinInstance, lineNo, HttpUtility.HtmlEncode(potentialXss)));
                }

                ++lineNo;
            }
        }
        /// <summary>
        /// Prints analysis result to string with HTML formatting. Vulnerabilites are highlighted.
        /// </summary>
        /// <param name="results">Results to be printed.</param>
        /// <returns>String with formatted results.</returns>
        private string PrintResults(VulnerabilityAnalysisResults results)
        {
            StringBuilder res = new StringBuilder();

            if (results.SqlInjections.Count > 0)
            {
                res.Append("<strong>Check the following files for SQL injection:</strong><br />")
                        .Append(PrintHighlightedResults(results.SqlInjections)).Append("<br />");
            }
            if (results.PotentialSqlInjections.Count > 0)
            {
                res.Append("<strong>Check the following files for potential SQL injection:</strong><br />")
                        .Append(PrintHighlightedResults(results.PotentialSqlInjections)).Append("<br />");
            }
            if (results.PotentialXss.Count > 0)
            {
                res.Append("<strong>Check the following files for XSS:</strong><br />")
                        .Append(PrintHighlightedResults(results.PotentialXss)).Append("<br />");
            }

            return res.ToString();
        }
 /// <summary>
 /// Analyses code files for presence of security vulnerabilites.
 /// </summary>
 /// <param name="pathToKenticoInstance">Path to Kentico instance (e.g. <c>C:\inetpub\wwwroot\myKenticoInstance\CMS</c>).</param>
 /// <param name="filesWithinInstance">Files to be analysed within the instance (relative paths).</param>
 /// <param name="results">Analysis results (the results are appended).</param>
 private void AnalyseVulnerabilities(DirectoryInfo pathToKenticoInstance, IEnumerable<string> filesWithinInstance, ref VulnerabilityAnalysisResults results)
 {
     foreach (var fileWithinInstance in filesWithinInstance)
     {
         AnalyseVulnerabilities(pathToKenticoInstance, fileWithinInstance, ref results);
     }
 }