What is XSS?
Cross-Site Scripting (XSS) is a specific kind of vulnerability that can be found in web applications. It enables attackers to insert harmful scripts into web pages that other users see. When executed within the victim's browser, these scripts provide attackers with a wide range of malicious opportunities (PortSwigger, n.d.).
Why is it a threat?
XSS can lead to various malicious outcomes, including:
Stealing Cookies: An attacker might use XSS to steal session cookies, allowing them to impersonate the victim (Digital Guardian, 2019).
Defacing Websites: An attacker can use XSS to alter the content of a web page, potentially damaging the website's reputation (Netsparker, 2020).
Delivering Malware: XSS can be used to deliver and execute malware on a victim's computer (Symantec, 2018).
Phishing: By creating a fake login or input prompt, an attacker can trick users into providing sensitive data (Kaspersky, 2021).
Stored XSS (Persistent XSS):
Description: The attacker permanently stores the malicious script they injected on the target server (for example, in a database). When a user retrieves the stored data, the attacker's script is also retrieved and executed (Veracode, n.d.).
Example: A user comments on a blog post. If the website doesn't properly sanitize input, the attacker can post a comment with a script. Every time someone views the comment, the script will execute.
Reflected XSS (Non-Persistent XSS):
Description: The malicious script is embedded in a URL. Instead of being stored on the server, it is "reflected" off the web server, e.g., via a search result, error message, or any other response that includes some or all of the input sent to the server (Imperva, n.d.).
Example: An attacker sends a link containing malicious code as a parameter in the URL. When an unsuspecting user clicks the link, the website reflects the attacker's script back to the user's browser, which then executes it.
Description: In this case, the entire tainted data flow from source to sink takes place in the browser, i.e., the source of the data is in the DOM, the sink is also in the DOM, and the data flow never leaves the browser (OWASP, n.d.).
Setting Up the Review Environment
Ensuring the safety, security, and efficiency of a software system requires a properly set up review environment. Let's delve deeper into the process.
1. Gathering All Source Code
Before diving into the review process, ensure that you have access to every piece of the application's source code. Missing out on any part can lead to unchecked vulnerabilities (Spinellis, 2003).
Version Control Systems (VCS) like Git, Mercurial, or SVN can be incredibly helpful. Developers consistently push their code to VCS, making it a one-stop location for the entire application code (Chacon & Straub, 2014).
For distributed systems or microservices, ensure that you pull code for each service. This is crucial because each service might be developed using different technologies with unique dependencies and possible vulnerabilities (Newman, 2015).
2. Setting Up a Staging or Test Environment
A staging environment is a clone of the production environment. It allows you to test changes in a safe environment that closely mirrors the live one without affecting actual users (Humble & Farley, 2010).
Why it's important:
Safety: You can perform aggressive tests without risking breaking the production environment or revealing sensitive data.
Realistic Results: A staging environment closely resembles the production setup, so any vulnerabilities or bugs discovered here are likely to appear in production as well.
Databases: If your application uses a database, the staging environment should include a copy of the production database. Ensure this data is anonymized or sanitized to protect sensitive information (Redgate, 2019).
Environment Variables: Configuration details, API keys, and other settings should mirror production but with non-sensitive or mock values.
Infrastructure: Tools like Docker and Kubernetes can help replicate the exact versions and configurations of your software stack. Platforms like AWS, Azure, and Google Cloud offer solutions to duplicate infrastructure setups for staging (Yevgeniy & Jeff, 2017).
3. Tools That Can Assist in the Review Process
Utilizing tools during the code review process improves efficiency, offers automation, and can identify vulnerabilities that human reviewers might miss (Chess & West, 2007).
Static Code Analyzers:
Static Application Security Testing (SAST) tools evaluate source code, bytecode, or application binaries for vulnerabilities without executing the program.
Checkmarx Offers broad language support and is known for its ability to provide a clear trace of the data flow from input to an insecure operation, helping developers understand the path and method of an attack (Checkmarx, 2020).
Fortify: Produced by Micro Focus, it supports over 25 programming languages and is known for its accuracy in pinpointing issues (Micro Focus, 2019).
IDEs with Security Plugins:
Modern Integrated Development Environments (IDEs) allow for plugins or extensions that can automatically highlight potential security vulnerabilities as developers write code (JetBrains, 2020).
Visual Studio: Microsoft's IDE comes with many security features built-in and supports plugins for extended capabilities (Microsoft, 2019).
Eclipse and IntelliJ, Popular for Java development, both support plugins like SonarLint that highlight potential vulnerabilities in real-time (SonarSource, 2020).
Dynamic Code Analyzers:
Dynamic Application Security Testing (DAST) tools find vulnerabilities by executing the program, typically requiring running the application and analyzing the runtime behavior.
OWASP ZAP (Zed Attack Proxy) is an open-source tool that is actively maintained by a worldwide group of volunteers. It can automatically scan applications but also offers manual testing utilities (OWASP, n.d.).
Burp Suite: A popular tool among security professionals, it offers both passive and active scanning capabilities and integrates with other tools (PortSwigger, n.d.).
General Code Review Principles
Code review is a vital phase in the software development lifecycle. It not only helps in identifying bugs and vulnerabilities but also ensures code quality and knowledge sharing among the team. Two fundamental aspects to focus on during a security-focused code review are the application's architecture and its data flow (Bosu, Greiler, & Bird, 2015).
1. Familiarizing Oneself with the Application's Architecture
Before diving deep into the code, it's essential to gain a thorough understanding of the application's architecture. This overarching view helps reviewers identify potential weak spots and understand how different components communicate (Garousi, Küçük, & Felderer, 2017).
Why it's important:
Spot Vulnerabilities: Understanding the architecture helps in pinpointing areas where vulnerabilities are most likely to exist.
Evaluate Design Choices: By assessing the application's structural design, reviewers can determine if there are inherent flaws or security risks.
Steps and Examples:
Review Documentation: Start by reading any architectural documentation available. Diagrams, flowcharts, and design specs can offer a high-level overview. Example: A documented microservices architecture might reveal the communication points between services and how they authenticate requests.
Meet with Developers: Conversations with those who wrote or maintain the code can shed light on design decisions and known issues. Example: A developer might explain the rationale behind storing certain user data and how encryption is applied, which can be critical in evaluating data security.
Explore the Codebase: Navigate through the directories, modules, and key components to grasp the application's structure. Example: In a web application, reviewers can start by examining the MVC (Model-View-Controller) structure, paying close attention to controllers handling user input and models interacting with databases.
2. Understanding Data Flow, Especially Where User Input is Accepted and Displayed
The manner in which data moves through an application is pivotal to understanding potential security risks. Special attention must be given to how user input is accepted, processed, stored, and displayed.
Why it's important:
Infiltration Points: Recognizing where an application accepts user input helps identify potential points of infiltration, like SQL injection or Cross-Site Scripting (XSS) vulnerabilities (Wurster & van Oorschot, 2008).
Data Manipulation: Reviewers can trace how data is processed or manipulated, ensuring harmful data doesn't compromise the system.
Steps and Examples:
Identify Input Points: Start by locating every point where the application accepts data. This includes form inputs, URL parameters, API endpoints, and more. For example, photo-sharing app might allow users to upload images, add comments, and share links. Each of these is a point of input that needs scrutiny.
Trace Data Processing: Once the input points are identified, trace how this data is processed. Look at validation, sanitization, and transformation functions. Example: For search functionality on an e-commerce site, reviewers should check how search queries are processed. If the application directly uses this input to query the database, it might be vulnerable to SQL injection. Proper validation and parameterized queries can mitigate this.
Review Data Storage: Examine how and where user data is stored. Check for encryption methods, especially for sensitive data. Example: If a banking application stores user transaction history, this data must be encrypted. A reviewer should verify if state-of-the-art encryption methods are used and if encryption keys are safely managed.
Assessing Data Retrieval and Display: Review how data is retrieved and displayed to users. Ensure user data isn't mistakenly treated as executable code. Example: In a forum application, if user comments are displayed without proper encoding, it might become a breeding ground for stored XSS attacks. Reviewers should ensure that user data is safely encoded before being displayed.
Detecting Potential XSS Hotspots
Cross-Site Scripting (XSS) remains one of the most frequent web security vulnerabilities, where attackers inject malicious scripts into content that then gets served to end-users. Let's explore how to detect potential XSS hotspots (OWASP, 2021).
1. Spotting Places Where User Input is Taken
User input is a double-edged sword. While it's necessary for the functionality of many applications, it's also the primary vector attackers use to exploit vulnerabilities. Identifying where user input is taken is the first step in detecting potential XSS hotspots (Wang et al., 2018).
Description: Any place on a website or application where users can enter information can be a potential vector for an XSS attack.
Example: Consider a simple login page with fields for a username and password. If these inputs aren't properly sanitized, an attacker could enter malicious scripts instead of genuine credentials.
Description: Data passed through URLs can be exploited, especially if the application renders or processes URL parameters without sanitizing them.
Example: A search feature on a website might use URL parameters to display results (e.g., www.example.com/search?query=laptop). If the query parameter isn't correctly sanitized, it could be modified to www.example.com/search?query=<script>maliciousCode();</script>, executing the script.
Description: While less common, HTTP headers can also be used to inject malicious content. Especially in applications that use headers for custom processing tasks.
An application might use unique headers, such as X-App-UserInfo, to display user information on a webpage. If this header is manipulated without proper sanitization, it can lead to an XSS vulnerability.
2. Identifying Where This Input is Later Used or Rendered on the Webpage
Once the input is accepted by the application, the potential danger arises if it is processed or displayed without sufficient security measures. Identifying how and where this data is used is critical (Bates et al., 2010).
a) Direct Rendering:
Description: If the user input is directly displayed on the web page without proper validation and sanitization, it becomes a potential XSS hotspot.
Example: On a forum, when a user posts a comment, if the application doesn't sanitize the content before rendering it on the page, a malicious actor can post a comment with embedded scripts, which then get executed in other users' browsers.
c) Dynamic Page Components:
Description: Modern web applications use dynamic components, such as those in React, Angular, or Vue. These components can render user data based on certain triggers or states.
Example: In a chat application, every time a user sends a message, it might be rendered as a new chat bubble on the page. If the content isn't sanitized and encoded properly, a message containing a script can execute every time it's displayed.
d) DOM Manipulation:
Description: The Document Object Model (DOM) represents the structure of an HTML document. Manipulating the DOM is standard for dynamic content changes, but when done using unsanitized user input, it can lead to DOM-based XSS.
Example: Consider a webpage that displays user data by directly setting the innerHTML of an element based on user input. This method can allow an attacker to inject malicious scripts if the input isn't sanitized.
Reviewing Data Validation and Sanitization
Data validation and sanitization are essential components in creating secure web applications. These practices ensure that user data is safe to process and display, reducing the chances of malicious attacks, such as Cross-Site Scripting (XSS) (OWASP, 2021).
1. Ensuring that All User Input is Strictly Validated Against a Known Safe Pattern
What it means: Data validation involves checking user input to ensure it conforms to expected patterns. The principle "reject by default, allow by exception" should be applied. Instead of defining what's malicious, define what's safe and deny everything else (McClure & Krüger, 2012).
Steps and Examples:
Determine Expected Data Type: Define the specific type of data you expect, whether it's a string, number, date, etc. Reject any data that doesn't fit the mold. Example: If you're expecting a date in the format "YYYY-MM-DD", any input not matching this pattern should be rejected.
Length Checks: Set maximum and minimum lengths for inputs, ensuring that buffers aren't overflowed or databases aren't flooded with oversized data (Endler, 2002). Example: For a username field, you might set a minimum of 3 characters and a maximum of 20.
Pattern Matching: For strings, use regular expressions to strictly define what characters and sequences are allowed. Example: For an email input, a regular expression can be used to ensure the data contains characters like '@' and '.', and follows the general pattern of an email address.
Range Checks: For numerical inputs, define acceptable ranges. Example: For an age input on a registration form, valid values might be between 0 and 130.
Whitelisting: Define a list of acceptable values and reject anything not on the list. Example: For a dropdown menu where users select their country, only allow input values that match the given country options.
Blacklisting (with caution): While blacklisting, or defining what's not allowed, can be useful, it should be secondary to whitelisting. Attackers can often find ways around blacklisted values (Stuttard & Pinto, 2011). Example: If you blacklist certain words or characters in a forum post, attackers might use encoding or other methods to bypass the filter.
2. Checking if the Application Sanitizes or Encodes User Data Before It Is Displayed
What it means: Sanitization involves cleaning or modifying user data to remove potentially harmful content. Encoding involves converting characters into a safe format so they're displayed as data and not interpreted as code (Scandariato et al., 2015).
Steps and Examples:
HTML Encoding: Convert characters like '<' and '>' into their safe HTML equivalents (< and >) to prevent them from being treated as code. Example: If a user tries to submit the input "<script>alert('XSS!');/script>", proper HTML encoding would render it as text on the webpage and not execute the script.
Database Output Sanitization: Just as you sanitize input, sanitize data coming out of the database before displaying it, especially if it initially came from user input (Halfond et al., 2006). Example: For a review site, comments stored in a database should be sanitized upon retrieval and display, ensuring that any previously stored malicious content doesn't harm users.
Use Built-in Functions: Many frameworks and libraries offer built-in functions for sanitizing and encoding data. Utilize these, as they often adhere to best practices and are updated regularly (PHP Manual, 2019). Example: In PHP, the htmlspecialchars() function can be used to convert special characters to their HTML entities, mitigating potential XSS attacks.
1. Watch Out for the Use of eval() or document. write() with Untrusted Data
The Danger of eval():
// Assuming URL is http://example.com?value=5*5 var result = eval(decodeURIComponent(window.location.search.split('=')));
An attacker could change the URL to http://example.com?value=alert(document.cookie) to display cookies to the user.
Best Practice: Avoid using eval(). If dynamic code execution is necessary, seek safer alternatives or ensure the data passed to eval() is thoroughly sanitized and validated.
The Risks of document.write():
Description: document.write() writes a string as HTML content to a document. If not sanitized, it can be a vector for XSS attacks (OWASP, 2020).
Example: Consider a website that displays a user's name by extracting it from the URL.
// Assuming URL is http://example.com?name=John document.write("Hello, " + decodeURIComponent(window.location.search.split('=')));
An attacker might modify the URL to http://example.com?name=<script>alert('Hacked');</script>, leading to an XSS exploit.
Best Practice: Avoid documents. write(). Instead, use safer DOM manipulation methods like textContent or innerText.
Recognizing the Importance of Updated Libraries:
Description: Even well-maintained libraries can have vulnerabilities discovered over time. Developers fix these vulnerabilities in newer versions. Therefore, keeping libraries updated is crucial.
Using Reliable Vulnerability Databases:
Automated Tools for Dependency Checking:
Description: There are tools that can automatically scan a project's dependencies to check for known vulnerabilities.
Example: npm audit is a command-line tool for Node.js projects that checks project dependencies against a database of known vulnerabilities. Similarly, tools like Snyk offer broader language support and continuous monitoring capabilities.
Being Wary of Abandoned Libraries:
Description: A library that hasn't been updated in a long time might be abandoned, meaning potential vulnerabilities might not get addressed.
Example: A datepicker library last updated five years ago may work fine functionally but could contain security issues that will never be fixed. It would be wiser to choose a more recently maintained alternative.
Security Policy (CSP)
The modern web landscape is a complex ecosystem of interlinked resources. While this interconnectivity offers enhanced user experiences, it also opens the door to various security vulnerabilities, notably Cross-Site Scripting (XSS) (Stuttard & Pinto, 2016). One critical tool introduced to mitigate such vulnerabilities is the Content Security Policy (CSP).
Understanding the Benefits of CSP
Mitigation of XSS Attacks:
Description: XSS attacks take place when attackers insert malicious scripts into web pages, which users' browsers then execute. CSP can effectively block the execution of unauthorized scripts, thereby mitigating potential XSS threats (OWASP, 2020).
Example: Without CSP, a malicious actor might exploit a comment section on a blog, posting a comment containing a script that steals user cookies. With an appropriately configured CSP, the browser would block the script's execution, protecting users.
Control Over Resources:
Description: CSP enables web administrators to specify which external resources (such as scripts, images, and stylesheets) the webpage can load and execute (West, 2016).
Example: If a website only loads scripts from its own domain and a trusted CDN, the CSP can be set to only allow script loads from those two sources. This way, even if an attacker can inject a script tag pointing to a malicious server, the browser will block it due to the CSP directive.
Prevention of Mixed Content Issues:
Description: Mixed content refers to loading resources over HTTP on an HTTPS site. This can be a security risk as unencrypted resources can be tampered with. CSP can block or report attempts to load such resources (Hodges et al., 2012).
Example: On a shopping site with HTTPS, if a product image gets loaded over HTTP, not only does it compromise the integrity of the encrypted page, but it might also make users wary due to browser warnings. A CSP can enforce that all content must be loaded over HTTPS, preventing these issues.
Description: Apart from enforcing security rules, CSP can also be configured to send reports when policy violations occur. This provides insights into potential attack attempts or misconfigurations (Weichselbaum et al., 2016).
Example: If an external developer inadvertently tries to load a new script from an unauthorized domain, the CSP will block it, and the configured report-uri can capture this violation, alerting the administrators.
Reviewing if the Application has a Well-defined CSP and if it Helps Mitigate Potential XSS
For organizations serious about web security, simply having a CSP is not enough. It must be appropriately configured, regularly reviewed, and updated to suit the evolving needs of the application.
1. Checking for the existence of CSP:
Description: The first step is to ascertain if the application has a CSP in place. This can typically be seen in the HTTP headers as "Content-Security-Policy" (Zalewski, 2013).
Example: Using browser developer tools, one can inspect the response headers of a website. A well-defined CSP might look like this:
Content-Security-Policy: default-src 'self'; script-src 'self' cdn.trusted.com; img-src 'self' img.trusted.com;
2. Evaluating Directives and Sources:
Description: The CSP comprises various directives, each governing a type of resource. These directives should be examined to ensure they're appropriately restrictive.
Example: If a website doesn't require inline scripts (scripts embedded directly in the HTML), the CSP should have the script-src directive set without allowing 'unsafe-inline'.
3. Testing for Bypasses and Misconfigurations:
Description: A misconfigured CSP can provide a false sense of security. Regularly testing and updating the policy ensures it's genuinely effective (Hausknecht et al., 2018).
Example: A directive like script-src * would allow scripts to be loaded from any source, making it ineffective against XSS threats. It should be narrowed down to specific trusted sources.
4. Employing Reporting for Continuous Monitoring:
Description: Use the CSP reporting feature to gather insights into violations. It can be a powerful tool to detect and rectify issues proactively.
Example: By setting up a directive like report-uri /csp-report-endpoint, the application can collect data on every CSP violation, helping itoidentifying potential security threats or misconfigurations in real-time.
Tips for Developers
In today's digital era, where rapid software development is a necessity, security can often be overlooked. However, incorporating safe coding practices from the outset not only prevents potential breaches but can also save time and money in the long run. Here are some crucial tips and best practices developers should adopt.
1. Using Parameterized Queries or Prepared Statements
The Threat of SQL Injection:
SQL injection remains one of the most prevalent and dangerous web vulnerabilities. It occurs when unsanitized user input is directly incorporated into SQL statements, allowing attackers to execute arbitrary SQL code (OWASP, 2021).
Consider a simple login mechanism:
query = "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'";
An attacker could provide admin'; -- as the username, rendering the query as:
SELECT * FROM users WHERE username='admin'; -- ' AND password=''
The -- comments out the rest, granting unintended access.
Mitigation: Parameterized Queries & Prepared Statements:
Instead of dynamically constructing SQL queries, developers should use parameterized queries or prepared statements (Bisht et al., 2008).
Example using Parameterized Queries (Python with SQLite):
cursor.execute("SELECT * FROM users WHERE username=? AND password=?", (username, password))
Example using Prepared Statements (PHP with MySQLi):
$stmt = $conn->prepare("SELECT * FROM users WHERE username=? AND password=?"); $stmt->bind_param("ss", $username, $password); $stmt->execute();
These methods ensure user input is always treated as data and not executable code.
2. Always Encode Data When Rendering It
The Threat of XSS (Cross-Site Scripting):
When unsanitized user input is rendered directly on a webpage, it can be exploited to run malicious scripts (Huang et al., 2003).
Example: A website displaying user comments might take user input and directly insert it into the page.
<div>Comment:?= $_div>Comment:?= $_GET['comment']?>/div>
An attacker can input <script>alert('XSS');/script> as a comment, which would execute when viewed.
Solution: Encoding Data
Example for HTML Encoding (PHP):
<div>Comment:?= htmlspecialchars($_GET['comment'], ENT_QUOTES, 'UTF-8') ?> </div>
This will render any HTML characters harmless by converting them into their corresponding HTML entities.
3. Being Wary of Third-party Components
The Mixed Bag of Third-Party Components:
Third-party libraries and components can speed up development, but they can also introduce vulnerabilities if not carefully vetted (Deshotels, 2014).
Scenario: A project might use a third-party image processing library that has an undiscovered vulnerability. An attacker exploiting this can compromise the application.
Solution: Due Diligence and Monitoring
Before integrating third-party components, developers should:
Check the component's security track record.
Review its source code if available.
Stay updated with vulnerability databases like CVE (Common Vulnerabilities and Exposures) (MITRE, 2021).
4. Regularly Updating Libraries and Frameworks to Patched Versions
a) The Danger of Outdated Libraries:
Outdated libraries can have known vulnerabilities. Using them is akin to leaving the doors unlocked (Carnegie Mellon University, 2020).
Mitigation: Regular Updates and Dependency Checks:
Use tools to check and update dependencies regularly.
Example for Node.js: Using npm outdated, developers can see which packages have updates. An npm audit can be used to detect known vulnerabilities in the dependencies.
Subscribe to mailing lists or forums related to the libraries and frameworks in use. This way, developers get timely notifications of any security updates
Wrapping Things Up
Upholding the Gold Standard in Application Security
The digital era has brought forth unprecedented advancements, connecting the world through intricate webs of applications and systems. While these systems enable convenience and productivity, they also become potential targets for malicious actors. In such a scenario, application security isn't just a luxury; it's an imperative.
1. The Importance of Continuous Security Training
Keeping Pace with Evolving Threats: Cyber threats are not static; they evolve. As newer technologies emerge, so do sophisticated attack vectors. Developers can't rest on past knowledge. Continuous security training ensures they're abreast of current vulnerabilities and mitigation techniques.
Building a Security-First Mindset: Regular training instills a mindset where security is not an afterthought but an integral part of the development process. When developers routinely think about potential security pitfalls, they naturally write more secure code.
Mitigating Human Error: Many breaches result from simple oversights. Continuous training acts as a reminder, reducing the likelihood of such oversights and emphasizing the importance of meticulous coding practices.
2. Encouraging Routine Security Code Reviews
Catching Vulnerabilities Early: Regular security code reviews can identify and rectify vulnerabilities during the development phase, well before the code reaches production. Early detection not only prevents potential breaches but also saves time and resources in the long run.
Fostering Collaboration: Routine reviews promote a culture of collaboration. Developers learn from each other, sharing insights and knowledge about security best practices. This team-based approach to security can fortify applications significantly.
Continuous Improvement: Over time, regular reviews lead to improved coding practices. As vulnerabilities are spotted and rectified, developers become more adept at writing secure code from the outset.
The world of application development is akin to an ongoing race between developers and cybercriminals. To stay ahead, developers must treat security as a continuous journey, not a destination. By investing in continuous training and making security code reviews a routine practice, organizations not only safeguard their applications but also earn the trust of their users—a currency more valuable than ever in today's digital age.
OWASP. (2021). OWASP Top Ten. Retrieved from https://owasp.org/www-project-top-ten/
Acunetix. (n.d.). Cross-site Scripting (XSS). Retrieved from https://www.acunetix.com/websitesecurity/cross-site-scripting/
PortSwigger. (n.d.). Cross-site Scripting (XSS). Web Security Academy. Retrieved from https://portswigger.net/web-security/cross-site-scripting
Digital Guardian. (2019). What is Cross-Site Scripting. Retrieved from https://digitalguardian.com/blog/what-cross-site-scripting
Netsparker. (2020). The Danger of Persistent XSS. Retrieved from https://www.netsparker.com/blog/web-security/persistent-xss/
Symantec. (2018). FormBook Info Stealer Is Active in Multiple Malvertising Attacks. Retrieved from https://www.symantec.com/blogs/threat-intelligence/formbook-malvertising
Kaspersky. (2021). What is Phishing?. Retrieved from https://www.kaspersky.com/resource-center/definitions/phishing
Veracode. (n.d.). Stored XSS Attacks. Retrieved from https://www.veracode.com/security/stored-xss
Imperva. (n.d.). Reflected XSS. Retrieved from https://www.imperva.com/learn/application-security/reflected-xss-attacks/
OWASP. (n.d.). DOM-Based XSS. Retrieved from https://owasp.org/www-community/attacks/DOM_Based_XSS
Spinellis, D. (2003). Code reading: The open-source perspective. Addison-Wesley.
Chacon, S., & Straub, B. (2014). Pro Git. Apress.
Newman, S. (2015). Building Microservices. O'Reilly Media.
Humble, J., & Farley, D. (2010). Continuous Delivery. Addison-Wesley.
Redgate. (2019). SQL Provision. Retrieved from https://www.red-gate.com/products/sql-development/sql-provision/index
Yevgeniy, B., & Jeff, N. (2017). Kubernetes Up and Running. O'Reilly Media.
Chess, B., & West, J. (2007). Secure Programming with Static Analysis. Addison-Wesley.
Checkmarx. (2020). About Checkmarx. Retrieved from https://www.checkmarx.com
Micro Focus. (2019). Fortify. Retrieved from [https://www.microfocus.com/en-us/solutions/application
Bosu, A., Greiler, M., & Bird, C. (2015). Characteristics of Useful Code Reviews: An Empirical Study at Microsoft. Microsoft Research, MSR-TR-2015-29.
Garousi, V., Küçük, B., & Felderer, M. (2017). Software architecture review: The state of practice. Computer Science and Information Systems, 14(2), 493-538.
Wurster, G., & van Oorschot, P.C. (2008). The Developer is the Enemy. New Security Paradigms Workshop.
OWASP. (2021). OWASP Top Ten Web Application Security Risks. OWASP Foundation.
Wang, R., Chen, S., Wang, X., & Qadeer, S. (2018). How to Shop for Free Online - Security Analysis of Cashier-as-a-Service Based Web Stores. IEEE Symposium on Security and Privacy.
Bates, D., Barth, A., & Jackson, C. (2010). Regular Expressions Considered Harmful in Client-Side XSS Filters. Web 2.0 Security and Privacy (W2SP).
OWASP. (2021). OWASP Top Ten Web Application Security Risks. OWASP Foundation.
McClure, R. & Krüger, I.H. (2012). SQL DOM: Compile Time Checking of Dynamic SQL Statements. International Conference on Software Engineering.
Endler, D. (2002). The Evolution of Cross Site Scripting Attacks. TippingPoint.
Stuttard, D., & Pinto, M. (2011). The Web Application Hacker's Handbook: Finding and Exploiting Security Flaws. Wiley.
Scandariato, R., Walden, J., & Joosen, W. (2015). Static Analysis of Source Code Security: Assessment of Tools against SAMATE Tests. Journal of Software: Evolution and Process.
Halfond, W. G., Viegas, J., & Orso, A. (2006). A Classification of SQL-Injection Attacks and Countermeasures. IEEE International Symposium on Secure Software Engineering.
PHP Manual. (2019). htmlspecialchars. PHP Documentation Group.
Zhang, Y., Lo, D., Xia, X., & Sun, J. (2014). Towards more accurate statistical modeling of security vulnerabilities. IEEE International Conference on Software Analysis, Evolution and Reengineering.
Miller, M. S. (1997). Safe Programming at the C Level. Proceedings of the 20th National Information Systems Security Conference.
OWASP. (2020). OWASP Top Ten Web Application Security Risks. OWASP Foundation.
Lau, W. (2009). Secure your Node.js web application: Keep attackers out and users happy. Pragmatic Programmers.
Stuttard, D., & Pinto, M. (2016). The Web Application Hacker's Handbook: Finding and Exploiting Security Flaws. John Wiley & Sons.
OWASP. (2020). Cross-Site Scripting (XSS). OWASP Foundation.
West, M. (2016). Content Security Policy Level 2. W3C.
Hodges, J., Jackson, C., & Barth, A. (2012). HTTP Strict Transport Security (HSTS). IETF.
Weichselbaum, L., Spagnuolo, M., Lekies, S., & Janc, A. (2016). CSP Is Dead, Long Live CSP! On the Insecurity of Whitelists and the Future of Content Security Policy. ACM Conference on Computer and Communications Security.
Zalewski, M. (2013). The Tangled Web: A Guide to Securing Modern Web Applications. No Starch Press.
Hausknecht, D., Sabry, A., & Zeldovich, N. (2018). Semantic-based automated reasoning for AWS access policies using SMT. IEEE European Symposium on Security and Privacy.
OWASP. (2021). SQL Injection. OWASP Foundation. Retrieved from https://owasp.org/www-community/attacks/SQL_Injection
Bisht, P., Hinrichs, T., & Skrupsky, N. (2008). NoTamper: Automatic Blackbox Detection of Parameter Tampering Opportunities in Web Applications. ACM Conference on Computer and Communications Security.
Huang, Y., Yu, F., Hang, C., Tsai, C., Lee, D., & Kuo, S. (2003). Securing Web Application Code by Static Analysis and Runtime Protection. 13th International Conference on World Wide Web.
Deshotels, L. (2014). Vulnerabilities in Third-party Managed Code. Black Hat USA.
MITRE. (2021). Common Vulnerabilities and Exposures (CVE). MITRE Corporation. Retrieved from https://cve.mitre.org/
Carnegie Mellon University. (2020). Vulnerability Notes Database. CERT Coordination Center. Retrieved from https://www.kb.cert.org/vuls/