Skip to content

Commit 5a3e526

Browse files
committed
Fix sensitive directories/files functions
1 parent 9bd5536 commit 5a3e526

8 files changed

+39
-25
lines changed

src/Exceptions/RuleAlreadyExist.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@ class RuleAlreadyExist extends Exception {
88
/**
99
* @var string
1010
*/
11-
protected $message = 'The rule already exist in the file';
11+
protected $message = 'The rule already exists in the file';
1212
}

src/RuleContent.php

+6-2
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,15 @@ public function getContent() : array {
2929
$result = '';
3030
$templateContent = implode( PHP_EOL, $this->content );
3131

32-
3332
foreach ( $this->templateVars as $var => $replacements ) {
3433
$tmp_result = $templateContent;
3534
foreach ( $replacements as $key => $replacement ) {
36-
$tmp_result = str_replace( sprintf( '{{%s}}', $key ), $replacement, $tmp_result );
35+
if ( preg_match( '/.+\/.+/', $key ) ) {
36+
$tmp_result = implode( PHP_EOL, $replacement );
37+
$tmp_result = str_replace( '{{file}}', $key, $tmp_result );
38+
} else {
39+
$tmp_result = str_replace( sprintf( '{{%s}}', $key ), $replacement, $tmp_result );
40+
}
3741
}
3842
$result .= $tmp_result;
3943
}

src/SubCommands/BlockAccessToSensitiveDirectories.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class BlockAccessToSensitiveDirectories extends SubCommand {
99
public string $removalMessage= 'Block Access to Sensitive Directories rule has been removed.';
1010

1111
public function getTemplateVars() {
12-
$directories = isset( $this->commandArguments['directories'] ) ? $this->commandArguments['directories'] : 'git,svn,vendors,cache';
12+
$directories = isset( $this->commandArguments['directories'] ) ? $this->commandArguments['directories'] : '.git,svn,vendors,cache';
1313
if ( ! empty( $directories ) ) {
1414
$directories = explode( ',', $directories );
1515
$directories = array_map( 'trim', $directories );

src/SubCommands/BlockAccessToSensitiveFiles.php

+12-3
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,24 @@ class BlockAccessToSensitiveFiles extends SubCommand {
99
public string $removalMessage= 'Block Access to Sensitive Files rule has been removed.';
1010

1111
public function getTemplateVars() {
12-
$files = isset( $this->commandArguments['files'] ) ? $this->commandArguments['files'] : 'readme.html, readme.txt, wp-config.php, wp-admin/install.php';
12+
$files = isset( $this->commandArguments['files'] ) ? $this->commandArguments['files'] : 'readme.html,readme.txt,wp-config.php,nginx.conf,/wp-admin/install.php,/wp-admin/upgrade.php';
1313
if ( ! empty( $files ) ) {
1414
$files = explode( ',', $files );
1515
$files = array_map( 'trim', $files );
1616
$files_array = [];
1717

1818
foreach ( $files as $key => $value ) {
19-
$file = isset( $this->commandArguments['server'] ) && $this->commandArguments['server'] === 'nginx' ? preg_quote( $value ) : $value;
20-
$files_array[] = [ 'file' => $file ];
19+
if ( preg_match( '/.+\/.+/', $value ) ) {
20+
$file_with_directory = $this->setRuleContent( false, 'block_access_to_sensitive_files_with_directories' );
21+
if ( isset( $this->commandArguments['server'] ) && $this->commandArguments['server'] === 'nginx' ) {
22+
$file = $value;
23+
} else {
24+
$file = preg_quote( ltrim( $value, '/' ) );
25+
}
26+
$files_array[] = [ $file => $file_with_directory ];
27+
} else {
28+
$files_array[] = [ 'file' => isset( $this->commandArguments['server'] ) && $this->commandArguments['server'] === 'nginx' ? preg_quote( $value ) : $value ];
29+
}
2130
}
2231

2332
return $files_array;

src/SubCommands/SubCommand.php

+11-5
Original file line numberDiff line numberDiff line change
@@ -101,27 +101,33 @@ private function setFilePath() : string {
101101
/**
102102
* Reads rule template file. Depending on output type, returns string or an array
103103
*
104+
* @param boolean $loadVars Whether to load the template vars or not.
105+
* @param boolean $template Template name to return instead of the loaded one.
106+
*
104107
* @return string|array
105108
*/
106-
private function setRuleContent() : string|array {
109+
protected function setRuleContent( bool $loadVars = true, bool|string $template = false ) : string|array {
107110
//Return an empty array in case when the executed command does not require a template
108-
if($this->ruleTemplate === '') {
111+
if($this->ruleTemplate === '' && ! $template ) {
109112
return [];
110113
}
111114

112115
$templateFilePath = dirname(__DIR__) . DIRECTORY_SEPARATOR . 'Templates' . DIRECTORY_SEPARATOR . $this->serverType . DIRECTORY_SEPARATOR .
113-
$this->ruleTemplate . '.tpl';
116+
( $template ? $template : $this->ruleTemplate ) . '.tpl';
114117

115118
$result = [];
116119
$file = new \SplFileObject($templateFilePath);
120+
117121
while(!$file->eof()) {
118122
$result[] = rtrim($file->current(), "\n");
119123
$file->next();
120124
}
121125
unset($file);
122126

123-
$result = new RuleContent( $result, $this->getTemplateVars() );
124-
$result = $result->getContent();
127+
if ( $loadVars ) {
128+
$result = new RuleContent( $result, $this->getTemplateVars() );
129+
$result = $result->getContent();
130+
}
125131

126132
return $result;
127133
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<IfModule mod_rewrite.c>
2+
RewriteEngine On
3+
RewriteRule ^{{file}}$ - [F]
4+
</IfModule>
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,3 @@
1-
location ~ ^.*/\.git/.*$ {
2-
deny all;
3-
}
4-
5-
location ~ ^.*/\.svn/.*$ {
6-
deny all;
7-
}
8-
9-
location ~ ^.*/vendors/.*$ {
10-
deny all;
11-
}
12-
13-
location ~ ^.*/cache/.*$ {
1+
location ~ ^.*/{{directories}}/.*$ {
142
deny all;
153
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
location = {{file}} {
2+
deny all;
3+
}

0 commit comments

Comments
 (0)