|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
AntiSamy による HTML/CSS のサニタイズユーザーからの入力として HTML を受け取る場合には、通常その HTML に意図せぬ JavaScript などが埋め込まれないようにデータをチェックします。 これをデータのサニタイズ (sanitize) といいます。 OWASP AntiSamy を利用すると HTML/CSS をサニタイズできます。 ポリシーファイルOWASP AntiSamy ではポリシーファイルを変更することによって、サニタイズをどのように実施するか定義できます。 事前に定義されたポリシーファイルは次の通りです。
上記ポリシーファイルをテンプレートとして、値を設定します。
使用方法
次の例では、テキストファイルから HTML データを読み込んで、それをサニタイズして出力しています。
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy;
import org.owasp.validator.html.PolicyException;
import org.owasp.validator.html.ScanException;
public class TestApp1 {
public static void main(String[] args)
throws PolicyException, ScanException, IOException {
String htmlText = readFileAsString(
"C:/owasp/test/test1.html");
Policy policy = Policy.getInstance(
"C:/owasp/antisamy/antisamy-ebay-1.4.1.xml");
AntiSamy as = new AntiSamy();
CleanResults cr = as.scan(htmlText, policy);
System.out.println(cr.getCleanHTML());
}
private static String readFileAsString(String filePath)
throws java.io.IOException{
StringBuffer fileData = new StringBuffer(1000);
BufferedReader reader = new BufferedReader(
new FileReader(filePath));
char[] buf = new char[1024];
int numRead=0;
while((numRead=reader.read(buf)) != -1){
String readData = String.valueOf(buf, 0, numRead);
fileData.append(readData);
buf = new char[1024];
}
reader.close();
return fileData.toString();
}
}
ディレクティブの設定とサニタイズ後の値antisamy-ebay-1.4.1.xml ポリシーファイルをベースとしてディレクティブを変更して、 どのように出力が変わるかみてみましょう。 変換前の HTML スニペットは次の通りです。
<script type="text/javascript">
alert('Hello, JavaScript');
</script>
<style type="text/css">
h1 { color: blue; }
</style>
<h1>Hello, AntiSamy!</h1>
<!-- Comment -->
<p style="color:red;">これはテストです。</p>
<p>
<a href="http://www.google.com">Google</a>
</p>
また、antisamy-ebay-1.4.1.xml の元のディレクティブは次のように設定されています。 <directives> <directive name="omitXmlDeclaration" value="true"/> <directive name="omitDoctypeDeclaration" value="true"/> <directive name="maxInputSize" value="20000"/> <directive name="useXHTML" value="true"/> <directive name="formatOutput" value="true"/> <directive name="embedStyleSheets" value="false"/> </directives> 既定の設定による変換antisamy-ebay-1.4.1.xml ポリシーファイルそのままで上記 HTML を変換すると、 次のようになります。
<style type="text/css"><![CDATA[h1 {
color: blue;
}
]]></style>
<h1>Hello, AntiSamy!</h1>
<p style="color: red;">これはテストです。</p>
<p>
<a href="http://www.google.com">Google</a>
</p>
確かに JavaScript コード、コメントが削除されていることがわかります。 ディレクティブの変更useXHTML を false にして、さらに nofollowAnchors を追加し、値を true にしてみましょう。 <directives> <directive name="omitXmlDeclaration" value="true"/> <directive name="omitDoctypeDeclaration" value="true"/> <directive name="maxInputSize" value="20000"/> <directive name="useXHTML" value="false"/> <directive name="formatOutput" value="true"/> <directive name="embedStyleSheets" value="false"/> <directive name="nofollowAnchors" value="true"/> </directives> 変換後の結果は次の通りです。 <style type="text/css">h1 { color: blue; } </style> <h1>Hello, AntiSamy!</h1> <p style="color: red;">これはテストです。</p> <p> <a href="http://www.google.com" rel="nofollow">Google</a> </p> デフォルトの変換結果と比べて、赤くマークした部分が正しく変わっていることがわかります。 尚、pre タグなどを許可して改行文字を認める場合以外は、次のようにして余計な改行も削除すると良いです。
String cleanHTML = cr.getCleanHTML();
cleanHTML = cleanHTML.replaceAll("(\\r|\\n)", "");
|
|
© 2010 Java 入門 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||