
JSON नियमों के माध्यम से अनुकूलन योग्य Java बाइटकोड विश्लेषक
Java बाइटकोड विश्लेषक जो JSON नियमों के माध्यम से अनुकूलन योग्य है। यह एक कमांड-लाइन उपकरण है जो एक या अधिक Jar या War फ़ाइलों वाले पथ को प्राप्त करता है, प्रदान किए गए नियमों का उपयोग करके उनका विश्लेषण करता है और परिणामों के साथ HTML रिपोर्ट उत्पन्न करता है।
usage: java -jar cba-cli.jar [OPTIONS] -a DIRECTORY_TO_ANALYZE
-a,--analyze <pathToAnalyze> Path of the directory to run the
analysis.
-c,--checks <checks...> Space separated list of custom checks
that are going to be run in the analysis.
-f,--custom-file <customFile> Specify a file in JSON format to run
custom rules. Read more in
https://github.com/fergarrui/custom-bytecode-analyzer.
-h,--help Print this message.
-i,--items-report <maxItems> Max number of items per report. If the
number of issues found exceeds this
value, the report will be split into
different files. Useful if expecting too
many issues in the report. Default: 50.
-o,--output <outputDir> Directory to save the report. Warning -
if there are already saved reports in
this directory they will be overwritten.
Default is "report".
-v,--verbose-debug Increase verbosity to debug mode.
-vv,--verbose-trace Increase verbosity to trace mode - makes it slower, use it only when you need.
नियम फ़ाइल को -f,--custom-file तर्क का उपयोग करके निर्दिष्ट किया जा सकता है। फ़ाइल JSON प्रारूप में है और इसमें निम्नलिखित संरचना है:
final होआप Java कोड में संरचना देखने के लिए net.nandgr.cba.custom.model.Rules.java भी देख सकते हैं।
निर्देशिका examples में पहले से कई नियम मौजूद हैं। वैसे भी, नीचे प्रत्येक नियम के लिए उदाहरण सूचीबद्ध हैं।
यदि हमें कस्टम डिसीरियलाइज़ेशन वाली कक्षाओं को खोजने की आवश्यकता है, तो हम इसे काफी आसानी से कर सकते हैं। एक क्लास private void readObject(ObjectInputStream in) लागू करके कस्टम डिसीरियलाइज़ेशन को परिभाषित करती है। इसलिए हमें केवल उन सभी कक्षाओं को खोजने की आवश्यकता है जहाँ वह विधि परिभाषित है। एक नियम को इस प्रकार परिभाषित करना पर्याप्त होगा:
{
"rules": [{
"name": "Custom deserialization",
"methods": [{
"name": "readObject",
"visibility": "private",
"parameters" : [{
"type" : "java.io.ObjectInputStream"
}]
}]
}]
}
यह private दृश्यता, readObject नाम और java.io.ObjectOutputStream प्रकार के पैरामीटर वाली विधियों की रिपोर्ट करेगा। पैरामीटर एक सरणी हैं, यदि एक से अधिक निर्दिष्ट हैं, तो रिपोर्ट किए जाने के लिए सभी का मेल होना चाहिए। चूँकि हमारे पास केवल एक नियम है, इसलिए नामक एक रिपोर्ट: custom-deserialization-0.html बनाई जाएगी।
इस मामले में, दो विधियों वाला एक नियम परिभाषित किया जाना चाहिए। डिसीरियलाइज़ेशन के लिए पिछले उदाहरण के समान, और private void writeObject(ObjectOutputStream out) से मिलान करने के लिए एक नया। जैसा कि ऊपर JSON संरचना में दिखाया गया है, गुण rules.rule.methods विधियों की एक सरणी है, इसलिए इस तरह एक नियम लिखा जा सकता है:
{
"rules": [{
"name": "Custom serialization and deserialization",
"methods": [{
"name": "readObject",
"visibility": "private",
"parameters" : [{
"type" : "java.io.ObjectInputStream"
}]
},{
"name": "writeObject",
"report": "false",
"visibility": "private",
"parameters" : [{
"type" : "java.io.ObjectOutputStream"
}]
}]
}]
}
गुण report को false पर सेट किया गया था ताकि एक ही नियम के लिए दो बार रिपोर्ट करने से बचा जा सके। हम दूसरी विधि का उपयोग केवल एक शर्त के रूप में कर रहे हैं, लेकिन केवल readObject विधियों की रिपोर्ट करना इस नियम के उद्देश्य के लिए पर्याप्त होना चाहिए।
यदि कोई गुण परिभाषित नहीं है, तो यह हमेशा true के रूप में मेल खाएगा। उदाहरण के लिए, यह नियम सभी विधि परिभाषाएँ लौटाएगा:
{
"rules": [{
"name": "Method definitions",
"methods": [{
}]
}]
}
विधि आह्वान भी पाए जा सकते हैं। इस मामले में JSON होगा:
{
"rules": [{
"name": "String equals",
"invocations": [{
"owner": "java.lang.String",
"method": {
"name": "equals"
}
}]
}]
}
गुण owner विधि वाले वर्ग को निर्दिष्ट करता है।
पिछले की तुलना में थोड़ा अधिक उपयोगी एक और विधि आह्वान उदाहरण:
{
"rules": [{
"name": "Method invocation by reflection",
"invocations": [{
"owner": "java.lang.reflect.Method",
"method": {
"name": "invoke"
}
}]
}]
}
यह किसी भी विधि आह्वान के समान है, लेकिन इस मामले में विधि का नाम <init> होना चाहिए।
{
"rules": [{
"name" : "String instantiation",
"invocations" : [{
"owner" : "java.lang.String",
"method" : {
"name" : "<init>"
}
}]
}]
}
यह नियम निम्नलिखित की घटनाओं को ढूंढेगा:
[...]
String s = new String("foo");
[...]
इस उदाहरण में, हम डिसीरियलाइज़ेशन उपयोगों को ढूंढना चाहते हैं (पिछले उदाहरणों की तरह सीरियलाइज़ेशन व्यवहार को परिभाषित करने वाली कक्षाएं नहीं)। डिसीरियलाइज़ेशन तब होता है जब ObjectInputStream.readObject() को आमंत्रित किया जाता है। उदाहरण के लिए इस कोड स्निपेट में:
ObjectInputStream in = new ObjectInputStream(fileInputStream);
Object o = in.readObject();