如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
我想了解人们如何处理跟踪和登录实际应用程序的故事.以下是一些可能有助于解释您的答案的问题.
构架
你使用什么框架?
如果使用跟踪,是否使用Trace.Correlation.StartLogicalOperation?
您是手动编写此代码,还是使用某种形式的面向方面编程来执行此操作?小心共享代码片段?
您是否在跟踪源上提供任何形式的粒度?例如,WPF TraceSources允许您在不同级别配置它们:
听众
你使用什么日志输出?
如果使用文件,您使用滚动日志还是仅使用单个文件?如何使日志可供人们使用?
查看
您可以使用哪些工具查看日志?
如果要构建ASP.NET解决方案,是否还使用ASP.NET运行状况监视?您是否在运行状况监视器事件中包含跟踪输出?那么Trace.axd呢?
自定义性能计数器怎么样?
根据NLog的文档:
大多数应用程序将为每个类使用一个记录器,其中记录器的名称与类的名称相同.
这与log4net的运行方式相同.为什么这是一个好习惯?
有许多不同的日志库可供选择,每个都有自己的一套怪癖和优点.(.Net示例:log4net,System.Diagnostics.TraceSource,nLog等)
自然的倾向是抽象出那些怪癖并使用伐木立面.(示例:Castle.Services.Logging,Common.Logging,Simple Logging Facade)这样,如果您使用的给定日志框架变得陈旧,或者另一个日常框架变得流行,您可以换掉实现并离开代码没有动过.
但是有多个伐木外墙可供选择.鉴于许多不同的日志记录实现的答案是抽象,为什么不使用日志门面?如果这听起来很荒谬,是什么让它比原始的伐木门面更荒谬?是什么让一个额外的抽象层在日志框架之上成为神奇的数字?
我目前在许多项目中使用NLog.在某些情况下,我登录到数据库.
这是我想做的事情:
CREATE TABLE [dbo].[NLogEntries](
[Id] [bigint] IDENTITY(1,1) NOT NULL,
[Origin] [nvarchar](100) NOT NULL,
[LogLevel] [nvarchar](20) NOT NULL,
[Message] [nvarchar](3600) NOT NULL,
[CreatedOn] [datetime] NOT NULL,
[OrderId] [int] NULL --Custom field!
)
Run Code Online (Sandbox Code Playgroud)
NLog.config和这个目标:
<target type="Database" name="database" connectionstring="Server=localhost;Database=NLog;Trusted_Connection=True;">
<commandText>
INSERT INTO NLogEntries ([Origin], [Message], [LogLevel],[CreatedOn],[OrderId]) VALUES (@Origin,@Message,@LogLevel,@Date, @OrderId);
</commandText>
<parameter name="@Date" layout="${date}"/>
<parameter name="@Origin" layout="${callsite}"/>
<parameter name="@LogLevel" layout="${level}"/>
<parameter name="@message" layout="${message}"/>
<parameter name="@OrderId" layout="${orderId}"/> <!-- custom field! -->
</target>
Run Code Online (Sandbox Code Playgroud)
然后记录这样的事情:
var logger = LogManager.GetCurrentClassLogger();
var orderId = 123;
logger.Debug("What is going …Run Code Online (Sandbox Code Playgroud) 在我的NLog配置中,我有一个全能记录器,但我创建的特定记录器非常垃圾,我希望它的输出转到它自己的文件.这一部分很简单,但是catch-all记录器也会收到垃圾邮件日志消息.如何告诉主记录器记录所有内容,但要排除垃圾记录器?
我正在使用NLog 2.0.
好,
我已经等了好几天才决定发布这个问题,因为我不知道如何说明这一点,重新进入一篇详细的帖子.但是,我认为在这一点上要求社区提供帮助是相关的.
基本上,我尝试使用NLog为数百个线程配置记录器.我认为这将非常简单,但我在几十秒后得到了这个异常:" InvalidOperationException:Collection被修改;枚举操作可能无法执行 "
这是代码.
//Launches threads that initiate loggers
class ThreadManager
{
//(...)
for (int i = 0; i<500; i++)
{
myWorker wk = new myWorker();
wk.RunWorkerAsync();
}
internal class myWorker : : BackgroundWorker
{
protected override void OnDoWork(DoWorkEventArgs e)
{
// "Logging" is Not static - Just to eliminate this possibility
// as an error culprit
Logging L = new Logging();
//myRandomID is a random 12 characters sequence
//iLog Method is detailed below
Logger log = L.iLog(myRandomID); …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我每天处理数千个文档.我想,在某些情况下,一些日志,一个按文档记录.然后我想要一个特定的目标在运行时更改输出文件名(和只有文件名).
在网络上我发现如何通过编程来创建目标我只想通过编程更新文件名.我试过下面的代码.我收到的错误是"无法找到LayoutRender'logDirectory'.
任何的想法 ?
谢谢,
var target = (FileTarget)LogManager.Configuration.FindTargetByName("logfile");
target.FileName = "${logDirectory}/file2.txt";
LoggingConfiguration config = new LoggingConfiguration();
var asyncFileTarget = new AsyncTargetWrapper(target);
config.AddTarget("logfile", asyncFileTarget);
LogManager.Configuration = config;
Run Code Online (Sandbox Code Playgroud)
配置文件是:
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<variable name="logDirectory" value="C:/MyLogs"/>
<targets>
<target name="logfile" xsi:type="File" layout="${date:format=dd/MM/yyyy HH\:mm\:ss.fff}|${level}|${stacktrace}|${message}" fileName="${logDirectory}/file.txt" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="logfile" />
</rules>
</nlog>
Run Code Online (Sandbox Code Playgroud) 在NLog中是否可以创建具有不同配置的多个记录器?
我有一个组件,每次实例化必须将所有事件记录到与新实例相关的不同文件.
NLog可以实现吗?如果没有,那么有日志框架可以做到这一点吗?