blob: 3d44a29332afc485ddda016ea26740f83887eada [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta name="generator" content=
"HTML Tidy for Linux (vers 25 March 2009), see www.w3.org">
<title>Checker Framework Tutorial - Security Error - Command
Line</title>
<link href="bootstrap/css/bootstrap.css" rel="stylesheet" type=
"text/css">
<script type="text/javascript" src="bootstrap/js/bootstrap.min.js">
</script>
<link href="css/main.css" rel="stylesheet" type="text/css">
<link rel="icon" type="image/png" href=
"https://checkerframework.org/favicon-checkerframework.png">
</head>
<body>
<div class="top_liner"></div>
<div class="navbar navbar-inverse navbar-fixed-top" style=
"border-bottom: 1px solid #66d;">
<div class="navbar-inner">
<div class="contained">
<ul class="nav">
<li class="heading">Checker Framework:</li>
<li><a href="https://checkerframework.org/">Main Site</a></li>
<li><a href=
"https://checkerframework.org/manual/">
Manual</a></li>
<li><a href=
"https://groups.google.com/forum/#!forum/checker-framework-discuss">
Discussion List</a></li>
<li><a href=
"https://github.com/typetools/checker-framework/issues">Issue
Tracker</a></li>
<li><a href=
"https://github.com/typetools/checker-framework">Source
Code</a></li>
<li class="active"><a href=
"https://checkerframework.org/tutorial/">Tutorial</a></li>
</ul>
</div>
</div>
</div><img src="https://checkerframework.org/CFLogo.png" alt="Checker Framework logo">
<div class="page-header short" style=
"border-bottom: 1px solid #EEE; border-top: none;">
<h1>Checker Framework Tutorial</h1>
<h2><small>Previous <a href="user-input-cmd.html">Validating User
Input</a></small></h2>
</div>
<div id="introduction">
<div class="page-header short" style="border-top: none;">
<h2>Finding a Security Error</h2>
</div>
<p>This example uses the Tainting Checker to verify that user input
does not contain SQL statements, thus preventing SQL injection. (If
you have not already done so, download <a href=
"../sourcefiles.zip">the tutorial sourcefiles</a>.)</p>
<div class="well">
<h5>Outline</h5>
<ol>
<li><a href="#run1">Run the Tainting Checker &mdash; 1 error
found</a></li>
<li><a href="#error1">Correct the error</a></li>
<li><a href="#run2">Re-run the Tainting Checker &mdash; a new error is
found</a></li>
<li><a href="#error2">Correct the new error</a></li>
<li><a href="#run3">Re-run the Tainting Checker &mdash; no errors</a></li>
</ol>
</div>
<div id="run1">
<h4>1. Run the Tainting Checker &mdash; 1 error found</h4>
<p>Run the buildfile:
<br/> (The Ant buildfile
makes use of the <a href=
"https://checkerframework.org/manual/#ant-task">
Checker Framework support for Ant</a>.)</p>
<pre>
$ <b>cd personalblog-demo</b>
$ <b>ant</b>
Buildfile: .../personalblog-demo/build.xml
clean:
check-tainting:
[mkdir] Created dir: .../personalblog-demo/bin
[cf.javac] Compiling 2 source files to .../personalblog-demo/bin
[cf.javac] javac 1.8.0-jsr308-3.12.0
[cf.javac] .../personalblog-demo/src/net/eyde/personalblog/service/PersonalBlogService.java:175: error: incompatible types in argument.
[cf.javac] "where post.category like '%", category,
[cf.javac] ^
[cf.javac] found : @Tainted String
[cf.javac] required: @Untainted String
[cf.javac] 1 error
BUILD FAILED
.../personalblog-demo/build.xml:35: Compile failed; see the compiler error output for details.
Total time: 2 seconds
</pre>
<p>The checker issues an error for <code>getPostsByCategory()</code>
because the possibly-tainted string <code>category</code> is used in
the query construction. This string could contain SQL statements
that could taint the database. The programmer must ensure that
<code>category</code> does not contain malicious SQL code.</p>
</div>
<div id="error1">
<h4>2. Correct the Error</h4>
<p>To correct this error, <b>add <code>@Untainted</code></b> to the
type of the <code>category</code> parameter.</p>
<pre>
public List&lt;?&gt; getPostsByCategory(<b>@Untainted</b> String category) throws ServiceException {
</pre>This forces clients to pass an <code>@Untainted</code> value, which
was the intention of the designer of the <code>getPostsByCategory</code>
method.
</div>
<div id="run2">
<h4>3. Re-run the Tainting Checker &mdash; a new error is found</h4>
<p>Run the Tainting Checker again.</p>
<pre>
$ <strong>ant</strong>
Buildfile: .../personalblog-demo/build.xml
clean:
[delete] Deleting directory .../personalblog-demo/bin
check-tainting:
[mkdir] Created dir: .../personalblog-demo/bin
[cf.javac] Compiling 2 source files to .../personalblog-demo/bin
[cf.javac] javac 1.8.0-jsr308-3.12.0
[cf.javac] .../personalblog-demo/src/net/eyde/personalblog/struts/action/ReadAction.java:58: error: incompatible types in argument.
[cf.javac] pblog.getPostsByCategory(reqCategory));
[cf.javac] ^
[cf.javac] found : @Tainted String
[cf.javac] required: @Untainted String
[cf.javac] 1 error
BUILD FAILED
.../personalblog-demo/build.xml:35: Compile failed; see the compiler error output for details.
Total time: 2 seconds
</pre>
<p>There is an error in <code>ReadAction.executeSub()</code>, which
is a client of <code>getPostsByCategory</code>. The
<code>reqCategory</code> is accepted from the user (from request
object) without validation.</p>
</div>
<div id="error2">
<h4>4. Correct the New Error</h4>To correct, <b>use the
<code>validate</code> method</b> as shown below.
<pre>
String reqCategory = <b>validate(</b>cleanNull(request.getParameter("cat"))<b>)</b>;
</pre>
</div>
<div id="run3">
<h4>5. Re-run the Tainting Checker &mdash; no errors</h4>
<p>There should be no errors.</p>
<pre>
$ <strong>ant</strong>
Buildfile: .../personalblog-demo/build.xml
clean:
[delete] Deleting directory .../personalblog-demo/bin
check-tainting:
[mkdir] Created dir: .../personalblog-demo/bin
[cf.javac] Compiling 2 source files to .../personalblog-demo/bin
[cf.javac] javac 1.8.0-jsr308-3.12.0
BUILD SUCCESSFUL
Total time: 2 seconds
</pre>
<p>You are done with the personalblog-demo project,
so return to the parent directory</p>
<pre>
$ <strong>cd ..</strong>
</pre>
<p>For a complete discussion of how to use the Tainting Checker,
please read the <a href=
"https://checkerframework.org/manual/#tainting-checker">
Tainting Checker chapter</a> in the Checker Framework manual.</p>
</div>
</div>
<div id="installation">
<div class="page-header short">
<h2><small>Next, try <a href="encryption-checker-cmd.html">Writing
an Encryption Checker</a> or return to the <a href=
"../index.html">main page</a> of the Tutorial.</small></h2>
</div>
</div><!--
<div class="bottom_liner well">
<a href="#">Top</a>
</div>
-->
<!-- LocalWords: Plugin plugin VM SDK plugins quals classpath
-->
<!-- LocalWords: NullnessChecker plugin's hg
-->
</body>
</html>