Skip to content

Validação de formato do ORCID aceita qualquer caractere alfanumérico e não verifica o dígito de checksum #1342

Description

@Rossi-Luciano

Descrição do problema

ContribsValidation.validate_orcid_format() (packtools/sps/validation/article_contribs.py:196) usa o regex:

_default_orcid = r"^[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}-[0-9a-zA-Z]{4}$"

Esse padrão aceita qualquer caractere alfanumérico em qualquer uma das 16 posições, quando o identificador
ORCID deveria ter uma estrutura mais restrita: os 15 primeiros caracteres exclusivamente numéricos e o 16º
(dígito de checksum) numérico ou "X" maiúsculo. Não há também nenhuma verificação do próprio dígito de
checksum (algoritmo ISO 7064 MOD 11-2, usado pela ORCID).

Adicionalmente, ContribsValidation.validate_orcid_is_registered() (linha ~304), que hoje sempre retorna a
mensagem "Unable to automatically check the {orcid}. Check it manually" quando nenhuma função externa de
checagem é fornecida, trata apenas a verificação de existência do identificador na base da ORCID (que
depende de rede/consulta externa) - questão distinta da validação estrutural aqui descrita, que pode ser
feita totalmente offline.

O SPS 1.10 exige o uso de ORCID (@contrib-id-type="orcid" obrigatório para a coleção SciELO Brasil, seção
"<contrib-id>: ORCID e outros identificadores digitais de pesquisador"), mas não detalha no próprio texto a
estrutura do identificador, remetendo à documentação oficial da ORCID ("Consulte: ORCID Brand Guidelines").
As regras estruturais abaixo vêm dessa fonte oficial referenciada pelo próprio SPS, não do texto do SPS em si.

Regras estruturais esperadas (conforme a documentação oficial da ORCID):

  1. 16 caracteres, em 4 blocos de 4 separados por hífen: XXXX-XXXX-XXXX-XXXX.
  2. Os primeiros 15 caracteres exclusivamente numéricos (0-9).
  3. O 16º caractere numérico (0-9) ou X maiúsculo (dígito de checksum).
  4. x minúsculo como checksum deve ser inválido.
  5. Separadores devem ser hífen ASCII (-); en dash () ou em dash () devem ser inválidos.
  6. O dígito de checksum deve ser validado pelo algoritmo ISO 7064 MOD 11-2 usado pela ORCID.

Passos para reproduzir o problema

  1. Validar um XML com <contrib-id contrib-id-type="orcid">000A-0002-1694-233X</contrib-id> (letra em posição
    numérica) e observar que passa na validação de formato.
  2. Validar um ORCID com checksum incorreto (mesmos 15 primeiros dígitos de um ORCID válido, mas último
    caractere trocado) e observar que também passa.

Comportamento esperado

  • Restringir os 15 primeiros caracteres a dígitos e o último a dígito ou X maiúsculo.
  • Validar o dígito de checksum pelo algoritmo ISO 7064 MOD 11-2.
  • Manter as validações já existentes (rejeição de URL, formato geral com hífens).

Anexos

Trecho citado a partir do arquivo SPS 1.10_pt.pdf (versão 1.10, última atualização em 22/05/2025), seção
"<contrib-id>: ORCID e outros identificadores digitais de pesquisador". Regras estruturais detalhadas
conforme a documentação oficial da ORCID, referenciada pelo próprio SPS (ORCID Brand Guidelines / estrutura do
ORCID Identifier).

Classificação (esforço / risco / relevância)

  • Esforço: Médio - o algoritmo de checksum ISO 7064 é bem definido e de implementação direta, mas é
    necessário reescrever o regex e adicionar a etapa de checksum sem quebrar as validações já existentes
    (URL, formato geral).
  • Risco: Médio - é a primeira vez que a checagem se torna automática; pode capturar como inválidos ORCIDs
    malformados que hoje passam despercebidos, o que é o objetivo, mas exige atenção para não introduzir falsos
    positivos por erro na implementação do checksum.
  • Relevância: Média - hoje o problema é de qualidade de dado (ORCIDs malformados não são detectados), não
    de bloqueio de artigos válidos.

Referências

  • Reportado originalmente em Validação: ORCID spsvalidator#53
  • Código relevante: packtools/sps/validation/article_contribs.py
    (ContribsValidation.validate_orcid_format, ContribsValidation.validate_orcid_is_registered)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions