Kselax.ru

Hacker Kselax — the best hacker in the world

Menu
  • Блог
  • Контакты
  • wp plugin генератор
  • Русский
    • Русский
    • English
Menu

WP экранирует данные переданные из форм, что делать? Экранирование данных

Posted on 20 июля, 201623 марта, 2017 by admin

Сталкнулся с такой проблемой, создал форму из нее передаю данные и дальше сохраняю в БД, то данные в массиве $_POST получаются экранированые.
Почему такое происходить?

Немножко погуглил нашел функцию в файле wp-settings.php

1
2
// Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
wp_magic_quotes();

И вот ее код из файла wp_includes/load.php

wp_magic_quote »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* Add magic quotes to `$_GET`, `$_POST`, `$_COOKIE`, and `$_SERVER`.
*
* Also forces `$_REQUEST` to be `$_GET + $_POST`. If `$_SERVER`,
* `$_COOKIE`, or `$_ENV` are needed, use those superglobals directly.
*
* @since 3.0.0
* @access private
*/
function wp_magic_quotes() {
// If already slashed, strip.
if ( get_magic_quotes_gpc() ) {
$_GET    = stripslashes_deep( $_GET    );
$_POST   = stripslashes_deep( $_POST   );
$_COOKIE = stripslashes_deep( $_COOKIE );
}
 
// Escape with wpdb.
$_GET    = add_magic_quotes( $_GET    );
$_POST   = add_magic_quotes( $_POST   );
$_COOKIE = add_magic_quotes( $_COOKIE );
$_SERVER = add_magic_quotes( $_SERVER );
 
// Force REQUEST to be GET + POST.
$_REQUEST = array_merge( $_GET, $_POST );
}

Короче она экранирует все массивы. Что же нам делать, как убрать это чертово экранирование?

Все просто используем специальную функцию

1
$_POST = array_map( 'stripslashes_deep', $_POST );

Эта функция деэкранирует массив $_POST так же и другие массивы. Вообще не понимаю зачем нужно было добавлять в wordpress функцию wp_magic_quotes, от нее толку ноль.

Применение экранирования

Экранирование применяется чтобы при добавлении в базу данных были нормальные запросы, но в wordpress сама функция wpdb::insert, update и другие экранируют эти данные используя функцию wpdb:prepare я смотрел код этих функций и проверял.

Вот wpdb функции находятся в wp_includes/wp-db.php

wpdb::prepare »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
* Prepares a SQL query for safe execution. Uses sprintf()-like syntax.
*
* The following directives can be used in the query format string:
*   %d (integer)
*   %f (float)
*   %s (string)
*   %% (literal percentage sign - no argument needed)
*
* All of %d, %f, and %s are to be left unquoted in the query string and they need an argument passed for them.
* Literals (%) as parts of the query must be properly written as %%.
*
* This function only supports a small subset of the sprintf syntax; it only supports %d (integer), %f (float), and %s (string).
* Does not support sign, padding, alignment, width or precision specifiers.
* Does not support argument numbering/swapping.
*
* May be called like {@link http://php.net/sprintf sprintf()} or like {@link http://php.net/vsprintf vsprintf()}.
*
* Both %d and %s should be left unquoted in the query string.
*
*     wpdb::prepare( "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d", 'foo', 1337 )
*     wpdb::prepare( "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s", 'foo' );
*
* @link http://php.net/sprintf Description of syntax.
* @since 2.3.0
*
* @param string      $query    Query statement with sprintf()-like placeholders
* @param array|mixed $args     The array of variables to substitute into the query's placeholders if being called like
*                              {@link http://php.net/vsprintf vsprintf()}, or the first variable to substitute into the query's placeholders if
*                              being called like {@link http://php.net/sprintf sprintf()}.
* @param mixed       $args,... further variables to substitute into the query's placeholders if being called like
*                              {@link http://php.net/sprintf sprintf()}.
* @return string|void Sanitized query string, if there is a query to prepare.
*/
public function prepare( $query, $args ) {
if ( is_null( $query ) )
return;
 
// This is not meant to be foolproof -- but it will catch obviously incorrect usage.
if ( strpos( $query, '%' ) === false ) {
_doing_it_wrong( 'wpdb::prepare', sprintf( __( 'The query argument of %s must have a placeholder.' ), 'wpdb::prepare()' ), '3.9' );
}
 
$args = func_get_args();
array_shift( $args );
// If args were passed as an array (as in vsprintf), move them up
if ( isset( $args[0] ) && is_array($args[0]) )
$args = $args[0];
$query = str_replace( "'%s'", '%s', $query ); // in case someone mistakenly already singlequoted it
$query = str_replace( '"%s"', '%s', $query ); // doublequote unquoting
$query = preg_replace( '|(?<!%)%f|' , '%F', $query ); // Force floats to be locale unaware
$query = preg_replace( '|(?<!%)%s|', "'%s'", $query ); // quote the strings, avoiding escaped strings like %%s
array_walk( $args, array( $this, 'escape_by_ref' ) );
return @vsprintf( $query, $args );
}

А вот функция wpdb::update

wpdb::update »

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
* Update a row in the table
*
*     wpdb::update( 'table', array( 'column' => 'foo', 'field' => 'bar' ), array( 'ID' => 1 ) )
*     wpdb::update( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) )
*
* @since 2.5.0
* @see wpdb::prepare()
* @see wpdb::$field_types
* @see wp_set_wpdb_vars()
*
* @param string       $table        Table name
* @param array        $data         Data to update (in column => value pairs).
*                                   Both $data columns and $data values should be "raw" (neither should be SQL escaped).
*                                   Sending a null value will cause the column to be set to NULL - the corresponding
*                                   format is ignored in this case.
* @param array        $where        A named array of WHERE clauses (in column => value pairs).
*                                   Multiple clauses will be joined with ANDs.
*                                   Both $where columns and $where values should be "raw".
*                                   Sending a null value will create an IS NULL comparison - the corresponding format will be ignored in this case.
* @param array|string $format       Optional. An array of formats to be mapped to each of the values in $data.
*                                   If string, that format will be used for all of the values in $data.
*                                   A format is one of '%d', '%f', '%s' (integer, float, string).
*                                   If omitted, all values in $data will be treated as strings unless otherwise specified in wpdb::$field_types.
* @param array|string $where_format Optional. An array of formats to be mapped to each of the values in $where.
*                                   If string, that format will be used for all of the items in $where.
*                                   A format is one of '%d', '%f', '%s' (integer, float, string).
*                                   If omitted, all values in $where will be treated as strings.
* @return int|false The number of rows updated, or false on error.
*/
public function update( $table, $data, $where, $format = null, $where_format = null ) {
if ( ! is_array( $data ) || ! is_array( $where ) ) {
return false;
}
 
$data = $this->process_fields( $table, $data, $format );
if ( false === $data ) {
return false;
}
$where = $this->process_fields( $table, $where, $where_format );
if ( false === $where ) {
return false;
}
 
$fields = $conditions = $values = array();
foreach ( $data as $field => $value ) {
if ( is_null( $value['value'] ) ) {
$fields[] = "`$field` = NULL";
continue;
}
 
$fields[] = "`$field` = " . $value['format'];
$values[] = $value['value'];
}
foreach ( $where as $field => $value ) {
if ( is_null( $value['value'] ) ) {
$conditions[] = "`$field` IS NULL";
continue;
}
 
$conditions[] = "`$field` = " . $value['format'];
$values[] = $value['value'];
}
 
$fields = implode( ', ', $fields );
$conditions = implode( ' AND ', $conditions );
 
$sql = "UPDATE `$table` SET $fields WHERE $conditions";
 
$this->check_current_query = false;
return $this->query( $this->prepare( $sql, $values ) );
}

Может быть полезно когда мы делаем сами запрос свой используя wpdb::query, короче пока я не решил что делать, будем дальше разбираться, а пока просто будем уберать дополнительные слеши, потому что вордпресс изначально все экранирует и похоже эту штуку не отключить из плагина, да и наверно смысла нету, наверно нужно подстраиваться под то что есть.

Вообще цель у нас долно быть все нормально сохранено в базу данных, кавычки должны быть кавычками, и двойного экранирования не должно происходить при добавлении в БД как у меня было 🙂

Там по коду я заметил хук sanitize_comment_cookies , можно к нему прицепиться , или просто где то в начале фала проверять массив $_POST. вот пример как можно сделать

Показать »

1
2
3
4
5
6
//отменяем экранирование для post
add_action('sanitize_comment_cookies', 'delete_magic_quotes');
function delete_magic_quotes(){
if($_GET['page']==='my-ranker/class.ranker.php'&&isset($_POST))
$_POST = array_map( 'stripslashes_deep', $_POST );
}

И остальные так же обрабатываем $_POST, $_GET, $_COOKIE, $_SERVER, $_REQUEST .

Добавить комментарий Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Рубрики

  • C++ (293)
  • JavaScript (1)
  • linux (1)
  • MFC (39)
  • node.js (2)
  • React (3)
  • uncategorized (3)
  • vBulletin (5)
  • Visual Studio (9)
  • wordpress (18)
  • Разное (121)

Метки

Ajax bootstrap CentOS CLI expressjs FormData GDlib google Invisible reCAPTCHA JWT media MFC php react-router-dom redux repository wordpress RTTI STL vBulletin vector Visual Studio WINAPI wordpress wp-plugins XMLHttpRequest Двоичное дерево Задачи С++ Игры С++ Исключения С++ О-большое Операторы_С++ Перегрузка операторов С++ Поиск С++ Потоки Проектирование_С++ С++ Типы_С++ Типы С++ Шаблоны С++ библиотеки локализация макросы С++ сортировка С++

Свежие комментарии

  • Proffirot к записи Программка для заполнения форума на vBulletin 3.8.7
  • RA3PKJ к записи visual C++, создание диалоговых окон.
  • JasonReant к записи Создание и использование статических библиотек .lib в visual studio.
  • MyWin2020 к записи Программка для заполнения форума на vBulletin 3.8.7
  • ScottJip к записи Создание и использование статических библиотек .lib в visual studio.
©2021 Kselax.ru Theme by ThemeGiant