Mysql 表内SQL存储

Mysql 表内SQL存储,mysql,Mysql,我需要在我的一个mySQL表中存储一系列SQL语句,以便在以后的阶段“回放”。我对所有用户输入进行清理、加密和base64编码。为了回放而录制的一个相当典型的语句会按照 INSERT INTO `skins` (sid,skid,skin) VALUES('nepi1sl3A','cici9vx4A','c') ON DUPLICATE KEY UPDATE skin = 'c'; 我通过一个过滤器将其更改为 INSERT INTO `skins` (sid,skid,skin) VALUE

我需要在我的一个mySQL表中存储一系列SQL语句,以便在以后的阶段“回放”。我对所有用户输入进行清理、加密和base64编码。为了回放而录制的一个相当典型的语句会按照

 INSERT INTO `skins` (sid,skid,skin) VALUES('nepi1sl3A','cici9vx4A','c') ON DUPLICATE KEY UPDATE skin = 'c';
我通过一个过滤器将其更改为

INSERT INTO `skins` (sid,skid,skin) VALUES(~nepi1sl3A~,~cici9vx4A~,~c~) ON DUPLICATE KEY UPDATE skin = ~c~;
这使得播放更容易,因为我在那个阶段所要做的就是用stru替换~

给定encryption+base64编码,~字符永远不会出现在任何值中

问题-我是否在这里存储了任何未预见的问题。如果是这样,是否有更安全/更好的方法来完成同样的事情? 在阅读了一些评论和答案后,我觉得需要更多的澄清


最初,我对存储以供回放的实际语句进行加密+base64编码。然而,经过反思,我觉得在回放之前需要base64解码+解密会带来不必要的开销,因为原始语句(所有用户数据经过消毒、加密和base64编码)无论如何都不是高风险的。如果我想在存储之前替换引号,那是为了提供最后一层安全性,这是不太可能的,因为有一天我忘记了对用户数据执行清理/加密/base64编码步骤。

我看不出您所做的有任何致命的问题。就数据库而言,这只是不透明的数据——它表示SQL查询的事实与此无关。如果存在任何危险,它将基于SQL查询的来源(例如用户输入);把它们保存在桌子上并不会增加或减少危险

正如我在评论中提到的,您不需要替换语句中的引号。只有在尝试将语句替换为查询中的引号时,引号才会导致问题。但是,由于在将语句替换到查询中之前对语句进行了编码,因此引号将消失


理想情况下,您应该使用带有参数化查询的API,而不是直接替换到
INSERT
语句中。例如,如果您使用PHP,您应该使用PDO或MySQLi。

为什么不使用单引号存储它们?抱歉,如果我太密集了。除了mySQL在InSERT语句中给定带引号的字符串时会抛出抖动之外,我想确保一定程度的安全性。我严格加密&base64编码所有用户输入,但如果我现在或将来错过了什么呢?单引号替换提供了一个缓冲区。由于您是base64编码,因此在插入时引号将消失。因此,不需要进行任何字符串替换。此外,如果您使用支持预处理语句的API,MySQl在尝试使用带引号的字符串插入值时不会抛出任何抖动。引号将放在存储的SQL语句的值位中。但该声明本身会有单引号。我知道这听起来很复杂。我试图将SQL存储在DB表中,以便以后执行,这样SQL将包含与普通SQL语句类似的内容—包括引号!