Seguridad en WordPress

Algunos consejos para hacer tu WP más seguro:

Las 10 medidas de seguridad imprescindibles en WordPress

1.- Passwords fuertes
2.- No usar usuario admin, ni prefijos estandard en la bad
3.- Limitar número de logins
4.- Vigilar spam
5.- Cuidado con los plugins
6.- Escanear archivos periodicamente
7.- Firewall o proxy inverso
8.- Copias de seguridad
9.- Actualizaciones constantes
10.- Usar un plugin de seguridad

Ejemplo: iThemes:

Cómo configurar el plugin de WordPress iThemes Security

Copias de seguridad en WordPress

UNa buena manera de realizar copias de seguridad en WP es utilizar el siguiente plugin:

updraftplus

Que nos permite realizar varias configuraciones. En la primera pantalla vemos el estado general del sistema:

En la segunda podemos ver los respaldos realizados y, en caso de necesitarlo, restaurar la copia:

En la tercera pantalla podemos configurar la frecuencia de la copia de seguridad, tanto de la base de datos, como de los archivos:

Y especificar dónde queremos guardar esa copia. Tenemos un amplio abanico, desde mandarla por correo electrónico hasta guardarla en dropbox.

También cuenta ftp:

Podemos especificar qué archivos queremos copiar y si queremos un reporte:

Aprendizaje profundo

Dos enlaces de Microsiervos sobre deep learning:

https://www.microsiervos.com/archivo/ia/introduccion-aprendizaje-automatico-sesgos.html

https://www.microsiervos.com/archivo/ordenadores/aprendizaje-automatico-redes-neuronales-aprendizaje-profundo.html

Clase genérica BD

class BD {

    static $server = "localhost";
    static $user = "root";
    static $password = "";
    static $database = "sakila";
    private $table;
    private $idField;
    private $fields;
    private $showFields;
    static private $conn;

    public function __construct($table, $idField, $fields = "", $showFields = "") {
        $this->table = $table;
        $this->idField = $idField;
        $this->fields = $fields;
        $this->showFields = $showFields;
        self::conectar();
    }

    static function conectar() {
        try {
            self::$conn = new PDO("mysql:host=" . self::$server . ";dbname=" . self::$database, self::$user, self::$password, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'"]);
            self::$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }

    function __get($name) {
        if (property_exists($this, $name)) {
            return $this->$name;
        }
    }

    function __set($name, $value) {
        if (property_exists($this, $name) && !empty($value)) {
            $this->$name = $value;
        } else {
            throw new Exception("Error: datos incorrectos");
        }
    }

    function getAll($condicion = "") {
        $where = "";
        if (!empty($condicion)) {
            //Aquí tendré que hacer algo!!!
            $where = " where 1=1 ";
            foreach ($condicion as $clave => $valor) {
                $where .= " and " . $clave . " = '" . $valor . "' ";
            }
        }
        $res = self::$conn->query("select * from " . $this->table . $where);
        return $res->fetchAll(PDO::FETCH_ASSOC);
    }

    function getAllPrepare($condicion = []) {
        $where = "";
        if (!empty($condicion)) {
            $where = " where ". join(" and ", array_map(function($v) {
                        return $v . "=:" . $v;
                    }, array_keys($condicion)));

        }
        $st = self::$conn->prepare("select * from " . $this->table . $where);
        $st->execute($condicion);
        return $st->fetchAll(PDO::FETCH_ASSOC);
    }

    /**
     * Esta función nos devuelve el elemento de la tabla que tenga este id
     * @param int $id El id de la fila
     */
    function getById($id) {
        $res = self::$conn->query("select * from " . $this->table . " where "
                . $this->idField . "=" . $id);
        return $res->fetch();
    }

    /**
     * Elimina el registro que tenga el id que le pasamos
     * @param int $id
     */
    function deleteById($id) {
        try {
            self::$conn->exec("delete from " . $this->table . " where "
                    . $this->idField . "=" . $id);
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }

    /**
     * Esta función toma como parámetro un array asociativo y nos inserta en la tabla
     * un registro donde la clave del array hace referencia al campo de la tabla y
     * el valor del array al valor de la tabla.
     * ejemplo para la tabla actor: insert(['first_name'=>'Ana','last_name'=>'Pi'])
     * @param type $valores
     */
    function insert($valores) {
        try {
            $campos = join(",", array_keys($valores));
            $parametros = ":" . join(",:", array_keys($valores));
            $sql = "insert into " . $this->table . "($campos) values ($parametros)";
            $st = self::$conn->prepare($sql);
            $st->execute($valores);
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }

    /**
     * Modifica el elemento de la base de datos con el id que pasamos
     * Con los valores del array asociativo
     * @param int $id Id del elemento a modificar
     * @param array $valores Array asociativo con los valores a modificar
     */
    function update($id, $valores) {
        try {
            //Easy way
            $res = [];
            foreach ($valores as $clave => $valor) {
                $res[] = $clave . "=:" . $clave;
            }
            $campos = join(",", $res);
            //Hack way
            $campos = join(",", array_map(function($v) {
                        return $v . "=:" . $v;
                    }, array_keys($valores)));
            $sql = "update " . $this->table . " set " . $campos . " where "
                    . $this->idField . " = " . $id;
            $st = self::$conn->prepare($sql);
            $st->execute($valores);
        } catch (Exception $ex) {
            echo $ex->getMessage();
        }
    }

}