max328 0 / 0 / 0 Регистрация: 10.12.2015 Сообщений: 24 |
||||
1 |
||||
13.06.2019, 19:03. Показов 3562. Ответов 1 Метки нет (Все метки)
Здравствуйте. Во время ввода данных в таблицу, выскакивает следующее исключение: SQL logic error or missing database no such column: Size. С чем это может быть связано?
__________________
0 |
Zero day 267 / 231 / 78 Регистрация: 16.12.2015 Сообщений: 943 Записей в блоге: 4 |
|
14.06.2019, 08:15 |
2 |
max328, поле Size точно присутствует в таблице Bilboards? Если оно точно есть, нет ли, случайно, пробела в названии (в начале или конце), например не «Size», а » Size» или «Size «?
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
14.06.2019, 08:15 |
2 |
Hi Guys
I wrote a script that checks the WIFI signal and some other stuff. I want to put that in a SQLite DB.
DB creation:
Add-Type -Path "C:Program FilesSystem.Data.SQLite2010binSystem.Data.SQLite.dll" $cn = New-Object -TypeName System.Data.SQLite.SQLiteConnection $cn.ConnectionString = "Data Source=C:DatabaseStatus.db;New=True; "$cn.Open() $cm = New-Object -TypeName System.Data.SQLite.SQLiteCommand $sql = “create table network_State_Polling(create_date TEXT, LAN_Name TEXT, LAN_State varchar(70), LAN_Signal varchar(50), WiFi_Name varchar(50), WiFi_State varchar(50), WiFi_Signal varchar(50), MBN_Name varchar(50), MBN_State varchar(50), MBN_Signal varchar(50));” $cm.Connection = $cn $cm.CommandText = $sql $cm.ExecuteNonQuery() $cn.Close()
To test the input of variables i did the following:
Function AddRecord ($Date, $Date1){ Add-Type -Path “C:Program FilesSystem.Data.SQLite2010binSystem.Data.SQLite.dll” $cn = New-Object -TypeName System.Data.SQLite.SQLiteConnection $cn.ConnectionString = “Data Source=C:DatabaseStatus.db” $cn.Open() $cm = New-Object -TypeName System.Data.SQLite.SQLiteCommand $sql = "insert into network_State_Polling values($Date, $Date1,'test2','test3','test','test1','test2','test3','test2','test3');" $cm.Connection = $cn $cm.CommandText = $sql $cm.ExecuteNonQuery() $cn.Close() } $Date = ((Get-Date).ToString('ddMMyyyyHHmmss')) #WIFI $enabledWIFI = Get-WmiObject -Namespace "rootcimv2" -Query 'select NetEnabled from win32_networkadapter where Description = "Intel(R) Dual Band Wireless-AC 7260"' write-host "WiFi connection" if ($enabledWIFI.NetEnabled){ $wlanraw = netsh wlan show interface #$objWLAN = "" | Select-Object SSID, Signal, State ForEach ($Line in $wlanraw) { if ([regex]::IsMatch($Line," SSID")) { $objWLANSSID = $Line -Replace" SSID : ","" } if ([regex]::IsMatch($Line," Signal")) { $objWLANSignal = $Line -replace " Signal : ","" } if ([regex]::IsMatch($Line," State")) { $objWLANState = $Line -replace " State : ","" } } if ([regex]::IsMatch($objWLANSSID, "NmbsSncb")) { $State = $objWLANState write-host "SSID: "$objWLANSSID write-host "Signal: "$objWLANSignal Write-Host "" } }else { Write-Host "Device is not on WIFI or WIFI is disabled" Write-host "" }
AddRecord $Date $objWLANState.ToString()
Don’t focus on the names (LAN, WIFI etc), it’s just for testing.
Unfortunaly i get an error:
Exception calling «ExecuteNonQuery» with «0» argument(s): «SQL logic error or missing database
no such column: connected»
At C:TempAddingLines.ps1:17 char:1
+ $cm.ExecuteNonQuery()
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : SQLiteException
Connect is the value of$objWLANState.
Could somebody help me please? I have no idea what i’m doing wrong..
Thanks!
Steini46
-
Изменен тип
29 сентября 2015 г. 15:46
-
Перемещено
Bill_Stewart
29 сентября 2015 г. 15:46
This is not support forum for third party software
-
У меня есть вот такой класс DataProvider https://pastebin.com/WKxsCec7 ,
Который отвечает за коммуникацию плагина с базой данных. Этот класс может работать как с SQLite так и с MySQL. Но проблема в том что при работе с MySQL проблем никаких нет и все Unit тесты проходят но когда я в настройках ставлю isMySqlEnabled false тоесть заставляю работать с SQLite то при сохранении клана мне выдает вот эту ошибкуjava.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (no such column: true) at org.sqlite.DB.newSQLException(DB.java:383) at org.sqlite.DB.newSQLException(DB.java:387) at org.sqlite.DB.throwex(DB.java:374) at org.sqlite.NativeDB.prepare(Native Method) at org.sqlite.DB.prepare(DB.java:123) at org.sqlite.Stmt.execute(Stmt.java:113) at com.lairon.xclans.data.DataProvider.saveClan(DataProvider.java:114) at DataProviderTests.fullClanTest(DataProviderTests.java:94) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:78) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:567) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) at org.junit.runners.ParentRunner.run(ParentRunner.java:300) at org.junit.runner.JUnitCore.run(JUnitCore.java:157) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
пишет что он не нашел колонку при использовании метода saveClan у DataProvider.
Юнит тесты: https://pastebin.com/5VDhP7nE
Пробовал удалять файлик с Базой SQLite не помогло
-
Dymeth
Активный участник
Пользователь- Баллы:
- 96
- Имя в Minecraft:
- Dymeth
Ты пытаешься обратиться к полю с названием «true». Естественно, что такого поля нет.
Если не можешь понять, где ты его используешь — выведи на экран свой запрос после выполнения всех замен плейсхолдеров на параметры.Но один важный момент — запросы так формировать нельзя. Ни в SQLite, ни в MySQL, ни где-либо ещё — ты ставишь под угрозу свой сервер. Почитай в интернете по запросу «SQL-инъекция».
В твоём случае необходимо заменить в строке запроса все конкретные значения параметров на знаки вопроса, а сами параметры устанавливать в запрос при помощи метода statement.setObject(). Данный метод присутствует у интерфейса PreparedStatement, поэтому тебе необходимо будет вместо connection.createStatement() использовать connection.prepareStatement()
-
Заменил на PreparedStatement и все заработало как часы с обоими базами.
Про SQL инъекцию я знал не не думал что она работает именно так.
И кстати вывел SQL до момента изменения на PreparedStatement и он вроде бы был нормальный с виду да и MySql с ним работал хорошо.
Огромное спасибо -
NuaN
Активный участник
Пользователь- Баллы:
- 96
- Имя в Minecraft:
- NuaN
Ну чтобы внедрить SQL-инъекцию это еще нужно сильно постараться. Особенно когда у тебя нет доступа к структуре БД, ты не знаешь какие там вообще таблицы и какие колонки, то вряд-ли что-то можно сделать. Или не?
-
Даже если и так, риск все равно будет.
Если представить что большинства используют таблицу с названием users, можно просто сделать что то вроде этого, при условии что запрос будет выглядеть так://Если представить что пользователь ввел в поле эти данные
String userName = «test; DROP TABLE users»;
//Готовый запрос
String query = «SELECT * FROM users WHERE name = » + userName;Или простым перебором таких иньекций, может быть какая та база и дропнится)
-
Dymeth
Активный участник
Пользователь- Баллы:
- 96
- Имя в Minecraft:
- Dymeth
Существуют способы выяснения названий таблиц, столбцов и так далее (гугл в помощь). Не всегда это воплотимо, но, как написали выше, рисковать не стоит. Достаточно один раз привыкнуть не передавать параметры в строке. Это достаточно просто
-
NuaN
Активный участник
Пользователь- Баллы:
- 96
- Имя в Minecraft:
- NuaN
Кстати да) Так хорошо можно нашкодить
-
Без вывода ошибок только наугад и гугл твой не поможет, яндекс тоже.
-
Dymeth
Активный участник
Пользователь- Баллы:
- 96
- Имя в Minecraft:
- Dymeth
А что, ошибки никогда не выводятся? Специально для тебя написал «Не всегда это воплотимо»
-
Нет конечно, у игрока только стандартная ошибка команды будет и все. Так что инъекцию в плагине будет не так просто заюзать, как на сайтах где гореадмин не отключил логирование.
Последнее редактирование: 22 апр 2022 -
Dymeth
Активный участник
Пользователь- Баллы:
- 96
- Имя в Minecraft:
- Dymeth
Передавать параметры НЕ строкой нужно везде, включая сайты. Хватит на пустом месте полемику разводить
-
Так это вы разводите, я лишь сказал, что проюзать инъекцию сложно без получения ошибок и ваши гуглы вам не помогут.
Поделиться этой страницей