From dae3390a02ca6687fd31ca784474d56240c6c538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Thu, 28 Jul 2016 11:00:23 +0200 Subject: [PATCH 1/2] Remove token from GET requests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The CSRF token really should be used only in POST requests. The reason for that is that it's a bit harder to get to if it is in request body (with POST) compared to GET request, where it is in the URL (being easily available in server logs). Also this will make the URLs look nicer ;-). This change will definite break some functionality, but since #6297 most of the code should be safe and remaining bugs can be fixed for upcoming release. Signed-off-by: Michal Čihař --- libraries/URL.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libraries/URL.php b/libraries/URL.php index 4a01e87b9a..5bc6dbd1ba 100644 --- a/libraries/URL.php +++ b/libraries/URL.php @@ -220,10 +220,6 @@ class URL $params['collation_connection'] = $GLOBALS['collation_connection']; } - if (isset($_SESSION[' PMA_token '])) { - $params['token'] = $_SESSION[' PMA_token ']; - } - if (empty($params)) { return ''; } From ea73fded7138038aa5a415c7081d838fc094eff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20=C4=8Ciha=C5=99?= Date: Thu, 28 Jul 2016 11:22:45 +0200 Subject: [PATCH 2/2] Adjust tests to token removal from GET MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Michal Čihař --- test/classes/AdvisorTest.php | 2 +- test/classes/DbSearchTest.php | 12 +-- test/classes/DisplayResultsTest.php | 78 +++++++------------ test/classes/FooterTest.php | 4 +- test/classes/ThemeManagerTest.php | 4 +- test/classes/ThemeTest.php | 2 +- test/classes/URLTest.php | 12 +-- test/classes/config/PageSettingsTest.php | 2 +- .../plugin/auth/AuthenticationConfigTest.php | 2 +- .../plugin/auth/AuthenticationCookieTest.php | 2 +- test/libraries/PMA_Form_Processing_test.php | 8 +- test/libraries/PMA_insert_edit_test.php | 16 ++-- test/libraries/PMA_server_privileges_test.php | 4 +- test/libraries/PMA_user_preferences_test.php | 3 +- test/libraries/common/PMA_getDbLink_test.php | 6 +- .../common/PMA_showMessage_test_disabled.php | 10 +-- 16 files changed, 71 insertions(+), 96 deletions(-) diff --git a/test/classes/AdvisorTest.php b/test/classes/AdvisorTest.php index a08991e4c2..451538582c 100644 --- a/test/classes/AdvisorTest.php +++ b/test/classes/AdvisorTest.php @@ -171,7 +171,7 @@ class AdvisorTest extends PMATestCase 'name' => 'Variable', 'issue' => 'issue', 'recommendation' => 'Recommend status_var' + 'lang=en&filter=status_var">status_var' ), null, ), diff --git a/test/classes/DbSearchTest.php b/test/classes/DbSearchTest.php index de6f395512..71b5efa881 100644 --- a/test/classes/DbSearchTest.php +++ b/test/classes/DbSearchTest.php @@ -164,23 +164,23 @@ class DbSearchTest extends PMATestCase . 'href="sql.php?db=pma&table' . '=table1&goto=db_sql.php&pos=0&is_js_confirmed=0&' . 'sql_query=column1&server=0&lang=en&' - . 'collation_connection=utf-8&token=token" ' + . 'collation_connection=utf-8" ' . 'onclick="loadResult(\'sql.php?db=pma&table=table1&goto=' . 'db_sql.php&pos=0&is_js_confirmed=0&sql_query=column1' . '&server=0&lang=en&collation_connection=utf-8' - . '&token=token\',\'table1\',\'?db=pma' + . '\',\'table1\',\'?db=pma' . '&table=table1&server=0&lang=en' - . '&collation_connection=utf-8&token=token\');' + . '&collation_connection=utf-8\');' . 'return false;" >Browse' . 'Delete' ) ); diff --git a/test/classes/DisplayResultsTest.php b/test/classes/DisplayResultsTest.php index 480efd176a..b2cee34a85 100644 --- a/test/classes/DisplayResultsTest.php +++ b/test/classes/DisplayResultsTest.php @@ -357,8 +357,7 @@ class DisplayResultsTest extends PMATestCase . 'The+row+has+been+deleted&goto=sql.php%3Fdb%3Ddata%26table%3D' . 'new%26sql_query%3DSELECT%2B%252A%2BFROM%2B%2560new%2560%26message' . '_to_show%3DThe%2Brow%2Bhas%2Bbeen%2Bdeleted%26goto%3Dtbl_' - . 'structure.php%26token%3Dd1aecb47ef7c081e068e7008b38a5d76&' - . 'token=d1aecb47ef7c081e068e7008b38a5d76', + . 'structure.php', array( 'edit_lnk' => 'ur', 'del_lnk' => 'dr', @@ -428,7 +427,7 @@ class DisplayResultsTest extends PMATestCase 'tbl_change.php?db=Data&table=customer&where_clause=%60' . 'customer%60.%60id%60+%3D+1&clause_is_unique=1&sql_query=' . 'SELECT+%2A+FROM+%60customer%60&goto=sql.php&default_' - . 'action=update&token=bbd5003198a3bd856b21d9607d6c6a1e', + . 'action=update', 'odd edit_row_anchor', '
                 . Edit', @@ -439,7 +438,7 @@ class DisplayResultsTest extends PMATestCase . ' Edit' . "\n" . ' Copy', '`customer`.`id` = 1', @@ -502,7 +501,7 @@ class DisplayResultsTest extends PMATestCase . ' Copy' . "\n" . ' Delete', 'DELETE FROM `Data`.`customer` WHERE `customer`.`id` = 1', @@ -568,8 +566,7 @@ class DisplayResultsTest extends PMATestCase . '+1&message_to_show=The+row+has+been+deleted&goto=sql.php' . '%3Fdb%3DData%26table%3Dcustomer%26sql_query%3DSELECT%2B%252A%2B' . 'FROM%2B%2560customer%2560%26message_to_show%3DThe%2Brow%2Bhas%2B' - . 'been%2Bdeleted%26goto%3Dtbl_structure.php%26token%3Df597309d3a06' - . '6c3c81a6cb015a79636d&token=f597309d3a066c3c81a6cb015a79636d" ' + . 'been%2Bdeleted%26goto%3Dtbl_structure.php" ' . 'class="delete_row requireConfirm">Delete ' . 'Delete' . "\n" @@ -624,8 +621,7 @@ class DisplayResultsTest extends PMATestCase . 'The+row+has+been+deleted&goto=sql.php%3Fdb%3Ddata%26table%3D' . 'new%26sql_query%3DSELECT%2B%252A%2BFROM%2B%2560new%2560%26' . 'message_to_show%3DThe%2Brow%2Bhas%2Bbeen%2Bdeleted%26goto%3D' - . 'tbl_structure.php%26token%3Dae4c6d18375f446dfa068420c1f6a4e8' - . '&token=ae4c6d18375f446dfa068420c1f6a4e8', + . 'tbl_structure.php', array( 'edit_lnk' => 'ur', 'del_lnk' => 'dr', @@ -643,12 +639,10 @@ class DisplayResultsTest extends PMATestCase ), 'tbl_change.php?db=data&table=new&where_clause=%60new%60.' . '%60id%60+%3D+1&clause_is_unique=1&sql_query=SELECT+%2A+' - . 'FROM+%60new%60&goto=sql.php&default_action=update&' - . 'token=ae4c6d18375f446dfa068420c1f6a4e8', + . 'FROM+%60new%60&goto=sql.php&default_action=update', 'tbl_change.php?db=data&table=new&where_clause=%60new%60.' . '%60id%60+%3D+1&clause_is_unique=1&sql_query=SELECT+%2A+' - . 'FROM+%60new%60&goto=sql.php&default_action=insert&' - . 'token=ae4c6d18375f446dfa068420c1f6a4e8', + . 'FROM+%60new%60&goto=sql.php&default_action=insert', 'edit_row_anchor', ' Edit', @@ -666,7 +660,7 @@ class DisplayResultsTest extends PMATestCase . '' + . '_action=update" >' . ' Edit' . "\n" . 'Copy Copy' . "\n" . 'Delete ' . 'Delete' . "\n" @@ -700,8 +693,7 @@ class DisplayResultsTest extends PMATestCase . 'The+row+has+been+deleted&goto=sql.php%3Fdb%3Ddata%26table%3D' . 'new%26sql_query%3DSELECT%2B%252A%2BFROM%2B%2560new%2560%26message' . '_to_show%3DThe%2Brow%2Bhas%2Bbeen%2Bdeleted%26goto%3Dtbl_' - . 'structure.php%26token%3Dae4c6d18375f446dfa068420c1f6a4e8&' - . 'token=ae4c6d18375f446dfa068420c1f6a4e8', + . 'structure.php', array( 'edit_lnk' => 'ur', 'del_lnk' => 'dr', @@ -719,12 +711,10 @@ class DisplayResultsTest extends PMATestCase ), 'tbl_change.php?db=data&table=new&where_clause=%60new%60.' . '%60id%60+%3D+1&clause_is_unique=1&sql_query=SELECT+%2A+' - . 'FROM+%60new%60&goto=sql.php&default_action=update&' - . 'token=ae4c6d18375f446dfa068420c1f6a4e8', + . 'FROM+%60new%60&goto=sql.php&default_action=update', 'tbl_change.php?db=data&table=new&where_clause=%60new%60.' . '%60id%60+%3D+1&clause_is_unique=1&sql_query=SELECT+%2A+' - . 'FROM+%60new%60&goto=sql.php&default_action=insert&' - . 'token=ae4c6d18375f446dfa068420c1f6a4e8', + . 'FROM+%60new%60&goto=sql.php&default_action=insert', 'edit_row_anchor', ' Edit', @@ -739,8 +729,7 @@ class DisplayResultsTest extends PMATestCase . 'message_to_show=The+row+has+been+deleted&goto=sql.php%3Fdb' . '%3Ddata%26table%3Dnew%26sql_query%3DSELECT%2B%252A%2BFROM%2B%25' . '60new%2560%26message_to_show%3DThe%2Brow%2Bhas%2Bbeen%2Bdeleted' - . '%26goto%3Dtbl_structure.php%26token%3Dae4c6d18375f446dfa068420c' - . '1f6a4e8&token=ae4c6d18375f446dfa068420c1f6a4e8" class="delete' + . '%26goto%3Dtbl_structure.php" class="delete' . '_row requireConfirm">Delete Delete' . "\n" . '
DELETE FROM `data`.`new` WHERE `new`.' @@ -748,7 +737,7 @@ class DisplayResultsTest extends PMATestCase . "\n" . 'Copy Copy' . "\n" . 'Edit Edit' . "\n" . ' Edit', @@ -874,8 +860,7 @@ class DisplayResultsTest extends PMATestCase . 'row+has+been+deleted&goto=sql.php%3Fdb%3Ddata%26table%3Dnew' . '%26sql_query%3DSELECT%2B%252A%2BFROM%2B%2560new%2560%26message_' . 'to_show%3DThe%2Brow%2Bhas%2Bbeen%2Bdeleted%26goto%3Dtbl_structure' - . '.php%26token%3Dae4c6d18375f446dfa068420c1f6a4e8&token=' - . 'ae4c6d18375f446dfa068420c1f6a4e8', + . '.php', array( 'edit_lnk' => 'ur', 'del_lnk' => 'dr', @@ -893,12 +878,10 @@ class DisplayResultsTest extends PMATestCase ), 'tbl_change.php?db=data&table=new&where_clause=%60new%60.%60' . 'id%60+%3D+1&clause_is_unique=1&sql_query=SELECT+%2A+FROM+' - . '%60new%60&goto=sql.php&default_action=update&token=' - . 'ae4c6d18375f446dfa068420c1f6a4e8', + . '%60new%60&goto=sql.php&default_action=update', 'tbl_change.php?db=data&table=new&where_clause=%60new%60.%60' . 'id%60+%3D+1&clause_is_unique=1&sql_query=SELECT+%2A+FROM+' - . '%60new%60&goto=sql.php&default_action=insert&token=' - . 'ae4c6d18375f446dfa068420c1f6a4e8', + . '%60new%60&goto=sql.php&default_action=insert', 'edit_row_anchor', ' Edit', @@ -980,7 +963,6 @@ class DisplayResultsTest extends PMATestCase 'db_routines.php?item_name=circumference&db=data' . '&item_type=FUNCTION&server=0&lang=en' . '&collation_connection=utf-8' - . '&token=token' ), array( 'information_schema', @@ -995,7 +977,6 @@ class DisplayResultsTest extends PMATestCase 'db_routines.php?item_name=area&db=data' . '&item_type=PROCEDURE&server=0&lang=en' . '&collation_connection=utf-8' - . '&token=token' ), array( 'information_schema', @@ -1010,7 +991,6 @@ class DisplayResultsTest extends PMATestCase . 'rmation_schema%60.%60CHARACTER_SETS%60&db=information_schema' . '&test_name=value&server=0&lang=en' . '&collation_connection=utf-8' - . '&token=token' ) ); } @@ -1340,7 +1320,7 @@ class DisplayResultsTest extends PMATestCase null, '1001' + . '" class="disableAjax">1001' ), array( true, @@ -1355,7 +1335,7 @@ class DisplayResultsTest extends PMATestCase null, '0x123456' + . '" class="disableAjax">0x123456' ), array( true, @@ -1370,7 +1350,7 @@ class DisplayResultsTest extends PMATestCase null, '[BLOB - 4 B]' + . '" class="disableAjax">[BLOB - 4 B]' ), array( false, @@ -1493,7 +1473,7 @@ class DisplayResultsTest extends PMATestCase '[BLOB - 4 B]' ), array( diff --git a/test/classes/FooterTest.php b/test/classes/FooterTest.php index ce3a7117d2..1b1ff62b1b 100644 --- a/test/classes/FooterTest.php +++ b/test/classes/FooterTest.php @@ -157,7 +157,7 @@ class FooterTest extends PMATestCase $this->assertEquals( '', $this->_callPrivateFunction( '_getSelfLink', @@ -182,7 +182,7 @@ class FooterTest extends PMATestCase $this->assertEquals( '', diff --git a/test/classes/ThemeManagerTest.php b/test/classes/ThemeManagerTest.php index 21838d8508..55ae2cc6f4 100644 --- a/test/classes/ThemeManagerTest.php +++ b/test/classes/ThemeManagerTest.php @@ -127,12 +127,12 @@ class ThemeManagerTest extends PMATestCase '

Original (2.9)


[ take it ]' . '

pmahomme (1.1)

' . 'pmahomme
[ take it' . ' ]

', $tm->getPrintPreviews() diff --git a/test/classes/ThemeTest.php b/test/classes/ThemeTest.php index aec6c664db..590bccd0f7 100644 --- a/test/classes/ThemeTest.php +++ b/test/classes/ThemeTest.php @@ -293,7 +293,7 @@ class ThemeTest extends PMATestCase '' ); } diff --git a/test/classes/URLTest.php b/test/classes/URLTest.php index 1034922467..d11477e75e 100644 --- a/test/classes/URLTest.php +++ b/test/classes/URLTest.php @@ -44,8 +44,7 @@ class URLTest extends PHPUnit_Framework_TestCase $separator = URL::getArgSeparator(); $expected = 'server=x' . htmlentities($separator) . 'lang=en' . htmlentities($separator) - . 'collation_connection=x' . htmlentities($separator) - . 'token=token' + . 'collation_connection=x' ; $expected = '?db=db' @@ -68,8 +67,7 @@ class URLTest extends PHPUnit_Framework_TestCase $separator = URL::getArgSeparator(); $expected = 'server=x' . htmlentities($separator) . 'lang=en' . htmlentities($separator) - . 'collation_connection=x' . htmlentities($separator) - . 'token=token' + . 'collation_connection=x' ; $expected = '?db=db' @@ -93,8 +91,7 @@ class URLTest extends PHPUnit_Framework_TestCase $separator = URL::getArgSeparator(); $expected = 'server=x' . $separator . 'lang=en' . $separator - . 'collation_connection=x' . $separator - . 'token=token' + . 'collation_connection=x' ; $expected = '#ABC#db=db' . $separator . 'table=table' . $separator @@ -121,8 +118,7 @@ class URLTest extends PHPUnit_Framework_TestCase $separator = URL::getArgSeparator(); $expected = '?server=x' . htmlentities($separator) . 'lang=en' . htmlentities($separator) - . 'collation_connection=x' . htmlentities($separator) - . 'token=token' + . 'collation_connection=x' ; $this->assertEquals($expected, URL::getCommon()); } diff --git a/test/classes/config/PageSettingsTest.php b/test/classes/config/PageSettingsTest.php index 28f1ba51f5..9f6f67eb07 100644 --- a/test/classes/config/PageSettingsTest.php +++ b/test/classes/config/PageSettingsTest.php @@ -57,7 +57,7 @@ class PageSettingsTest extends PMATestCase '
' . '
' . '
', $html ); diff --git a/test/classes/plugin/auth/AuthenticationConfigTest.php b/test/classes/plugin/auth/AuthenticationConfigTest.php index 6235c4f634..9679f4c92d 100644 --- a/test/classes/plugin/auth/AuthenticationConfigTest.php +++ b/test/classes/plugin/auth/AuthenticationConfigTest.php @@ -138,7 +138,7 @@ class AuthenticationConfigTest extends PMATestCase $this->assertContains( 'Retry to connect', $html ); diff --git a/test/classes/plugin/auth/AuthenticationCookieTest.php b/test/classes/plugin/auth/AuthenticationCookieTest.php index c53f9b2eb6..cf1ff71414 100644 --- a/test/classes/plugin/auth/AuthenticationCookieTest.php +++ b/test/classes/plugin/auth/AuthenticationCookieTest.php @@ -813,7 +813,7 @@ class AuthenticationCookieTest extends PMATestCase $mockResponse->expects($this->once()) ->method('header') ->with( - $this->stringContains('&server=2&lang=en&collation_connection=utf-8&token=token') + $this->stringContains('&server=2&lang=en&collation_connection=utf-8') ); $mockResponse->expects($this->any()) diff --git a/test/libraries/PMA_Form_Processing_test.php b/test/libraries/PMA_Form_Processing_test.php index 32739c6240..4e4cc54bef 100644 --- a/test/libraries/PMA_Form_Processing_test.php +++ b/test/libraries/PMA_Form_Processing_test.php @@ -86,17 +86,17 @@ class PMA_Form_Processing_Test extends PHPUnit_Framework_TestCase ); $this->assertContains( - '', + '', $result ); $this->assertContains( - '', + '', $result ); $this->assertContains( - '', + '', $result ); @@ -119,7 +119,7 @@ class PMA_Form_Processing_Test extends PHPUnit_Framework_TestCase PMA_Process_formset($formDisplay); $this->assertEquals( - array('HTTP/1.1 303 See Other', 'Location: index.php?lang=en&token=token'), + array('HTTP/1.1 303 See Other', 'Location: index.php?lang=en'), $GLOBALS['header'] ); diff --git a/test/libraries/PMA_insert_edit_test.php b/test/libraries/PMA_insert_edit_test.php index 41289e362d..f15c6f716d 100644 --- a/test/libraries/PMA_insert_edit_test.php +++ b/test/libraries/PMA_insert_edit_test.php @@ -300,7 +300,7 @@ class PMA_InsertEditTest extends PHPUnit_Framework_TestCase $this->assertEquals( ' : ' + . 'DataEditView=1&goto=sql.php&lang=en">' . 'Function', $result ); @@ -310,7 +310,7 @@ class PMA_InsertEditTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'Function', $result ); @@ -320,7 +320,7 @@ class PMA_InsertEditTest extends PHPUnit_Framework_TestCase $this->assertEquals( ' : ' + . 'DataEditView=1&goto=sql.php&lang=en">' . 'Type', $result ); @@ -330,7 +330,7 @@ class PMA_InsertEditTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'Type', $result ); @@ -731,7 +731,7 @@ class PMA_InsertEditTest extends PHPUnit_Framework_TestCase $this->assertContains( '', + . '&data=abc&server=1&lang=en">', $result ); @@ -1954,7 +1954,7 @@ class PMA_InsertEditTest extends PHPUnit_Framework_TestCase { $GLOBALS['cfg']['ServerDefault'] = 1; $this->assertEquals( - 'tbl_change.php?lang=en&token=token', + 'tbl_change.php?lang=en', PMA_getErrorUrl(array()) ); @@ -2255,7 +2255,7 @@ class PMA_InsertEditTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'b<', + . '+%60f%60%3D1&lang=en" title="a>">b<', $result ); @@ -2265,7 +2265,7 @@ class PMA_InsertEditTest extends PHPUnit_Framework_TestCase $this->assertEquals( 'a>', + . '+%60f%60%3D1&lang=en" title="b<">a>', $result ); } diff --git a/test/libraries/PMA_server_privileges_test.php b/test/libraries/PMA_server_privileges_test.php index 2e6a4d505c..933c9f1f89 100644 --- a/test/libraries/PMA_server_privileges_test.php +++ b/test/libraries/PMA_server_privileges_test.php @@ -2138,13 +2138,13 @@ class PMA_ServerPrivileges_Test extends PHPUnit_Framework_TestCase $this->assertContains( '-', + . 'collation_connection">-', $actual ); $this->assertContains( '"', + . 'collation_connection">"', $actual ); $this->assertContains('Show all', $actual); diff --git a/test/libraries/PMA_user_preferences_test.php b/test/libraries/PMA_user_preferences_test.php index 3166725963..e245ae018a 100644 --- a/test/libraries/PMA_user_preferences_test.php +++ b/test/libraries/PMA_user_preferences_test.php @@ -377,8 +377,7 @@ class PMA_User_Preferences_Test extends PHPUnit_Framework_TestCase ); $this->assertContains( - 'Location: /phpmyadmin/file.html?a=b&saved=1&server=0&' . - 'token=token#h+ash', + 'Location: /phpmyadmin/file.html?a=b&saved=1&server=0#h+ash', $GLOBALS['header'][0] ); diff --git a/test/libraries/common/PMA_getDbLink_test.php b/test/libraries/common/PMA_getDbLink_test.php index 9c56febd81..d123eadd50 100644 --- a/test/libraries/common/PMA_getDbLink_test.php +++ b/test/libraries/common/PMA_getDbLink_test.php @@ -58,7 +58,7 @@ class PMA_GetDbLink_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['DefaultTabDatabase'], 'database' ) . '?db=' . $database - . '&server=99&lang=en&token=token" ' + . '&server=99&lang=en" ' . 'title="Jump to database "' . htmlspecialchars($database) . '".">' . htmlspecialchars($database) . '', @@ -80,7 +80,7 @@ class PMA_GetDbLink_Test extends PHPUnit_Framework_TestCase $GLOBALS['cfg']['DefaultTabDatabase'], 'database' ) . '?db=' . $database - . '&server=99&lang=en&token=token" title="Jump to database "' + . '&server=99&lang=en" title="Jump to database "' . htmlspecialchars($database) . '".">' . htmlspecialchars($database) . '', PMA\libraries\Util::getDbLink($database) @@ -103,7 +103,7 @@ class PMA_GetDbLink_Test extends PHPUnit_Framework_TestCase ) . '?db=' . htmlspecialchars(urlencode($database)) - . '&server=99&lang=en&token=token" title="Jump to database "' + . '&server=99&lang=en" title="Jump to database "' . htmlspecialchars($database) . '".">' . htmlspecialchars($database) . '', PMA\libraries\Util::getDbLink($database) diff --git a/test/libraries/common/PMA_showMessage_test_disabled.php b/test/libraries/common/PMA_showMessage_test_disabled.php index b9b8d08503..f62d80be7e 100644 --- a/test/libraries/common/PMA_showMessage_test_disabled.php +++ b/test/libraries/common/PMA_showMessage_test_disabled.php @@ -51,18 +51,18 @@ class PMA_ShowMessage_Test extends PHPUnit_Framework_TestCase $this->expectOutputString( "
-
msg
SELECT *
FROM tblPatient
[ - Edit + Edit ] [ - Explain SQL + Explain SQL ] [ - Create PHP code + Create PHP code ] [ - Refresh + Refresh ]
" );