﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>StrataFrame Forum » StrataFrame Application Framework - V1 » Business Objects and Data Access (How do I?)  » Is Direct SQL Statement Secure  ?</title><generator>InstantForum 2017-1 Final</generator><description>StrataFrame Forum</description><link>http://forum.strataframe.net/</link><webMaster>StrataFrame Forum</webMaster><lastBuildDate>Tue, 09 Jun 2026 16:22:43 GMT</lastBuildDate><ttl>20</ttl><item><title>Is Direct SQL Statement Secure  ?</title><link>http://forum.strataframe.net/FindPost6912.aspx</link><description>Hi,&lt;P&gt;I can run this code in ANY BO.&lt;/P&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; GetAllDatabaseTables()&lt;BR&gt;{&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;string&lt;/FONT&gt;&lt;FONT size=2&gt; TABLE_SQL = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;@"SELECT TABLE_CATALOG AS [Database], TABLE_SCHEMA AS Owner, TABLE_NAME AS Name, TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES WHERE (TABLE_TYPE = 'BASE TABLE') AND (TABLE_NAME &amp;lt;&amp;gt; N'sysdiagrams') AND (TABLE_NAME &amp;lt;&amp;gt; N'dtproperties')"&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt;;&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;.FillDataTable(TABLE_SQL);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;Any BO&amp;nbsp;user that&amp;nbsp;don't have access for table X, can access it easy...&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;I don't think direct SQL statement secure !&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;One malicious user can do :&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;1)Connection to my ES using the SDK. Remember! He is an user, so he have a login and password.&lt;BR&gt;2)Execute ANY direct SQL in the database, because, even using ES as database access, ES will uses the same database user for all connection.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;How to solve it :&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;Don't execute SQL statement. Send a command like "QueryCommand" and before execute it on ES/DataLayer context, pass it for the "Secure Layer", so we can do like it :&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;public&amp;nbsp;void Authorization( QueryCommand cmd )&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp; string tableName = cmd.SchemaName;&lt;BR&gt;&amp;nbsp;&amp;nbsp; string affectedFields = cmd.Fields;&lt;BR&gt;&amp;nbsp;&amp;nbsp; QueryType queryType = cmd.QueryType;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; AuthorizationLayer.Deman( tableName, affectedFields, queryType );&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;Rules :&lt;/P&gt;&lt;P&gt;1)Don't accept direct SQL Statement;&lt;BR&gt;2)Join must be from a View and not direct from table;&lt;/P&gt;&lt;P&gt;Note: This approach isn't limitation for Stored Procedures.&lt;/P&gt;&lt;P&gt;The main key of it is :&lt;/P&gt;&lt;P&gt;1) My BO only access DataLayer(..Get, GetAll, Save, Update etc.. )&lt;BR&gt;2) My QueryLayer only access my CommandLayer&lt;BR&gt;3) My CommandLayer only acess my DataAccess Layer&lt;/P&gt;&lt;P&gt;Here's my test case code :&lt;/P&gt;&lt;FONT size=2&gt;&lt;P&gt;[&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;TestMethod&lt;/FONT&gt;&lt;FONT size=2&gt;]&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;void&lt;/FONT&gt;&lt;FONT size=2&gt; QuerySelectTest()&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;ISelectQuery&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Customer&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt; query = (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;ISelectQuery&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Customer&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt;)&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;DataContext&lt;/FONT&gt;&lt;FONT size=2&gt;.CreateQuery&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Customer&amp;gt;&lt;/FONT&gt;&lt;FONT size=2&gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryType&lt;/FONT&gt;&lt;FONT size=2&gt;.Select);&lt;BR&gt;query.AddWhere(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Customer&lt;/FONT&gt;&lt;FONT size=2&gt;.&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;ColumnNames&lt;/FONT&gt;&lt;FONT size=2&gt;.CustomerID, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"ALFKI"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#2b91af size=2&gt;Customer&lt;/FONT&gt;&lt;FONT size=2&gt; customer = query.Get();&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#2b91af size=2&gt;Assert&lt;/FONT&gt;&lt;FONT size=2&gt;.IsNotNull(customer);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Assert&lt;/FONT&gt;&lt;FONT size=2&gt;.AreEqual(customer.CustomerID,&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"ALFKI"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Assert&lt;/FONT&gt;&lt;FONT size=2&gt;.AreEqual(customer.CompanyName, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"Alfreds Futterkiste"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Assert&lt;/FONT&gt;&lt;FONT size=2&gt;.AreEqual(customer.ContactName, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"Maria Anders"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Assert&lt;/FONT&gt;&lt;FONT size=2&gt;.IsNull(customer.Region);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;/* Now the flow&amp;nbsp; */&lt;BR&gt;&lt;BR&gt;//&lt;STRONG&gt;DataContext&lt;/STRONG&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;static&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IQuery&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;T&amp;gt; CreateQuery&amp;lt;T&amp;gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryType&lt;/FONT&gt;&lt;FONT size=2&gt; queryType) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;where&lt;/FONT&gt;&lt;FONT size=2&gt; T : &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;AbstractRecord&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;T&amp;gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt;()&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt;&lt;FONT size=2&gt; Default.DataLayer.CreateQuery&amp;lt;T&amp;gt;(queryType);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;//&lt;STRONG&gt;DataLayer &lt;/STRONG&gt;( SqlServerProvider )&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;override&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IQuery&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;T&amp;gt; CreateQuery&amp;lt;T&amp;gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryType&lt;/FONT&gt;&lt;FONT size=2&gt; queryType)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp; return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;SqlQueryFactory&lt;/FONT&gt;&lt;FONT size=2&gt;.Create&amp;lt;T&amp;gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;, queryType); &lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;//&lt;STRONG&gt;Factory&lt;BR&gt;&lt;/STRONG&gt;&lt;FONT size=2&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;switch&lt;/FONT&gt;&lt;FONT size=2&gt; (queryType)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryType&lt;/FONT&gt;&lt;FONT size=2&gt;.Select: &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;SelectDataQuery&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;T&amp;gt;(provider, provider, queryType);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryType&lt;/FONT&gt;&lt;FONT size=2&gt;.Insert:&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;case&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryType&lt;/FONT&gt;&lt;FONT size=2&gt;.Update: &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;SqlDataQuery&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;T&amp;gt;(provider, provider, queryType);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;default&lt;/FONT&gt;&lt;FONT size=2&gt;: &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;throw&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;NotImplementedException&lt;/FONT&gt;&lt;FONT size=2&gt;();&lt;BR&gt;}&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;//&lt;STRONG&gt;Now, Query.Get()&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;#region&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#000000&gt; ISelectQuery&amp;lt;T&amp;gt; Members&lt;BR&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; T Get()&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp; return&lt;/FONT&gt;&lt;FONT size=2&gt; DataLayer.Get&amp;lt;T&amp;gt;(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;#endregion&lt;/P&gt;&lt;P&gt;&lt;FONT style="BACKGROUND-COLOR: #ffffff" color=#333333&gt;//&lt;STRONG&gt;DataLayer &lt;/STRONG&gt;( SqlServerProvider )&lt;/FONT&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;virtual&lt;/FONT&gt;&lt;FONT size=2&gt; T Get&amp;lt;T&amp;gt;(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IQuery&lt;/FONT&gt;&lt;FONT size=2&gt; query) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;where&lt;/FONT&gt;&lt;FONT size=2&gt; T : &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;AbstractRecord&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;lt;T&amp;gt;, &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt;()&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;ExceptionHelper&lt;/FONT&gt;&lt;FONT size=2&gt;.ArgumentNullException(query, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"query"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;&lt;BR&gt;IRecordReader&lt;/FONT&gt;&lt;FONT size=2&gt; reader = query.ExecuteReader();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;if&lt;/FONT&gt;&lt;FONT size=2&gt; (!reader.IsEmpty)&lt;BR&gt;{&lt;BR&gt;T obj = CreateObject&amp;lt;T&amp;gt;();&lt;BR&gt;FetchObject&amp;lt;T&amp;gt;(obj, reader);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; obj;&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;else&lt;BR&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;null&lt;/FONT&gt;&lt;FONT size=2&gt;;&lt;BR&gt;}&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;&lt;FONT color=#333333&gt;//&lt;STRONG&gt;QueryLayer&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;virtual&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IRecordReader&lt;/FONT&gt;&lt;FONT size=2&gt; ExecuteReader()&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryCommand&lt;/FONT&gt;&lt;FONT size=2&gt; command = CreateCommand();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; _commandLayer.ExecuteReader(command);&lt;BR&gt;}&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;FONT color=#333333&gt;//&lt;STRONG&gt;DataLayer(SqlProvider) implement &lt;/STRONG&gt;&lt;FONT color=#2b91af&gt;ICommandLayer&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;virtual&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IRecordReader&lt;/FONT&gt;&lt;FONT size=2&gt; ExecuteReader(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryCommand&lt;/FONT&gt;&lt;FONT size=2&gt; command)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;ExceptionHelper&lt;/FONT&gt;&lt;FONT size=2&gt;.ArgumentNullException(command, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"command"&lt;/FONT&gt;&lt;FONT size=2&gt;);&lt;BR&gt;command.Prepare();&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; command.ExecuteReader(_dataAccess);&lt;BR&gt;}&lt;BR&gt;&lt;BR&gt;&lt;FONT color=#333333&gt;//&lt;STRONG&gt;CommandLayer&lt;BR&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;virtual&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IRecordReader&lt;/FONT&gt;&lt;FONT size=2&gt; ExecuteReader(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IDataAccess&lt;/FONT&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT size=2&gt; dataAccess)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;ExceptionHelper&lt;/FONT&gt;&lt;FONT size=2&gt;.ArgumentNullException(dataAccess, &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"dataAccess"&lt;/FONT&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&lt;FONT size=2&gt;);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; dataAccess.ExecuteReader(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;this&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT size=2&gt;&lt;STRONG&gt;);&lt;BR&gt;}&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;As you can see, my Command ONLY can access my Database when I pass it, so to turn it remotable easy, we can create a new provider WebServiceProvider that does it :&lt;/P&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;override&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IRecordReader&lt;/FONT&gt;&lt;FONT size=2&gt; ExecuteReader(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryCommand&lt;/FONT&gt;&lt;FONT size=2&gt; command)&lt;BR&gt;{&lt;BR&gt;/*the command must prepare all your data(i.e. table name, Efftected Fields and QueryType */&lt;BR&gt;command.Prepare();&lt;BR&gt;&lt;BR&gt;/* simple serialization of Command */&lt;BR&gt;&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;[] bytes = Nano.Mapper.IO.&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Serialization&lt;/FONT&gt;&lt;FONT size=2&gt;.SerializeBinary(command);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;using&lt;/FONT&gt;&lt;FONT size=2&gt; (&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;WCFMapperProviderProxy&lt;/FONT&gt;&lt;FONT size=2&gt; proxy = &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;new&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;WCFMapperProviderProxy&lt;/FONT&gt;&lt;FONT size=2&gt;())&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; bytes = proxy.ExecuteCommand(bytes);&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; Nano.Mapper.IO.&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Serialization&lt;/FONT&gt;&lt;FONT size=2&gt;.DeserializeBinary&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IRecordReader&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt;(bytes);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT size=2&gt;// MyWebService method ONLY does it :&lt;/FONT&gt;&lt;/P&gt;&lt;FONT size=2&gt;&lt;FONT size=2&gt;&lt;P&gt;[Transaction(TransactionOption.Required)]&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;&lt;BR&gt;public&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;[] ExecuteCommand(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;byte&lt;/FONT&gt;&lt;FONT size=2&gt;[] command)&lt;BR&gt;{&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryCommand&lt;/FONT&gt;&lt;FONT size=2&gt; queryCommand = &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Serialization&lt;/FONT&gt;&lt;FONT size=2&gt;.DeserializeBinary&amp;lt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;QueryCommand&lt;/FONT&gt;&lt;FONT size=2&gt;&amp;gt;(command);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;IRecordReader&lt;/FONT&gt;&lt;FONT size=2&gt; reader = queryCommand.ExecuteReader(&lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;DataContext&lt;/FONT&gt;&lt;FONT size=2&gt;.DefaultDataLayer.DataAccess);&lt;BR&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;return&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#2b91af size=2&gt;Serialization&lt;/FONT&gt;&lt;FONT size=2&gt;.SerializeBinary(reader);&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;1)As you can see, the Commands are executed on the Server DataAccess context.&lt;BR&gt;2)You can easy encrypt, compress or create a custom serialization.&lt;BR&gt;3)In the "ExecuteReader" of the command you can protect all access.&lt;BR&gt;4)You can uses the TransactionScope class of .NET 2.0 without problem.&lt;/P&gt;&lt;P&gt;&lt;FONT color=#2b91af&gt;IRecordReader&lt;/FONT&gt;&lt;FONT size=2&gt; is my optimized IDataReader object.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;Regards,&lt;BR&gt;Alexnaldo Santos&lt;FONT size=2&gt;&lt;BR&gt;&lt;/P&gt;&lt;/FONT&gt;</description><pubDate>Thu, 22 Feb 2007 09:12:25 GMT</pubDate><dc:creator>Alexnaldo C Santos</dc:creator></item><item><title>RE: Is Direct SQL Statement Secure  ?</title><link>http://forum.strataframe.net/FindPost7115.aspx</link><description>Oh, yes, LINQ will solve many of these problems.&amp;nbsp; The Enterprise Server will be converted over to handle IQuery objects rather than passing through the SQL commands, and you'll be able to configure those query objects to only support "data" commands and not database maintenance commands (like dropping tables).&amp;nbsp; So, yes, you get extra security in the additional logical layer because that layer becomes more configurable and therefore restrictable.</description><pubDate>Thu, 22 Feb 2007 09:12:25 GMT</pubDate><dc:creator>StrataFrame Team</dc:creator></item><item><title>RE: Is Direct SQL Statement Secure  ?</title><link>http://forum.strataframe.net/FindPost7102.aspx</link><description>Ben, I'm sure you guys at SF have had a close look at the up coming LINQ. Will LINQ solve some these SQL security problems that exist now? Another words if we are talking to SQL server via LINQ layer (which internally still uses SQL), is our app safer with LINQ?&lt;br&gt;
&lt;br&gt;
Thanks!</description><pubDate>Wed, 21 Feb 2007 23:02:20 GMT</pubDate><dc:creator>Ben Hayat</dc:creator></item><item><title>RE: Is Direct SQL Statement Secure  ?</title><link>http://forum.strataframe.net/FindPost6952.aspx</link><description>The same rules apply to SQL Security from both the ES and directly connecting to SQL Server... if you allow direct connections, any one of your users&amp;nbsp;with .NET (not just the ES SDK) can directly connect your database and execute any code.&amp;nbsp; So, security SQL Server is your best bet.&amp;nbsp; If you're worried about allowing users to execute code on your database, then turn off all permissions except EXECUTE and use only stored procedures.&lt;/P&gt;&lt;P&gt;There isn't a way to re-engineer the ES now... to work transparently with the current DbDataSourceItem system, it has to except and passthrough any authenticated command that is properly decrypted (by the PSK on both ends).</description><pubDate>Mon, 19 Feb 2007 10:11:55 GMT</pubDate><dc:creator>StrataFrame Team</dc:creator></item></channel></rss>