Estoy trabajando en una aplicación de reacción, y esta aplicación de reacción usa un editor de texto enriquecido de una biblioteca llamada Mantine. Este RTE genera datos envueltos en etiquetas html. Cuando envío esos datos a mi base de datos sql, se rechaza diciendo:
Tiene un error en su sintaxis SQL; verifique el manual que corresponde a la versión de su servidor MySQL para obtener la sintaxis correcta para usar cerca de 'ql-align-justify">text text tex texttex texttex texttex texttex texttex texttex t' en la línea 1
Esto sucede cuando hay saltos de línea en el texto o modificación de texto (por lo que crea uno o múltiples
etiquetas No verifiqué si funciona con todos los demás controles como negrita y cursiva, pero probablemente sí. Sé que no es seguro enviar este tipo de datos a una base de datos SQL. Pero, ¿cómo debo proceder para enviar el artículo de forma segura (sin las etiquetas html) y mostrarlo de la forma correcta (memorizar las negritas y los saltos de línea, etc.)?
estoy usando reaccionar, nodejs express para el servidor con mysql2 y el banco de trabajo MySQL.
Este es el código del lado del servidor que intercepta el código y lo envía a la base de datos.
exports.createPost = (req, res, next) => { console.log(req.body) const data = `"${req.body.user_id}", "${req.body.title}", "${req.body.article}", "${req.body.tags}","${req.body.author}", "${req.body.date}"` const stmt = `INSERT INTO groupomania_social.articles(user_id,title,article,tags,author,date)VALUES(${data})` con.query(stmt, (err, results, fields) => { if (err) { return console.error(err.message) } return res.status(200).json({ message: 'new article created' }) }) }En lugar de redactar la consulta como una cadena, utilice consultas parametrizadas:
conn.execute('Select name from employee where id = ?', [id]);Esto trata sus datos/parámetros como separados del texto de la consulta y también lo protege contra la inyección de SQL.
El comentario de @farooq ayudó, al principio no funcionaba porque almacené en búfer todo el artículo (autor, ID de usuario, etc.) cuando necesitaba almacenar en búfer el artículo real (procedente del editor de texto). todo el objeto del artículo con el autor y el resto de la información es demasiado grande.
aquí está el código
// create a buffer const buff = Buffer.from(req.body.article, 'utf-8') // decode buffer as Base64 const base64 = buff.toString('base64') const data = `"${req.body.user_id}", "${req.body.title}", "${base64}", "${req.body.tags}","${req.body.author}", "${req.body.date}"` const stmt = `INSERT INTO groupomania_social.articles(user_id,title,article,tags,author,date)VALUES(${data})` con.query(stmt, (err, results, fields) => { if (err) { return console.error(err.message) } return res.status(200).json({ message: 'new article created' }) })Entonces, cuando el servidor recibe la solicitud, crea una cadena "segura" con ella, la envía a la base de datos, luego la decodifica cuando la recibe y la envía al frente.
Las consultas parametrizadas probablemente podrían funcionar, pero la oración de consulta es difícil de entender en esta situación.
gracias a todos los que intentaron ayudar, espero que esto ayude a alguien más tarde. (todavía no se recomienda renderizar html desde una cadena en reaccionar)