我正在尝试创建一个脚本,该脚本从我们网络中的服务位置获取数据并将其集中在一个数据库中。目前,我正尝试从AD中获取数据,但它已存储在数据库中,但得到了一些奇怪的结果。
function Set-ODBC-Data{
param(
[string]$query=$(throw 'query is required.')
)
$cmd = new-object System.Data.Odbc.OdbcCommand($query,$DBConnection)
$cmd.ExecuteNonQuery()
}
$DBConnection = $null
$DBConnected = $FALSE
try{
$DBConnection = New-Object System.Data.Odbc.OdbcConnection
$DBConnection.ConnectionString = "Driver={MySQL ODBC 8.0 Unicode Driver};Server=127.0.0.1;Database=pcinventory;User=uSR;Password=PpPwWwDdD;Port=3306"
$DBConnection.Open()
$DBConnected = $TRUE
Write-Host "Connected to the MySQL database."
}
catch{
Write-Host "Unable to connect to the database..."
}
$ADEMEA = "ADSERVER.SERVER.WORK"
$addata = Get-ADComputer -filter * -property Name,CanonicalName,LastLogonDate,IPv4Address,OperatingSystem,OperatingSystemVersion -Server $ADEMEA | Select-Object Name,CanonicalName,LastLogonDate,IPv4Address,OperatingSystem,OperatingSystemVersion
ForEach($aditem in $addata){
Set-ODBC-Data -query "INSERT INTO ad VALUES( '$aditem.Name', '','','','','' )"
}
我数据库中的结果看起来像这样
发生这种情况,因为$aditem
是一个自定义的Powershell对象,而SQL插入查询并不完全知道如何处理它。结果是一个哈希表(又名键值存储),其中包含对象的属性和属性值。
至于修复,好的方法是使用参数化查询。
关于使SQL注入变得容易的快速而肮脏的解决方法,请在几部分中构建插入字符串。使用字符串格式{}
和-f
使其非常简单。像这样,
$q = "INSERT INTO ad VALUES( '{0}', '{1}', '{2}' )" -f $aditem.name, "more", "stuff"
write-host "Query: $q" # For debugging purposes
Set-ODBC-Data -query $q
快速和肮脏的问题是,如前面提到的SQL注入。考虑如果输入是
$aditem.name, "more", "'); drop database pcinventory; --"
如果语法是关于权限的,并且权限足够,它将执行插入。之后,它将删除您的pcinventory
数据库。因此,除非您确定自己在做什么,否则不要尝试使用快速方法。