Beveiligings-API voor ontwikkelaars van Building Blocks
Blackboard is geïntegreerd met een best practices open source beveiligingsbibliotheek van de Enterprise Security API (ESAPI) van het Open Web Application Project's (OWASP) . Deze beveiligingsbibliotheek wordt standaard geïnstalleerd op Blackboard via een Building Block met de naam "ESAPI Security Module" en is vereist voor de werking van het systeem. Blackboard raadt alle Building Block-ontwikkelaars ten zeerste aan om gebruik te maken van deze nieuwe beveiligings-API op basis van OWASP ESAPI voor Java en ESAPI voor JavaScript. Deze wijzigingen in de beveiligings-API omvatten niet alleen implementaties van best practices, maar vergroten ook het gebruiksgemak van de methoden door middel van een consistente nomenclatuur.
Opmerking
In latere versies maakt de ESAPI Security Module Building Block API deel uit van de kerncode van Blackboard en is deze standaard beschikbaar.
Als onderdeel van veilige coderingspraktijken moet invoer die kan worden beïnvloed door gebruikers, al dan niet vertrouwd, aan de serverzijde worden gevalideerd vóór verwerking (invoervalidatie) en vóór weergave (uitvoervalidatie of ontsnappen). Dit helpt de veerkracht van het systeem te waarborgen en voorkomt beveiligingsproblemen zoals cross-site scripting.
Validatie van invoer
Wanneer u input van het verzoek ontvangt, moet u altijd valideren en altijd server-side valideren. Blackboard heeft verschillende populaire gebruiksscenario's geïmplementeerd die validatie vereisen. Hieronder vindt u enkele voorbeelden.
blackboard.platform.security.ValidationUtility.isValidDirectoryPath( Tekenreeks )
blackboard.platform.security.ValidationUtility.isValidGuid( Tekenreeks )
blackboard.platform.security.ValidationUtility.isValidEnumeratedType ( Enum, String )
Output validatie/codering/ontsnappen
Wanneer u invoer weergeeft, zorg er dan altijd voor dat deze wordt weergegeven in de juiste context waarin deze wordt ingesloten:
Java-methoden
blackboard.platform.security.EscapeUtility.escapeForHTML ( Tekenreeks )
blackboard.platform.security.EscapeUtility.escapeForHTMLAttribute ( Tekenreeks )
blackboard.platform.security.EscapeUtility.escapeForJavascript ( String )
blackboard.platform.security.EscapeUtility.escapeForUrl ( String )
blackboard.platform.security.EscapeUtility.escapeForCSS ( Tekenreeks )
blackboard.platform.security.EscapeUtility.escapeForXML ( Tekenreeks )
blackboard.platform.security.EscapeUtility.escapeForXMLAttribute ( Tekenreeks )
JSP-methoden
${bbNG:EscapeForHTML( String )}
${bbNG:EscapeForJavascript( String )}
${bbNG:EscapeForURL( String )}
${bbNG:EscapeForCSS( tekenreeks )}
${bbNG:EscapeForXML( String )}
${bbNG:EscapeForXMLAttribute( String )}
JavaScript-methoden
Alle ESAPI voor JavaScript-methoden zijn beschikbaar voor gebruik. Een lijst met meest gebruikte methoden:
$ESAPI.encoder().canonicalize( String )
$ESAPI.encoder().encodeForHTML( String )
$ESAPI.encoder().encodeForHTMLAttribute( String )
$ESAPI.encoder().encodeForCSS( String )
$ESAPI.encoder().encodeForJavaScript( String )
$ESAPI.encoder().encodeForURL( String )
Ontcijfer versleutelde tekst
Ontcijfer versleutelde context
Als je gegevens wilt versleutelen tijdens het doorgeven van context, moeten Blackboard en de externe URL toegang hebben tot dezelfde contextcoderingssleutel. De sleutel moet worden gemaakt op basis van de functie Contextcoderingssleutel beheren die beschikbaar is in het configuratiescherm voor systeembeheer. Zodra de sleutel is gemaakt, moet deze worden gedownload en gedistribueerd naar externe servers die de context accepteren.
Voorbeeld van een code
Na het downloaden van een contextcoderingssleutel moet deze beschikbaar worden gesteld aan de URL die versleutelde gegevens ontvangt door middel van context-passing. Het onderstaande codevoorbeeld laat zien hoe u versleutelde contextgegevens op de externe URL programmatisch kunt ontcijferen wanneer deze worden doorgegeven.
Het object dat wordt aangegeven door de doel-URL (in dit geval index.jsp) kan de context als volgt ontcijferen (importeren blackboard.client.decryption.*):
String context = request.getParameter("context");//if isEncryptionEnabled = false, wordt basis 64-codering gebruikt in plaats van //of encryptionboolean isEncryptionEnabled = true; ContextDecryptor bfd = ContextDecryptorFactory.getContextDecryptor(isEncryptionEnabled ); haal de Blackboard-coderingssleutel op als een File of InputStream File key = new File( strKeyLocation ); of InputStream key = // implementatiedetail...// om eenvoudig de contexttekenreeks String decryptedContext = bfd.decrypt( context, key );// te ontcijferen, of, om een HashMap te krijgen van alle sleutel-waardeparenHashMap map = bfd.parseEncryptedContext( context, sleutel );// zoek vervolgens in de HashMap naar een verwachte waarde en ga door.if (map.containsKey( "user" ){ // execute...}
Meerdere toetsen oplossen
Het bovenstaande codevoorbeeld is handig wanneer er een één-op-één-relatie is tussen de externe URL en Blackboard. In gevallen waarin een externe URL een Building Block ondersteunt voor meerdere exemplaren van Blackboard, kan de hostnaam van de instantie worden gebruikt om meerdere sleutels te verwerken.
In het onderstaande voorbeeld wordt de sleutel gevonden door koppeling met de hostnaam voor de instantie of virtuele installatie van Blackboard. In dit geval wordt de hostnaam physics.yourinstelling.com. Aangezien de decoderingscode van de client de mogelijkheid heeft om een decoderingssleutel door te geven aan het ContextDecryptor-object, moet de clientserver in staat zijn om een hostnaam toe te wijzen aan de juiste sleutel (meestal toegankelijk als een bestand, maar kan een InputStream zijn).
Ontwikkelaars van Building Block-servers kunnen een eenvoudige wrapper schrijven die:
Haalt de hostnaam uit het verzoek.
Hiermee zoekt u het bestand met de versleutelingssleutel op in de hostname-encryptionKey-map.
Geeft de coderingssleutel door aan de methode
decrypt().
Pseudocode-wrapper geïmplementeerd door een client-serverhulpprogrammaobject:
/**
* Hulpprogramma Pseudocode
*/
decryptByHostname( HttpServletRequest-verzoek)
{
Contextparameter ophalen uit het verzoek
String context = request.getParameter("context");
Bepalen of de context versleuteld is
String strEncryptInd = request.getParameter("versleutelen");
if ( (strEncryptInd != null) && (strEncryptInd.equalsIgnoreCase("y")) )
{
isVersleuteld = waar;
}
als isVersleuteld, zoek dan de sleutel op
sleutel = null;
als (isEncrypted)
{
haal de hostnaam op van HttpUtils.getRequestURL().getHost();
Key Map ophalen, eventueel opgeslagen als een eigenschapsbestand in de indeling
// physics.yourinstitution.com= /key/file/location/physics_yourinstitution_com/key.sec
haal de coderingssleutel op van map als een bestand of een InputStream,
Afhankelijk van de details van de clientimplementatie (sleutel wordt doorgegeven als null als
isEncrypted= false, en in plaats daarvan wordt Base64Encoding gebruikt)
}
ContextDecryptor decryptor =
ContextDecryptorFactory.getContextDecryptor(isEncrypted);
Retourneer vervolgens de waarden die in de context worden doorgegeven als
een HashMap van sleutel-waardeparen
HashMap-waarden = decryptor.parseEncryptedContext(context, sleutel);
of een touwtje
Tekenreekswaarden = decryptor.decrypt(context, sleutel);
rendementswaarden;
}