查找

文章
· 九月 21, 2024 阅读大约需 4 分钟

Injection SQL - une menace vaincue ?

Selon le rapport OWASP Top Ten de 2021, un document de référence reconnu dans le domaine de la sécurité des applications web, les injections SQL arrivent en troisième position des risques les plus critiques. Ce rapport, disponible sur OWASP Top 10: Injection, souligne la gravité de cette menace et la nécessité de mettre en place des mesures de protection efficaces.

Une injection SQL se produit lorsqu'un attaquant malveillant parvient à insérer du code SQL non autorisé dans une requête envoyée à une base de données. Ce code, dissimulé au sein des entrées utilisateur, peut alors être exécuté par la base de données, provoquant des actions indésirables comme le vol de données confidentielles, la modification ou la suppression d'informations sensibles, ou encore la perturbation du fonctionnement de l'application.

Que doit-on rechercher pour empêcher l’injection SQL ?

Une application est vulnérable aux attaques lorsque :

  • Les données fournies par l'utilisateur ne sont pas validées, filtrées ou nettoyées par l'application.
  • Les requêtes dynamiques ou les appels non paramétrés sans échappement sensible au contexte sont utilisés directement dans l'interpréteur.
  • Les données hostiles sont utilisées dans les paramètres de recherche de mappage objet-relationnel (ORM) pour extraire des enregistrements supplémentaires et sensibles.
  • Les données hostiles sont directement utilisées ou concaténées. Le SQL ou la commande contient la structure et les données malveillantes dans les requêtes dynamiques, les commandes ou les procédures stockées.

Les injections les plus courantes sont SQL, NoSQL, commande OS, mappage objet-relationnel (ORM), LDAP et Expression Language (EL) ou Object Graph Navigation Library (OGNL). Le concept est identique pour tous les interpréteurs.

Avant de plonger dans les techniques de prévention, il est crucial de comprendre comment les injections SQL fonctionnent.

Les attaquants peuvent exploiter des entrées utilisateur non validées pour injecter du code SQL malveillant dans une requête. Par exemple, si un utilisateur peut saisir une valeur dans un champ de recherche et que cette valeur est directement insérée dans une requête SQL sans validation (par exemple, set query = "SELECT * FROM Company.Accounts WHERE custID="_custID), un attaquant pourrait entrer une chaîne de caractères comme "1 union select * from Company.Accounts pour obtenir des détails sur tous les comptes.

Heureusement, InterSystems IRIS fournit plusieurs mécanismes pour prévenir les injections SQL :

  • Utilisation de paramètres préparés. Les paramètres préparés sont l'une des méthodes les plus efficaces pour prévenir les injections SQL. Ils séparent la structure de la requête des valeurs d'entrée, empêchant les attaquants d'injecter du code SQL malveillant. Par example le code 
 SET statement = ##class(%SQL.Statement).%New()
 DO statement.%Prepare("SELECT * FROM Library.Book where ID = ?")
 SET rs = statement.%Execute("3 union select * from library.Book")
 DO rs.%Display()

ne retournera rien.

Tandis que

 SET statement = ##class(%SQL.Statement).%New()
 DO statement.%Prepare("SELECT * FROM Library.Book where ID = ?")
 SET rs = statement.%Execute("3")
 DO rs.%Display()

retournera l'info :

  • Validation des entrées utilisateur. Valider les entrées utilisateur avant de les insérer dans des requêtes SQL est une autre mesure importante de prévention. Utilisez des expressions régulières ou des fonctions de validation appropriées pour vérifier la validité des données. Par exemple, si on utilise le code postal comme paramètre de la requête, on doit vérifier qu'il ne contient que des caractères numériques et qu'il comporte 5 caractères en general:
 SET statement = ##class(%SQL.Statement).%New()
 DO statement.%Prepare("SELECT * FROM Post.Address WHERE ZIP = ?")
 READ "Enter ZIP code: ", zip
 if zip?5N {
    SET rs = statement.%Execute(zip)
    DO rs.%Display()
    }

Ce code retournera

  • Utilisation de patterns dans les descriptions de class. Il est proche du point précédent, mais permet de vérifier l'entrée lors de l'ajout de nouvelles instances.
  • Filtrage des caractères spéciaux
    • Filtrer les caractères spéciaux qui peuvent être utilisés pour injecter du code SQL peut également aider à prévenir les attaques. Utilisez des fonctions de filtrage appropriées pour supprimer ou échapper aux caractères potentiellement dangereux.
  • Utilisation de procédures stockées
    • Les procédures stockées sont des objets de base de données qui encapsulent un ensemble d'instructions SQL. En utilisant des procédures stockées, vous pouvez centraliser la logique de votre application et réduire le risque d'injections SQL.
  • Mise à jour régulière des composants logiciels
    • Assurez-vous de mettre à jour régulièrement InterSystems IRIS et les composants logiciels connexes pour bénéficier des derniers correctifs de sécurité.

Pour conclure, les injections SQL sont une menace sérieuse pour la sécurité des applications Web. En suivant les méthodes de prévention décrites dans cet article, vous pouvez réduire considérablement le risque d'attaques d'injection SQL dans vos applications InterSystems IRIS. Il est important de combiner plusieurs techniques de prévention pour obtenir une protection maximale.

讨论 (0)2
登录或注册以继续
问题
· 九月 21, 2024

fileName in an FTP out

Hi All ,

I would like to add session ID to the fileName in an FTP out pass thru business operation.
How can I do that ?

<Setting Target="Host" Name="Filename">SessionID_%f_%Q.txt</Setting>

2 Comments
讨论 (2)3
登录或注册以继续
文章
· 九月 21, 2024 阅读大约需 3 分钟

Development Tools for Visibility into IRIS CCDA to SDA Transformation

There are many applications for working with HL7 V2 messages, but the tools for working with XML in IRIS Management Portal and Cache Studio are limited. While plenty of external utilities and IDEs work with XML messages and even C-CDA documents, there is a compelling case for being able to test directly against the IRIS C-CDA framework. 

Testing within the IRIS environment provides the necessary context: 

  • XML parser configuration
  • XML namespace context
  • Facility and OID setup
  • IHE header handling
  • The HS.IHE.Util, HS.Util.XSLTTransformer, and %XML.XSLT.Transformer packages
  • Leveraging the XSL codebase in /csp/xslt

The CCD DevTools package provides an API that exposes basic XSL and XPath capabilities from within IRIS. A simple UI facilitates common C-CDA developer tasks such as XPath evaluation and modification of the source document for iterative testing cycles. Execution occurs within IRIS in order to leverage the environment, while the UI allows visibility, repeatability, and the ability to isolate modifications and modules for testing.

Getting Started: 

  1. The CCD DevTools solution is available on the Open Exchange: CCD DevTools
  2. Once installed, the UI runs in a Docker container. Follow the instructions in the README to build and start docker. 
  3. Open the UI at: http://localhost:4000  
  4. Sample CCDs are included in the testing folder: iris-ccd-devtools/testing/sample_data

Home Page:

XPath Evaluator

  • A set of pre-configured XPaths provides the expected format for CCD XPaths in IRIS.
  • Additional XPath values can be pasted and edited
  • A source document can be loaded from a local file or pasted into the window
  • Manual modifications can be made to the source document for re-testing.


The “Viewer” button toggles between a pretty-print, collapsible view of the document and the raw text view. The text view is editable. 


CCDA to SDA Transforms

This window allows the user to select one of the standard IRIS base XSL transforms and apply it to the input document. The output contains the SDA output. 

Modifications can be made to the input document and re-submitted to evaluate how changes affect the output.


 

The Viewer button can be used on Input and Output for better visibility.

 

XSL Template Tester

Building C-CDA to SDA transform typically involves writing modular XSL templates that act on a specific XPath or section of the source document. The purpose of the XSL Template tester is to allow the developer to type or paste the contents of a template into the test window and apply it to a source document. 

The template is evaluated along with the identity template so that only the targeted location will be modified. 


With improved visibility into the input and output documents and the ability to make small modifications and retest, the CCD DevTools UI aims to speed up the build/unit test cycle for CCD transformations as well as lower the learning curve for developers to pick up domain knowledge and familiarity with working with C-CDA and SDA formats in IRIS. 

Have you worked with CCDs? What tools have you used? What future modifications or additions might make this tool more effective for your use cases? 

We’d love to hear any feedback!

7 Comments
讨论 (7)3
登录或注册以继续
公告
· 九月 20, 2024

[Video] Deployment Considerations for Your AI Solution

Hi Community,

Play the new video on InterSystems Developers YouTube:

⏯ Deployment Considerations for Your AI Solution @ Global Summit 2024

AI is becoming increasingly critical to applications, but there often isn't enough discussion on maximizing its function and value. In this video, the presenter will explore how to ensure that this key component of the solution is available, performant, and resilient. Is it "just InterSystems IRIS" or are there more things to consider?   

🗣 Presenter: @Ray Wright, Principal Technology Architect, InterSystems  

Enjoy watching, and look out for more videos! 👍

讨论 (0)1
登录或注册以继续
文章
· 九月 20, 2024 阅读大约需 4 分钟

Desenvolvendo SMART em aplicações FHIR com Auth0 e InterSystems IRIS FHIR Server - Aplicação Angular

Nós concluímos essa série de artigos SMART On FHIR com Auth0 e InterSystems FHIR Repository revisando nossa aplicação desenvolvida em Angular 16.

Vamos relembrar como foi definida a arquitetura da nossa solução:

Nossa aplicação front-end corresponde à segunda coluna e como você pode ver ela tem duas funções:

  1. Redirecionar a requisição de login para Auth0 e receber a resposta
  2. Enviar e receber a resposta de requisições via REST enviadas ao servidor FHIR

Angular

Angular é uma framework de aplicação web desenvolvida em TypeScript, código aberto, mantida pelo Google, usada para criar e manter aplicações web de página única. Esse design de "aplicação de página única" permite que façamos aplicações muito mais dinâmicas para o usuário. Como já explicamos no primeiro artigo, vamos usar NGINX como um servidor de  aplicação e proxy reverso que vai evitar problemas derivados de CORS ao modificar os cabeçalhos das chamadas para corresponder com os do servidor.

Design da aplicação

Nós fizemos o design da aplicação com Material Angular para simular o design de uma aplicação mobile. Em nosso exemplo, a aplicação tem a intenção de gravar uma série de dados de paciente como batimentos cardíacos, pressão sanguínea e peso, e para isso vamos enviar dois tipos de recursos FHIR ao servidor. O primeiro é do tipo paciente, com o qual o usuário vai registrar seus dados; o segundo corresponde ao recurso de observações no qual vamos mandar cada tipo de dado que vamos enviar.

A aplicação vai permitir que o usuário veja um gráfico com a evolução dos dados gravados.

Página de Login

Quando o usuário acessa a rota https://localhost, a página inicial será exibida, da qual ele pode requisitar um log in.

 

Ao clicar no botão de login, a aplicação vai automaticamente redirecionar o usuário à página Auth0 habilitada para a API configurada:

Após entrar com nosso usuário e senha, o Auth0 vai pedir permissão para a aplicação acessar nossos dados. Uma vez que o acesso aos dados seja confirmado, Auth0 vai redirecionar à URL que indicamos durante o processo de configuração. Uma vez que o Token de Acesso seja gerado, a livraria Auth0 será responsável por incluí-lo no cabeçalho de todas as chamadas que lançarmos sobre o servidor. Como podemos ver na seguinte imagem:

Tela inicial

Uma vez feito o log in, vamos ter a primeira comunicação com o servidor FHIR para requisitar a informação disponível ao usuário que entrou. Para isso vamos usar uma consulta por parâmetro enviando uma chamada GET do seguinte tipo:

https://localhost:8443/smart/fhir/r5/Patient?email=lperezra%40intersyste...

A resposta do servidor será um tipo Bundle de recurso com a seguinte informação:

{
    "resourceType":"Bundle",
    "id":"8c5b1efd-cfdd-11ee-a06b-0242ac190002",
    "type":"searchset",
    "timestamp":"2024-02-20T10:48:14Z",
    "total":0,
    "link":[
        {
            "relation":"self",
            "url":"https://localhost:8443/smart/fhir/r5/Patient?email=lperezra%40intersystems.com"
        }
    ]
}

Como vemos, temos um total de 0 paciente com esse email. Assim a nossa aplicação nos mostra uma tela inicial de onde poderemos registrar nossos dados.

 

Como você pode ver, temos o campo de email já preenchido com o email do usuário que entrou. Isso é porque, como você viu na consulta inicial, nós vamos usá-lo como um identificador. Com o formulário preenchido, vamos enviar uma chamada do seguinte tipo via POST:

https://localhost:8443/smart/fhir/r5/Patient

Com o corpo de mensagem formado por um recurso de Patient:

{
    "resourceType":"Patient",
    "birthDate":"1982-03-08",
    "gender":"male",
    "identifier":[
        {
            "type":{
                "text":"ID"
            },
            "value":"12345678A"
        }
    ],
    "name":[
        {
            "family":"PÉREZ RAMOS",
            "given":[
                "LUIS ÁNGEL"
                ]
        }
    ],
    "telecom":[
        {
            "system":"phone",
            "value":"600102030"
        },
        {
            "system":"email",
            "value":"lperezra@intersystems.com"
        }
    ]
}

Com os dados de Patient registrados no nosso servidor, a consulta de paciente irá agora retornar um resultado, então estamos preparados para gravar as diferentes observações. Vamos ver como se parece a tela inicial:

Tela de observações

Da mesma maneira que enviamos os dados dos pacientes, vamos enviar as observações desde suas telas específicas:

Para cada recurso enviado ao servidor, a aplicação vai adicionar um novo ponto ao gráfico:

Para isso, irá lançar uma query ao servidor requisitando recursos do tipo Observation que pertençam ao usuário:

https://localhost/smart/fhir/r5/Observation?patient=Patient/1

E o servidor vai novamente retornar um recurso do tipo Bundle com todas as observações gravadas para o paciente:

With the result obtained, the application will extract all the numerical values and construct the relevant graphs.

Conclusão

Como você viu nos dois artigos anteriores, o design e criação de aplicações SMART On FHIR não é muito complexo e permite que criemos de maneira rápida e ágil aplicações que aproveitam todas as funcionalidades disponíveis no nosso servidor FHIR.

Uma aplicação deste tipo não necessitará do desenvolvimento de um backend complexo para lidar com operações do tipo CRUD nos dados, e com o uso de OAuth2 não vamos precisar lidar com usuários da aplicação, delegando a funcionalidade ao Auth0 ou o servidor de autenticação e autorização escolhidos.

Com SMART On FHIR podemos, numa maneira fácil e simples, tornar disponível aos pacientes e profissionais médicos as ferramentas necessárias para a administração de dados clínicos.

Muito obrigado pela sua atenção!

讨论 (0)1
登录或注册以继续