Įterpkite tekstą vienintelėmis citatomis „PostgreSQL“

Turiu lentelės test(id,name) .

Turiu įterpti tokias vertes kaip: user log , 'my user' , customer's .

  insert into test values (1,'user log'); insert into test values (2,''my users''); insert into test values (3,'customer's'); 

Gavau klaidą, jei vykdau bet kurį iš pirmiau minėtų nurodymų.

Jei yra būdas tai padaryti, pasidalinkite ja. Nenoriu jokių parengtų pareiškimų.

Ar galima naudoti sql atrankos mechanizmą?

254
07 сент. rinkinys MAHI 07 sept. 2012-09-07 14:11 '12 12:11 pm 2012-09-07 14:11
@ 6 atsakymai

Atskirų kabučių sumažinimas dvigubinant juos → '' yra standartinis būdas ir, žinoma, veikia.

standard_conforming_strings = off arba, jei paprastai pridėjote eilutę į E kad paskelbtumėte Posix pabėgimo kodo eilutės sintaksę, taip pat galite pabėgti su grįžtamuoju brūkšniu \ 

doleriais koduotomis eilutėmis : 

 $token2$Inner string: $token1$escape ' with ''$token1$ is nested$token2$ 

Atkreipkite dėmesį, kad $ simbolis turi turėti specialią reikšmę jūsų kliento programinėje įrangoje. Jums gali tekti to išvengti. Tai netaikoma standartiniams PostgreSQL klientams, pvz., Psql arba pgAdmin.

Tai labai naudinga rašant plpgsql funkcijas arba specialias SQL komandas. Ji negali palengvinti poreikio naudoti paruoštus pareiškimus ar kitą metodą, kad apsaugotumėte nuo SQL injekcijos jūsų programoje, kai galima įvesti vartotoją. Atsakymas @Craig turi daugiau informacijos apie tai. Daugiau informacijos:

497
07 сент. Atsakymą pateikė Erwin Brandstetter 07 Sep. 2012-09-07 18:06 '12, 18:06 2012-09-07 18:06

Tai yra tiek daug blogų pasaulių, nes jūsų klausimas reiškia, kad jūsų programoje tikriausiai yra atvirų SQL įpurškimo skylių.

Turite naudoti parametruotus operatorius. Jei naudojate „Java“, naudokite „ PreparedStatement su vietos žymenimis . Jūs sakote, kad nenorite naudoti parametruotų pareiškimų, bet nesakote, kodėl, ir, atvirai kalbant, tai yra labai gera priežastis nenaudoti jų, nes jie yra paprasčiausias ir saugiausias būdas išspręsti problemą, kurią bandote išspręsti.

Žr. „ SQL injekcijos prevencija Java“ . Negalima būti kita Bobby auka.

„PgJDBC“ neturi viešosios funkcijos styginiams cituoti ir pabėgti. Tai iš dalies dėl to, kad ji gali atrodyti kaip gera idėja.

„PostgreSQL“ yra pastatytos quote_literal ir quote_ident , tačiau jos skirtos PL/PgSQL funkcijoms, naudojančioms EXECUTE . Šiandien quote_literal dažniausiai pasenęs EXECUTE ... USING , kuris yra parametruojama versija, nes jis yra saugesnis ir paprastesnis. Jūs negalite jų naudoti, kad paaiškintumėte čia, nes tai yra serverio funkcijos.


Įsivaizduokite, kas atsitiks, jei gausite vertę ');DROP SCHEMA public;-- iš užpuoliko. Jūs gaminsite:

 insert into test values (1,'');DROP SCHEMA public;--'); 

kuris yra padalintas į du operatorius ir komentarą, kuris ignoruojamas:

 insert into test values (1,''); DROP SCHEMA public; --'); 

Turite duomenų bazę.

39
07 сент. Craig Ringer atsakymas. 2012-09-07 14:36 '12 at 2:36 pm 2012-09-07 14:36

Pagal PostgreSQL dokumentaciją (4.1.2.1. Styginių konstantai) :

  To include a single-quote character within a string constant, write two adjacent single quotes, eg 'Dianne' horse'. 

Taip pat žr. Standarto_konformavimo_stringų parametrą, kuris kontroliuoja, ar ekranavimas veikia su grįžtamuoju sluoksniu.

15
07 сент. Claudix atsakė 07 Sep 2012-09-07 14:23 '12, 12:23 PM 2012-09-07 14:23

„Postgresql“, jei norite įterpti vertes į ' , tada jums reikės pateikti papildomų '

  insert into test values (1,'user' log'); insert into test values (2,'''my users'''); insert into test values (3,'customer''s'); 
6
07 сент. Atsakyti Hunter Sep 07 2012-09-07 23:44 '12 at 11:44 2012-09-07 23:44

Galite naudoti postrgesql chr (int) funkciją:

 insert into test values (2,'|| chr(39)||'my users'||chr(39)||'); 
3
29 дек. atsakymą pateikė Slava Struminski 29 d. 2017-12-29 13:00 '17, 13:00, 2017-12-29 13:00

Jei reikia atlikti darbą viduje „Pg“:

to_json(value)

https://www.postgresql.org/docs/9.3/static/functions-json.html#FUNCTIONS-JSON-TABLE

1
18 дек. atsakymas pateiktas 18 d. hatenine . 2017-12-18 20:01 '17, 08:01 pm 2017-12-18 20:01
"192.102.6.96 - 192.102.6.96"