这确实没有经过消毒:
如何消毒?
这里是我的完整类,我已经尝试过,但WordPress团队仍然说它没有得到适当的消毒。
以及##不安全的SQL调用
在调用数据库时,保护代码免受SQL注入漏洞的攻击是非常重要的。您需要更新代码以使用wpdb调用,并使用prepare()查询来保护它们。
`$orderby = (isset($_REQUEST['orderby']) && in_array($_REQUEST['orderby'], array_keys($this->get_sortable_columns()))) ? $_REQUEST['orderby'] : 'country';`
`$order = (isset($_REQUEST['order']) && in_array($_REQUEST['order'], array('asc', 'desc'))) ? $_REQUEST['order'] : 'asc';`
class dsvatcalculator_List_Table extends WP_List_Table
{
function __construct()
{
global $status, $page;
parent::__construct(array(
'singular' => 'vat',
'plural' => 'vats',
));
}
function column_default($item, $column_name)
{
return $item[$column_name];
}
function column_country($item)
{
return '<em>' . $item['country'] . '</em>';
}
function column_vat($item)
{
$actions = array(
'edit' => sprintf('<a href="?page=vats_form&id=%s">%s</a>', htmlspecialchars(absint($item['id'])), __('Edit', 'ds-vat-calculator')),
'delete' => sprintf('<a href="?page=%s&action=delete&id=%s">%s</a>',htmlspecialchars( $_REQUEST['page']), htmlspecialchars(absint($item['id'])), __('Delete', 'ds-vat-calculator')),
);
return sprintf('%s %s',
esc_html($item['vat']),
$this->row_actions($actions)
);
}
function column_cb($item)
{
return sprintf(
'<input type="checkbox" name="id[]" value="%s" />',
absint($item['id'])
);
}
function get_columns()
{
$columns = array(
'cb' => esc_html('<input type="checkbox" />'),
'vat' => esc_html(__('VAT Rate', 'ds-vat-calculator')),
'country' => esc_html(__('Country Name', 'ds-vat-calculator')),
);
return $columns;
}
function get_sortable_columns()
{
$sortable_columns = array(
'vat' => array('vat', true),
'country' => array('country', true),
);
return $sortable_columns;
}
function get_bulk_actions()
{
$actions = array(
'delete' => 'Delete'
);
return $actions;
}
function process_bulk_action()
{
global $wpdb;
$dsvatcalculator_tbl = $wpdb->prefix . 'dsvatcalculator_vat_calculator';
if ('delete' === $this->current_action()) {
$idsvatcalculator = isset($_REQUEST['id']) ? (array) $_REQUEST['id'] : array();
$idsvatcalculator = array_map( 'esc_attr', $idsvatcalculator );;
if (is_array($idsvatcalculator)) $idsvatcalculator = implode(',', $idsvatcalculator);
if (!empty($idsvatcalculator)) {
$wpdb->query("DELETE FROM $dsvatcalculator_tbl WHERE id IN($idsvatcalculator)");
}
}
}
function prepare_items()
{
global $wpdb;
$dsvatcalculator_tbl = $wpdb->prefix . 'dsvatcalculator_vat_calculator';
$per_page = 10;
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
$this->_column_headers = array($columns, $hidden, $sortable);
$this->process_bulk_action();
$total_items = $wpdb->get_var("SELECT COUNT(id) FROM $dsvatcalculator_tbl");
$paged = isset($_REQUEST['paged']) ? max(0, intval($_REQUEST['paged']) - 1) : 0;
$orderby = (isset($_REQUEST['orderby']) && in_array($_REQUEST['orderby'], array_keys($this->get_sortable_columns()))) ? $_REQUEST['orderby'] : 'country';
$order = (isset($_REQUEST['order']) && in_array($_REQUEST['order'], array('asc', 'desc'))) ? $_REQUEST['order'] : 'asc';
$orderby = sanitize_sql_orderby($orderby);
$order = sanitize_sql_orderby($order);
$this->items = $wpdb->get_results($wpdb->prepare("SELECT * FROM $dsvatcalculator_tbl ORDER BY $orderby $order LIMIT %d OFFSET %d", $per_page, $paged), ARRAY_A);
$this->set_pagination_args(array(
'total_items' => $total_items,
'per_page' => $per_page,
'total_pages' => ceil($total_items / $per_page)
));
}
}
我试过了
第一个月
1条答案
按热度按时间bmp9r5qi1#
查询的动态部分似乎是orderby子句的列名和订单方向(ASC或DESC)。
我看到您有代码将列名限制为可排序列的键(在代码中定义为固定数组),或者如果列不在键集中,则默认为“country”。同样,方向必须为“ASC”或“DESC”,否则默认为“ASC”。
您所做的是清理列标识符和关键字的正确方法,它们都不能成为SQL中的查询参数,必须在查询传递给
prepare()
之前在查询字符串中修复。但是,我不知道您的函数
sanitize_sql_orderby()
是做什么的,因为您没有包含该代码,不过我怀疑这是否重要。无论如何,我怀疑您的团队要求您更改它是因为他们不了解SQL参数是如何工作的。参数只能用来代替SQL表达式中的 values。参数不能用来代替SQL标识符或关键字。
也许他们只是看到PHP变量被插入到SQL查询字符串中,他们就认为PHP变量是不可信的。但实际上,您已经将这些变量限制为您在代码中定义的文字值。我认为这是足够的保护。
如果他们坚持要您更改代码,我会要求他们更具体地说明,并向您展示他们会采取哪些不同的做法。