SQL Server 2008 CLRプロジェクトにストアドプロシージャがあります。この関数は、xmlを含むパラメータでコンソールアプリケーションを呼び出します。System.Diagnostics.Process.Xmlでparamを含むSQL CLR関数を呼び出す
[Microsoft.SqlServer.Server.SqlProcedure()]
public static SqlInt32 ExecuteApp(SqlString utilPath, SqlString arguments, ref SqlString result)
{
ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
Process p = new Process();
try
{
//ProcessStartInfo to run the DOS command attrib
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
info.CreateNoWindow = true;
info.Arguments = string.Format(@"/c ""{0}"" {1}", utilPath, arguments);
SqlContext.Pipe.Send(info.Arguments);
p.StartInfo = info;
p.Start();
String processResults = p.StandardOutput.ReadToEnd();
SqlContext.Pipe.Send(processResults);
result = processResults;
if (String.IsNullOrEmpty((String)result))
result = p.StandardError.ReadToEnd();
return 1;
}
finally
{
p.Close();
}
}
xmlを含むparamの問題はここにあります。 これは、ストアドプロシージャの実行のための式である:私はのようなエラーを持っている
declare @Result nvarchar(max)
exec ExecuteApp 'C:\Console.exe', 'send "<messages><message>my message</message></messages>"', @Result out
select @Result
ストアドプロシージャを実行した後:
<は、この時点では予想外でしたが。
xmlがすべて正しく機能していないことに気づきたいと思います。
セキュリティ上の脆弱性が深刻です。 – SLaks
なぜあなたは 'xp_cmdshell'を使用していませんか? – SLaks
xp_cmdshellはサーバーレベルでも有効にする必要があり、注入攻撃のために全く新しい方法を開きます。 – Shiv