Gå til innhold

Sikkerhet rundt CSharp scripting i program


Anbefalte innlegg

Jeg har laget et program, der jeg bruker Micrsoft.CSharp.CSharpCodeProvider til å lage et script til manipulering av tall og tekststrenger, men jeg vil hindre de som bruker den i å bruke f.eks. System.IO eller System.NET, hvordan kan jeg få til det, annet en å si ifra hvis koden inneholder System.IO eller System.NET?

Lenke til kommentar
Videoannonse
Annonse
Jeg har laget et program, der jeg bruker Micrsoft.CSharp.CSharpCodeProvider til å lage et script til manipulering av tall og tekststrenger, men jeg vil hindre de som bruker den i å bruke f.eks. System.IO eller System.NET, hvordan kan jeg få til det, annet en å si ifra hvis koden inneholder System.IO eller System.NET?

7076729[/snapback]

 

Tar jeg feil hvis jeg tror denne klasser er kun for å kompilere? Er vel MANGE andre ting du må ta hensyn til for å få det sikkert da ;)

 

Tror heller du bør tenke på sikkerhet når koden skal kjøres. .Net har ekstremt god støtte for dette i .Net.

 

Denne burde få deg litt igang:

http://msdn.microsoft.com/msdnmag/issues/01/03/clr/

 

Hva skal du bruke dette til forresten? Skriv gjerne inn et innlegg for å fortelle hvordan det går (siden jeg er litt nysgjerrig) :)

Lenke til kommentar

Dety gjelder et program (noe lignende Adobe Acrobat) der en tekstbox som en setter ut, har nå en egenskap som heter Expression, denne Expression starter en funksjon i et Interface kalt IStringExpression og er ment at man skal kunne legge inn verdier, og kunne addere, multiplisere etc. flere verdier (for f.eks. å summere alle verdier i en faktura)

 

Det funker fint nå, men jeg vil ikke at folk skal kunne bruke det til å ta over datamaskinen, og siden en ikke kan legge til flere referances, så ville jeg tro at å hindre noen i å bruke fil, eller netverk, skal man kunne hindre dem i å gjøre noe alvorlig galt.

Lenke til kommentar
Dety gjelder et program (noe lignende Adobe Acrobat) der en tekstbox som en setter ut, har nå en egenskap som heter Expression, denne Expression starter en funksjon i et Interface kalt IStringExpression og er ment at man skal kunne legge inn verdier, og kunne addere, multiplisere etc. flere verdier (for f.eks. å summere alle verdier i en faktura)

 

Det funker fint nå, men jeg vil ikke at folk skal kunne bruke det til å ta over datamaskinen, og siden en ikke kan legge til flere referances, så ville jeg tro at å hindre noen i å bruke fil, eller netverk, skal man kunne hindre dem i å gjøre noe alvorlig galt.

7079034[/snapback]

 

Kan du poste litt eksempelkode?

Lenke til kommentar

Jeg har nå gjort det slik at en kan kun skrive én linje med kode, altså begynner koden alltid med "return " og slutter med ";"

 

her er hvordan jeg har gjort det:

public IStringExpression CreateStringExpressionSolver(string expression, Dictionary<string, string> variables)
 {
 	string code = "";
 
 	
 	// Create code header.
 	code += "using System;";
 	code += "namespace MathExpression {";
 	code += "public class StringExpressionSolver : ReassuranceLib.MathExpression.IStringExpression { ";
 	code += "public string Solve(System.Collections.Generic.Dictionary<string, string> var) { ";

 	// Add variables into the code as variables, for ease of use.

 	foreach (string varname in variables.Keys)
 	{
   code += "string " + varname + " = var[" + varname + "];";
 	}

 	code += "return ";
 	// code += Substitute(expression) // Find a way to get rid of this,
 	// since the function may in rare cases render the code uncompilable.
 	code += expression;
 	code += "; }";
 	// We need a provider to compile the code
 	m_provider = new Microsoft.CSharp.CSharpCodeProvider();
 	m_params = new System.CodeDom.Compiler.CompilerParameters();
 	// Add this assembly (ReassuranceLib) as a referanced assembly
 	// Or the compile will fail, due to missing interfaces (IStringExpression)
 	m_params.ReferencedAssemblies.Add(System.Reflection.Assembly.GetExecutingAssembly().Location);
 	m_params.GenerateExecutable = false;	// We don't need an exe file output
 	m_params.GenerateInMemory = true;  // But we need the program to be placed in memory
 	m_results = m_provider.CompileAssemblyFromSource(m_params, code);	// Compile from generated code

 	Type t = m_results.CompiledAssembly.GetType("MathExpression.StringExpressionSolver");
 	return (IStringExpression)Activator.CreateInstance(t);

 	
 }

Lenke til kommentar

Det var noen syntaxfeil i koden din, men det regner jeg med at du vet om.

 

 

Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.

 

Noe sånt du er ute etter? ;)

 

System.Security.Policy.Evidence evidence = new System.Security.Policy.Evidence();
evidence.AddHost( new System.Security.Policy.Zone( System.Security.SecurityZone.Internet ) );
m_params.Evidence = evidence;

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...