Skip to content

Commit 1ad64bc

Browse files
committed
introduce PropRef#mayHavePropertyName
1 parent 20c956e commit 1ad64bc

File tree

3 files changed

+11
-9
lines changed

3 files changed

+11
-9
lines changed

javascript/ql/src/semmle/javascript/dataflow/DataFlow.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,14 @@ module DataFlow {
537537
*/
538538
abstract Expr getPropertyNameExpr();
539539

540+
/**
541+
* Holds if this property reference may access a property named `propName`.
542+
*/
543+
predicate mayHavePropertyName(string propName) {
544+
propName = this.getPropertyName() or
545+
this.getPropertyNameExpr().flow().mayHaveStringValue(propName)
546+
}
547+
540548
/**
541549
* Gets the name of the property being read or written,
542550
* if it can be statically determined.

javascript/ql/src/semmle/javascript/frameworks/jQuery.qll

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ module JQuery {
552552
// Handle basic dynamic method dispatch (e.g. `$element[html ? 'html' : 'text'](content)`)
553553
exists(DataFlow::PropRead read | read = this.getCalleeNode() |
554554
read.getBase().getALocalSource() = [dollar(), objectRef()] and
555-
read.getPropertyNameExpr().flow().mayHaveStringValue(name)
555+
read.mayHavePropertyName(name)
556556
)
557557
or
558558
// Handle contributed JQuery objects that aren't source nodes (usually parameter uses)
@@ -616,10 +616,7 @@ module JQuery {
616616
)
617617
) and
618618
plugin = write.getRhs() and
619-
(
620-
pluginName = write.getPropertyName() or
621-
write.getPropertyNameExpr().flow().mayHaveStringValue(pluginName)
622-
)
619+
write.mayHavePropertyName(pluginName)
623620
)
624621
}
625622

javascript/ql/src/semmle/javascript/security/dataflow/XssThroughDom.qll

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,7 @@ module XssThroughDom {
8181
DOMTextSource() {
8282
exists(DataFlow::PropRead read | read = this |
8383
read.getBase().getALocalSource() = DOM::domValueRef() and
84-
exists(string propName | propName = ["innerText", "textContent", "value", "name"] |
85-
read.getPropertyName() = propName or
86-
read.getPropertyNameExpr().flow().mayHaveStringValue(propName)
87-
)
84+
read.mayHavePropertyName(["innerText", "textContent", "value", "name"])
8885
)
8986
or
9087
exists(DataFlow::MethodCallNode mcn | mcn = this |

0 commit comments

Comments
 (0)