use of com.jetbrains.php.lang.psi.elements.ConcatenationExpression in project phpinspectionsea by kalessil.
the class NonSecureCryptUsageInspector method buildVisitor.
@Override
@NotNull
public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) {
return new BasePhpElementVisitor() {
@Override
public void visitPhpFunctionCall(@NotNull FunctionReference reference) {
final String functionName = reference.getName();
if (functionName == null || !functionName.equals("crypt")) {
return;
}
final PsiElement[] arguments = reference.getParameters();
if ((arguments.length != 1 && arguments.length != 2) || !this.isFromRootNamespace(reference)) {
return;
}
/* Case 1: suggest providing blowfish as the 2nd parameter*/
if (arguments.length == 1) {
holder.registerProblem(reference, messageWeakSalt);
return;
}
/* try resolving 2nd parameter, skip if failed, it contains injections or length is not as expected */
final String saltValue = this.resolveSalt(arguments[1]);
if (null == saltValue || saltValue.length() < 4) {
return;
}
/* Case 2: using $2a$; use $2y$ instead - http://php.net/security/crypt_blowfish.php*/
if (saltValue.startsWith("$2a$")) {
holder.registerProblem(reference, messageInsecureSalt, ProblemHighlightType.GENERIC_ERROR);
return;
}
/* Case 3: -> password_hash(PASSWORD_BCRYPT) in PHP 5.5+ */
final boolean isBlowfish = saltValue.startsWith("$2y$") || saltValue.startsWith("$2x$");
if (isBlowfish) {
PhpLanguageLevel php = PhpProjectConfigurationFacade.getInstance(holder.getProject()).getLanguageLevel();
if (php.compareTo(PhpLanguageLevel.PHP550) >= 0) {
holder.registerProblem(reference, messagePasswordHash, ProblemHighlightType.WEAK_WARNING);
}
}
}
@Nullable
private String resolveSalt(@NotNull PsiElement expression) {
/* collect possible value for further analysis */
final Set<PsiElement> discovered = PossibleValuesDiscoveryUtil.discover(expression);
if (discovered.size() != 1) {
discovered.clear();
return null;
}
/* simplify workflow by handling one expression */
final PsiElement saltExpression = discovered.iterator().next();
final StringBuilder resolvedSaltValue = new StringBuilder();
discovered.clear();
/* resolve string literals and concatenations */
PsiElement current = saltExpression;
while (current instanceof ConcatenationExpression) {
final ConcatenationExpression concat = (ConcatenationExpression) current;
final PsiElement right = ExpressionSemanticUtil.getExpressionTroughParenthesis(concat.getRightOperand());
final StringLiteralExpression part = ExpressionSemanticUtil.resolveAsStringLiteral(right);
resolvedSaltValue.insert(0, part == null ? "<?>" : part.getContents());
current = ExpressionSemanticUtil.getExpressionTroughParenthesis(concat.getLeftOperand());
}
/* don't forget to add the last element */
if (null != current) {
final StringLiteralExpression lastPart = ExpressionSemanticUtil.resolveAsStringLiteral(current);
resolvedSaltValue.insert(0, null == lastPart ? "<?>" : lastPart.getContents());
}
return resolvedSaltValue.toString();
}
};
}
use of com.jetbrains.php.lang.psi.elements.ConcatenationExpression in project idea-php-typo3-plugin by cedricziel.
the class TranslationAnnotator method annotate.
@Override
public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder annotationHolder) {
if (!(psiElement instanceof StringLiteralExpression)) {
return;
}
StringLiteralExpression literalExpression = (StringLiteralExpression) psiElement;
String value = literalExpression.getContents();
if (TranslationUtil.isTranslationKeyString(value) && value.length() > 4 && !(psiElement.getParent() instanceof ConcatenationExpression)) {
annotateTranslationUsage(psiElement, annotationHolder, value);
}
}
Aggregations