Java 是否有常规的Expression或类似的简单方法来检查MediaWiki页面标题是否有效?
说明MediaWiki页面标题可能不包含的许多条件。使用这种方法,检查字符串是否为有效的MediaWiki页面标题似乎不太容易 检查页面标题是否有效的正则表达式或类似简单方法是什么? 到目前为止,我能找到的最好的是一些Java代码(来自)。不过,我的目标语言是pythonJava 是否有常规的Expression或类似的简单方法来检查MediaWiki页面标题是否有效?,java,python,mediawiki,Java,Python,Mediawiki,说明MediaWiki页面标题可能不包含的许多条件。使用这种方法,检查字符串是否为有效的MediaWiki页面标题似乎不太容易 检查页面标题是否有效的正则表达式或类似简单方法是什么? 到目前为止,我能找到的最好的是一些Java代码(来自)。不过,我的目标语言是python /** * Convenience method for normalizing MediaWiki titles. (Converts all * underscores to spaces)
/**
* Convenience method for normalizing MediaWiki titles. (Converts all
* underscores to spaces).
* @param s the string to normalize
* @return the normalized string
* @throws IllegalArgumentException if the title is invalid
* @throws IOException if a network error occurs (rare)
* @since 0.27
*/
public String normalize(String s) throws IOException
{
// remove leading colon
if (s.startsWith(":"))
s = s.substring(1);
if (s.isEmpty())
return s;
int ns = namespace(s);
// localize namespace names
if (ns != MAIN_NAMESPACE)
{
int colon = s.indexOf(":");
s = namespaceIdentifier(ns) + s.substring(colon);
}
char[] temp = s.toCharArray();
if (wgCapitalLinks)
{
// convert first character in the actual title to upper case
if (ns == MAIN_NAMESPACE)
temp[0] = Character.toUpperCase(temp[0]);
else
{
int index = namespaceIdentifier(ns).length() + 1; // + 1 for colon
temp[index] = Character.toUpperCase(temp[index]);
}
}
for (int i = 0; i < temp.length; i++)
{
switch (temp[i])
{
// illegal characters
case '{':
case '}':
case '<':
case '>':
case '[':
case ']':
case '|':
throw new IllegalArgumentException(s + " is an illegal title");
case '_':
temp[i] = ' ';
break;
}
}
// https://www.mediawiki.org/wiki/Unicode_normalization_considerations
String temp2 = new String(temp).trim().replaceAll("\\s+", " ");
return Normalizer.normalize(temp2, Normalizer.Form.NFC);
}
/**
*规范化MediaWiki标题的简便方法。(将所有
*下划线到空格)。
*@param是要规格化的字符串
*@返回规范化字符串
*如果标题无效,@将引发IllegalArgumentException
*@在发生网络错误时引发IOException(罕见)
*@自0.27起
*/
公共字符串规范化(字符串s)引发IOException
{
//去掉前导冒号
如果(s.startsWith(“:”)
s=s。子串(1);
如果(s.isEmpty())
返回s;
int ns=名称空间;
//本地化命名空间名称
if(ns!=主名称空间)
{
int冒号=s.indexOf(“:”);
s=名称空间标识符(ns)+s.子字符串(冒号);
}
char[]temp=s.toCharArray();
如果(wgCapitalLinks)
{
//将实际标题中的第一个字符转换为大写
if(ns==MAIN_名称空间)
temp[0]=字符.toUpperCase(temp[0]);
其他的
{
int index=namespaceIdentifier(ns).length()+1;//+1表示冒号
temp[index]=字符.toUpperCase(temp[index]);
}
}
对于(int i=0;i
如果您可以调用目标wiki API进行规范化,那么这是一个规范化页面标题的API调用示例:
/query/normalized/0/to
中。您可以一次发送多个标题以使其正常化,并使用|
将它们分隔开
这个例子取自。它可能相当没有希望。这在很大程度上也取决于每个wiki的配置。例如,您必须知道wiki有哪些名称空间。@Tgr-感谢您的关注。这适用于完全访问后端Wiki的前端。检查的主要原因是为了避免伪装为pagetitle的代码可能产生的漏洞。通过排除非法字符是否可以完全缓解此风险?如果您是指XSS攻击,那么禁止
可能是个好主意。在某些情况下,代码>和代码>,可以使用引号或空格作为攻击向量,这些都是有效的标题字符;您必须确保标题在使用时正确转义。如果您正在编写在wiki上运行的JS代码,mw.Html
有一系列转义函数。另外,mw.Title
有一些相当复杂的验证(与后端逻辑不是100%等价,但很接近)。由于我对后端wiki有一些控制权,我可以修改“合法性”页面标题,例如不允许引用,还有我有点害怕转义字符,比如-,这也取决于url解码过程发生的状态。