我尝试在使用sql命令和参数插入新表之前从Oracle表中删除记录,因为该值来自浏览器。
这是代码:
var tableName = "<myTableName>";
context.Database.ExecuteSqlCommand("DELETE :p0", tableName);
Oracle正在抛出&#34; ORA-00903:无效的表名&#34;。
我也尝试过:
context.Database.ExecuteSqlCommand("DELETE :p0", new OracleParameter("p0", OracleDbType.VarChar, 200, tableName, ParameterDirection.Input)
我缺少一些简单的东西吗?
答案 0 :(得分:1)
如果您针对ALL_TABLES
退出表格,您应该能够阻止任何SQL注入攻击:
private bool TruncateTable(string Schema, string Table)
{
OracleCommand cmd = new OracleCommand("select count (*) from all_tables " +
"where owner = :SCHEMANAME and table_name = :TABLENAME", conn);
cmd.Parameters.Add("SCHEMANAME", Schema.ToUpper());
cmd.Parameters.Add("TABLENAME", Table.ToUpper());
if (Convert.ToInt32(cmd.ExecuteScalar()) == 0)
return false;
cmd.CommandText = string.Format("delete from {0}.{1}", Schema, Table);
cmd.Parameters.Clear();
cmd.ExecuteNonQuery();
return true;
}
在DevArt上,我认为Add
将改为AddWithValues
,但看起来会相同。
在这种情况下,返回值为false意味着没有这样的表。这一切都预示着用户可以从相关表中删除。
此外,如果可能,truncate
是delete from
的不错选择。它的速度要快得多,并且会重置高水位线。我认为你需要成为一个所有者或者让#34;放弃任何一张桌子&#34;有权执行此操作,但还有其他方法 - 例如,让DBA设置存储过程来对某些表执行截断。