Package Exports
- solium-plugin-security
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (solium-plugin-security) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
The official Security Plugin for Solium
This Plugin provides security-focused lint rules for Solium.
The rules have been taken from Consensys' Recommended Smart Contract Practices and Solium's Rule Wishlist.
Installation
NOTE: If you're using Solium v1.0.1
or above, this plugin comes pre-installed as a local dependency and you can skip this section.
npm install -g solium-plugin-security
Usage
NOTE: If you've installed Solium v1.0.1
or above and created soliumrc.json
using solium --init
, you can skip this step since solium automatically applies the security plugin for you.
Add security
to your soliumrc.json
's plugins
array. Your configuration file should look like:
{
"extends": "solium:all",
"plugins": ["security"],
"rules": {
...
}
}
List of rules
Below are the rules supplied by this plugin and the information on passing options to them and their auto-fixing capabilities.
Some of them aren't always desirable and are therefore disabled by default (marked below as OFF
). You should explicitly enable them in your .soliumrc.json
.
Name | Description | Options | Defaults | Fixes |
---|---|---|---|---|
no-throw | Discourage use of 'throw' statement for error flagging | YES | ||
no-tx-origin | Discourage use of 'tx.origin' global variable | |||
enforce-explicit-visibility | Encourage user to explicitly specify visibility of function | YES | ||
no-block-members | Discourage use of members 'blockhash' & 'timestamp' (and alias 'now') of 'block' global variable | List of members to warn against | ["blockhash", "timestamp"] | |
no-call-value | Discourage use of .call.value()() | |||
no-assign-params | Disallow assigning to function parameters | |||
no-fixed | Disallow fixed point types | |||
no-inline-assembly | Discourage use of inline assembly | |||
no-low-level-calls | Discourage the use of low-level functions - call(), callcode() & delegatecall() | List of functions to warn against | ["call", "callcode", "delegatecall"] | |
no-modify-for-iter-var | Discourage user to modify a for loop iteration counting variable in the loop body | |||
no-send | Discourage the use of unsafe method 'send' | |||
no-sha3 | Encourage use of 'keccak256()' over 'sha3()' function | YES | ||
no-unreachable-code | Disallow unreachable code | |||
OFF else-after-elseif |
Encourage user to use else statement after else-if statement | |||
OFF enforce-loop-bounds |
Encourage use of loops with fixed bounds | |||
OFF enforce-placeholder-last |
Enforce that the function placeholder is the last statement in the modifier | |||
OFF return-at-end |
Discourage use of early returns in functions | |||
OFF one-break-per-loop |
Discourage use of multiple breaks in while/for/do loops | |||
OFF max-statements-in-func |
Enforce upper limit on number of statements inside a function | Maximum number of statements | 25 | |
OFF no-abstract-func |
Discourage use of abstract functions | |||
OFF no-bit-operations |
Disallow bitwise operations | |||
OFF no-continue |
Discourage use of 'continue' statement | |||
OFF no-inheritance |
Discourage use of inheritance | Disallow interface inheritance | { "no-interface": false } | |
OFF no-multiple-inheritance |
Discourage use of multiple inheritance | Disallow interface inheritance | { "no-interface": false } | |
OFF no-named-params |
Disallow named function parameters | |||
OFF no-named-returns |
Discourage use of named returns in functions | |||
OFF 256-bit-ints-only |
Disallow non-256 bit integers | |||
OFF no-suicide-or-selfdestruct |
Disallow suicide and selfdestruct | |||
OFF no-var |
Disallow type deduction via var |
|||
OFF no-user-defined-modifiers |
Disallow user-defined modifiers | |||
OFF no-void-returns |
Discourage use of void returns in functions prototypes | |||
OFF no-func-overriding |
Discourage function overriding |
An example soliumrc.json
configuring and applying this plugin is:
{
"plugins": ["security"],
"rules": {
"some-other-solium-rule": 1,
"security/no-low-level-calls": ["error", ["call", "delegatecall"]],
"security/no-block-members": [1, ["timestamp"]],
"security/no-throw": "off"
}
}
This tells solium to apply the 3 security/
rules with special configuration provided and apply the remaining rules of the plugin with their default configurations. If you want to disable a plugin rule, you have to explicitly disable it inside rules
.
Lint normally using solium -d contracts/
or solium -d contracts/ --fix
to apply fixes as well.
Developer Setup
git clone <URL-of-this-repo>
cd solium-plugin-security
npm install --dev
npm link
npm link solium-plugin-security
npm test
If you'd also like to use your develop build of this plugin with dev build of Solium, go to Solium's directory and run npm link solium-plugin-security
. This will let Solium access your modified plugin instead of its pre-installed security module.
Access Solium's Developer Docs
Roadmap
- Add automated tests
- Refine rule
enforce-explicit-visibility
- Add more security rules
Security rules to be implemented
-
no-multiple-send-calls
-
check-send-result