1c yerleşik dil yığını taşması. Yığın Taşması

  • 10.01.2022

14.04.2016 Versiyon 3.22 Arayüz değiştirildi, kayıtların aktarılmasındaki hatalar düzeltildi, organizasyonun transfer prosedürü ve muhasebe politikaları değiştirildi. Platform 8.3.7.2027 BP 3.0.43.174
17.03.2016 Versiyon 3.24 Fark edilen hatalar düzeltildi. Platform 8.3.8.1747 BP 3.0.43.241
16.06.2016 Versiyon 3.26 Fark edilen hatalar düzeltildi. Platform 8.3.8.2088 BP 3.0.44.123
16.10.2016 Versiyon 4.0.1.2 Değer depolamanın sabit aktarımı, 3.44.* sürümleri için muhasebe politikasının değiştirilmiş aktarımı. Platform 8.3.9.1818 BP 3.0.44.164.
19.04.2017 Versiyon 4.0.2.7 Dizinlerle ilişkili kayıtların aktarılmasına yönelik algoritma değiştirildi, fark edilen hatalar düzeltildi, bağlantıların üzerine yazılarak aktarım düzeltildi.
29.05.2017 Versiyon 4.0.4.5 Hareketlerin aktarımı değiştirildi, aktarılan belgelerin hareketlerinin görüntülenmesi eklendi, başka bir şey daha...
30.05.2017 Versiyon 4.0.4.6 Kaynaktaki mevcut dizinlerin listesini doldururken oluşan hata düzeltildi (teşekkürler shoy)
17.06.2017 Versiyon 4.0.5.1 Hareketleri aktarma algoritması değiştirildi.
19.07.2017 Versiyon 4.0.5.4 CI'nin BP 2.0'dan aktarımı değiştirildi. Beklenmedik bir şekilde UT 10.3'ten transfer Smilegm tarafından gerçekleştirildi, bu versiyonda transfer bu duruma göre biraz düzeltildi)))
08/10/2017 Versiyon 4.0.5.5 BP 2.0'dan aktarım sırasındaki hatalar düzeltildi
19.09.2017 Versiyon 4.4.5.7 3.0.52.* için sabit bağlantı kontrolü
28.11.2017 Sürüm 4.4.5.9 Bildirilen hatalar düzeltildi
12/06/2017 Versiyon 5.2.0.4 Bağlantı arama algoritması yeniden tasarlandı. BP 1.6'dan transfer prosedürleri eklendi; artık BP ile sıkı bir bağlantı yok - "neredeyse" aynı konfigürasyonlardaki verileri aktarmak için onu kolayca kullanabilirsiniz. Tüm yorumları derhal düzeltmeye çalışacağım.
12/08/2017 Sürüm 5.2.1.3 Maaş tablolarının BP.2.0'dan BP 3.0'a aktarılmasına yönelik bir algoritma eklendi. Aynı konfigürasyonlar arasında paylaşıma yönelik değişiklikler eklendi.
19.12.2017 Versiyon 5.2.2.2 Bu kayıtların boyutlarında olan dizinler için bağımsız bilgi kayıtlarının aktarımında düzenleme yapıldı.

12/06/2017 Yeni işleme sürümü 5.2.0.4. Önemli değişiklikler arasında BP 1.6'dan BP 3.0'a geçiş yeteneği de yer alıyor. Ana değişiklik, dizin bağlantıları aramasının yönetimidir - önceki sürümlerde arama GUID'e göre yapılıyordu, ancak bu sürümde "Ayrıntılara göre" aramayı etkinleştirebilirsiniz:

17.01.2018 Sürüm 5.2.2.3 Düzeltildi - alt dizinlerde ve periyodik bilgi kayıtlarında fark edilen hatalar.

19.07.2018 Versiyon 5.2.2.8 Fark edilen hatalar düzeltildi.

herhangi bir dizin için arama ayrıntılarını ayarlayabileceğiniz. Bu modun kendisi, halihazırda veri içeren mevcut bir veritabanına geçiş yapılmasının gerekli olduğu durumlar için (örneğin, iki kuruluşun muhasebe kayıtlarını tek bir veritabanında birleştirmek için) çalışanların çok sayıda talebi üzerine "ortaya çıktı".

21.12.2015 Sırasıyla Platform 8.3.7.1805 ve BP 3.0.43.29 yayınlandı yeni bir versiyon işleme 3.1:-) (açıklama aşağıdadır). Yeni işlevsellik - iki BP veri tabanı arasındaki bakiyeleri ve ciroları karşılaştırma yeteneği (hesap planları çakışıyorsa tüm hesaplar için veya analizli veya analizsiz bireysel eşleşen muhasebe hesapları için).
01/03/2016 Versiyon 3.5 - kaynak tabanına bağlanma mekanizması değiştirildi - BSP 2.3.2.43 ile uyumlu hale getirildi. Küçük hatalar düzeltildi. Platform 8.3.7.1845, BP 3.0.43.50
16.02.2016 Versiyon 3.6 - Hareketlerle aktarılan belgeler için "Manuel düzeltmeyi ayarla" bayrağı eklendi. Hareketlerin sabit aktarımı - tarihi dönemin başlangıcından daha az olan belgeler hareketsiz olarak aktarılır. Platform 8.3.7.1917, BP 3.0.43.116
22.03.2016 Sürüm 3.10 - Referans verilen nesnelerin zorunlu olarak yeniden yazılması için "Her zaman referansların üzerine yaz" bayrağı eklendi (aktarım hızı önemli ölçüde azalır, ancak bazen gereklidir). Kaynak ve hedef hesap planlarının yazışmalarını (hesap kodlarıyla aynı düzeyde) ve sabitlerin aktarımını yapılandırabileceğiniz "Hazırlık" sekmesi eklendi. Platform 8.3.7.1970, BP 3.0.43.148

04/03/2016 Versiyon 3.11 Kaynakta mevcut olan belge listesinin doldurulması değiştirildi: hesap planına göre hareketlerle dolduruldu, tıpkı //'de olduğu gibi sadece döneme ait bağlantılarla yapıldı. site/genel/509628/

İşleme, ITS ile "MXL Yükleme" ile aynı şekilde, yalnızca XML, JSON ve diğer ara dosyaları kullanmadan herhangi bir süre için veri aktarımı için tasarlanmıştır - COM aracılığıyla veritabanından veritabanına alışveriş. 3.10'dan daha eski sürümlerde, comcntr.dll dosyasının (işletim sistemi "izin veriyorsa") ve ayrıca bağlantı kurmanın imkansız olduğu durumlarda çeşitli mesajların kaydedilmesini sağlayan BSP'nin bir algoritması kullanılarak bir bağlantı kullanılır. örnek - “Bilgi tabanı güncellenme sürecindedir” vb. . IS kaynağı olarak bir alıcının seçilmesine yönelik kontrol eklendi - bir uyarı verilir.

Şunlar için kullanılabilir:

1. Referans bilgilerinin (RNI) IS kaynağından IS hedefine aktarılması (referans bilgilerinin tamamının aktarımı kullanıcının isteği üzerine gerçekleştirilir, gerekli referans kitapları vb. herhangi bir aktarım sırasında bağlantılar aracılığıyla aktarılır).

2. Seçilen herhangi bir dönem için belgelerin aktarılması.

3. "Bozuk" bir bilgi güvenliği sisteminden tüm bilgilerin aktarılması, eğer sistem 1C:Enterprise modunda başlatılırsa ve veri yüklemek veya Yapılandırıcıyı başlatmak mümkün değildir.

İşleme özelliği - alıcının ve kaynağın bilgi güvenliği farklı olabilir; 2.0'dan 3.0'a aktarım - sürümler farklıdır, ancak aktarım çalışır!!! Eşleşmeyen ayrıntılar göz ardı edilir veya bunlar için aktarım algoritmalarının belirtilmesi gerekir.

Yorum: Veri dönüştürme KULLANILMAZ! Ve nedenini sorma!!! Özellikle seçici olanlar için - BP 3.0 neredeyse her gün değişiyor, artık transfer kurallarını güncel tutacak güç yok - burada her şey daha basit :-).

İşlemenin bir başka özelliği de alıcının bilgi güvenliğinde başlatılmasıdır (işlevsellik açısından en yakın analoglar, kaynaktan alıcıya kadar tam tersi şekilde çalışır).

Başlarken - işlem süresini belirtmeniz, organizasyonu kaynaktan belirtmeniz gerekir, hedefe aktarılacaktır.

Bir organizasyonun devri sırasında muhasebe politikaları ve “ilgili” bilgi kayıtları da devredilir. Bu nedenle kaynakta bir kuruluşu ilk seçtiğinizde alıcıda görünmesi biraz zaman alacaktır.

Kaynağın ve hedefin hesap grafikleri aynı olmalı, sürüm 2.*'de hedefe farklı hesaplar aktarılmamaktadır, gelecekte eşleşen hesapların ve analitiklerin ayarlanmasının da sağlanması planlanmaktadır. Alıcıda bulunmayan kodlar kullanılarak hesap aktarımı OLUŞTURULAMAZ!!!

Geri kalan nesneler dahili tanımlayıcılar (GUID) kullanılarak aktarılır, bu nedenle bazı önemli dizinlere, örneğin Para Birimlerine dikkat etmelisiniz.

"Temiz" bir veritabanıyla alışveriş yapmayı planlıyorsanız, değişimden önceki ilk başlatma sırasında doldurulan dizinleri silmek daha iyidir. İşleme sırasında neden bu dizin öğelerini alabileceğiniz ve silebileceğiniz bir sayfa var? En azından "ovmak" para birimini kaldırmanız gerekir. - Çünkü çoğaltma neredeyse kaçınılmazdır (prensipte bu, BP 3.0'da yerleşik kopyaların aranması ve değiştirilmesinin paylaşılmasından sonra kolayca düzeltilir).

İşleme, ilk doldurma formu açıkken dizin silme sayfasının çağrılmasını sağlar:

İşlemeyi açtığınızda, ilk doldurma sırasında doldurulan dizinleri silmek için bir sayfa görüntülenecektir:

3.22 sürümünden bu yana arayüz değiştirildi, artık tüm hazırlık işlemleri sekmeli ve her zaman kullanılabilir durumda


Kaynağın ve alıcının Hesap Planının yazışmasını kontrol etmek ve hesapların yazışmasını belirttiğinizden emin olmak önemlidir.

Önceden tanımlanmış dizin öğelerini silmeye gerek yoktur; bunlar yapılandırma tanımlayıcıları (GUID'ler değil) tarafından aktarılır.

Dizinlerden ve belgelerden seçim formunu kullanarak aktarım için nesneleri seçebilirsiniz. (Bu nesnelerle ilişkili bilgi kayıtları otomatik olarak aktarılacaktır, dolayısıyla bunları ayrı ayrı seçmenize gerek yoktur).Kayıtların aktarımı, azaltma geçici olarak devre dışı bırakıldı - aktarım için bir kayıt listesi geliştirmeniz gerekiyor - bir şey aktarılmalı, bir şey aktarılmamalı, bu aşamada dizinlere aktarılanlar yeterli, aktarım için kayıtların listesi olacak gelecek sürümlerde şablonda.

2.0 ile geçiş yaparken bazı ayrıntılar (örneğin, İletişim bilgileri) işleme yerleşik algoritmaya göre aktarılır, çünkü 2.0 ve 3.0 için bunlar farklı şekilde depolanır. Bir takım belgelerde de durum benzerdir (örneğin Borç Düzeltme).

Nesne türlerinin listesi sürüm 3.22'de farklı şekilde doldurulabilir, bu bir alt menüye yerleştirilmiştir, değişiklikler resimde belirtilmiştir:

İşlemenin kullanımında bir basitleştirme vardır - değişim için dizinleri seçemezsiniz, ancak alıcıdaki türlerin listesini yalnızca kaynakta en az bir girişi olan dizin türleriyle doldurabilirsiniz.

İşleme, kaynaktan hedefe aktarılması gerekmeyen dizinleri listeleyen yerleşik bir düzene sahiptir ("Aktarımdan hariç tut" düzeni). Bu düzene herhangi bir dizini ekleyebilir (kaldırabilirsiniz). Tüm referans verilerini aktarmanız gerekmiyorsa, tür seçmeden bir listesi de alınabilen belgeleri aktarmanız yeterlidir, işlemlerin mevcut olduğu tüm kaynak belgeleri doldurmanız yeterlidir.

Belgelerin hareketlerle aktarımı sağlanır; 3.0 ila 3.0 arasındaki değişimler ve hesap planlarının yazışmaları için bire bir çalışır; 2.0 ila 3.0 alışverişi sırasında hatalar mümkündür, bu nedenle belgelerin hareketsiz aktarılması önerilir ve ardından bunları alıcıya aktarmanız yeterlidir. Belgeleri hareketlerle aktarırken “Manuel ayar” bayrağı ayarlanır.

"Gönderildi" özelliği, alıcı belgelerinde kaynaktakiyle aynı şekilde ayarlanır, ancak hareketler (aktarılmamışlarsa) yalnızca belgeler işlendikten sonra, örneğin BP 3.0 Grup gönderiminde yerleşik işleme kullanılarak görünecektir. belgeler (önerilen seçenek) veya bu işlemden (Burada “Belgeleri Gönder” düğmesi vardır).

İşlemin kalıcı değişim için kullanılması planlanıyorsa, alıcının bilgi güvenliğine (“Kayıt Ol” butonu) kaydedilebilir. “Tek seferlik” aktarımlar için bunu Dosya - Aç yoluyla kullanabilirsiniz.

21.12.2015 - Sürüm 3.1 platform 8.3.7.1805 ve güç kaynağı ünitesi 3.0.43.29 (3.0.43.* için sürüm 2.15 çalışmıyor - yapılandırma oldukça fazla değiştirildi).

Değiştirildi:

Bir bağlantı seçeneği seçmek için iletişim kutusu, İstemci-sunucu bayrağı, ayarına bağlı olarak, bir dosya veritabanı klasörü seçimi veya sunucudaki veritabanının adını ve sunucunun adını içeren bir alan her zaman mevcuttur. mevcut (diyalog sürümü 2.15'teki bir hata düzeltildi)

- YENİ İŞLEVSELLİK: Kaynak ve alıcı veritabanları arasındaki dengeleri ve ciroları değişen ayrıntı derecelerinde uzlaştırmaya yönelik bir mekanizma:


Doğrulama seçeneklerinin seçiminin şekilden açıkça anlaşıldığını düşünüyorum:


İnce ve kalın istemcilerin kullanım farklılıkları vardır; kalın istemcide hemen bir dosya karşılaştırma penceresi görüntülenir:


İnce istemcide düğmelere programlı olarak basmakla uğraşmadım; karşılaştırma penceresini görüntülemek için basit bir seçenek öneriyorum:


İnce istemci IMHO'da karşılaştırma daha uygundur çünkü... farklılıklar için gezinme düğmeleri vardır; bu, büyük tablolar için fareyle kaydırma yapmaktan daha kullanışlıdır:

22.03.2016 Sürüm 3.10 - Referans verilen nesnelerin zorunlu olarak yeniden yazılması için "Her zaman referansların üzerine yaz" bayrağı eklendi (aktarım hızı önemli ölçüde azalır, ancak bazen gereklidir). Kaynak ve hedef hesap planlarının yazışmalarını (hesap kodlarıyla aynı düzeyde) ve sabitlerin aktarımını yapılandırabileceğiniz "Hazırlık" sekmesi eklendi. Platform 8.3.7.1970, BP 3.0.43.148

- YENİ İŞLEVSELLİK: Belgeleri aktarmadan önce, kaynak ve hedefteki tutarlılığın yanı sıra belirlenen sabitlere uygunluk açısından hesap planının kontrol edilmesi önerilir.

Bu amaçla aşağıdaki yazışmaları ayarlayabileceğiniz bir “Hazırlık” sekmesi eklenmiştir:


Hesap eşleştirme tablosunu doldurma algoritması basittir - kaynakta mevcut olan ciro analiz edilir ve orada bulunan her hesap için alıcıda koda göre bir eşleşme bulunur; bir eşleşme bulunamazsa hesapla bir satır Alıcı hesabını seçmeniz gereken kod tabloda görüntülenir, transfer sırasında kullanılacaktır. Dürtme uyumluluğu kod düzeyinde oluşturulur.

Belirlenen sabitlerin yazışmalarını kontrol etmek ve aktarmak için ilgili tablo kullanılır:

Gerekirse doldurup aktarıyoruz. Yalnızca bayrakla işaretlenen sabitler aktarılır...

Program yığını, LIFO (Son giren ilk çıkar) kuyruk prensibine göre düzenlenmiş özel bir hafıza alanıdır. "Yığın" adı, yapım ilkesinin bir plaka yığınıyla benzetilmesinden gelir - plakaları üst üste koyabilirsiniz (yığına ekleme yöntemi, "itme", "itme") ve sonra üstten başlayarak onları uzaklaştırın (yığından bir değer alma yöntemi, "patlama", "poplama"). Program yığınına aynı zamanda çağrı yığını, yürütme yığını veya makine yığını da denir (soyut bir veri yapısı olan "yığın" ile karıştırılmaması için).

Yığın ne içindir? Alt programların çağrısını rahatça düzenlemenizi sağlar. İşlev çağrıldığında bazı argümanlar alır; aynı zamanda yerel değişkenlerini de bir yerde saklaması gerekir. Ek olarak, bir fonksiyonun başka bir fonksiyonu çağırabileceğini ve onun da parametreleri iletmesi ve değişkenlerini saklaması gerektiğini dikkate almalıyız. Yığını kullanarak, parametreleri iletirken bunları yalnızca yığına koymanız gerekir, ardından çağrılan işlev onları oradan "açabilir" ve kullanabilir. Yerel değişkenler de burada saklanabilir; kodun başlangıcında, işlev yığın belleğinin bir kısmını ayırır ve kontrol geri döndüğünde onu temizler ve serbest bırakır. Üst düzey dillerdeki programcılar genellikle bu tür şeyleri düşünmezler; derleyici onlar için gerekli tüm rutin kodları oluşturur.

Bir hatanın sonuçları

Artık soruna neredeyse yaklaştık. Özet olarak yığın, yeni öğelerin sonsuza kadar eklenebileceği sonsuz bir depodur. Maalesef dünyamızda her şey sınırlıdır ve yığın belleği de bir istisna değildir. Fonksiyonun argümanları yığına aktarıldığında sona ererse ne olur? Yoksa fonksiyon değişkenleri için bellek ayırıyor mu?

Yığın taşması adı verilen bir hata oluşacaktır. Kullanıcı tanımlı işlevlerin çağrılmasını düzenlemek için yığına ihtiyaç duyulduğundan (ve nesne yönelimli olanlar da dahil olmak üzere modern dillerdeki hemen hemen tüm programlar, şu veya bu şekilde işlevler temelinde oluşturulmuştur), artık olarak adlandırılabilir. Bu nedenle işletim sistemi kontrolü ele alır, yığını temizler ve programı sonlandırır. Burada yığın taşması ile yığın taşması arasındaki farkı vurgulayabiliriz - ilk durumda, yanlış bir bellek alanına erişildiğinde bir hata oluşur ve bu aşamada koruma yoksa, o anda başarılı bir şekilde kendini göstermez. koşulların bir araya gelmesi durumunda program normal şekilde çalışabilir. Keşke erişilen hafıza korunsaydı, . Yığın durumunda program kesinlikle sona erer.

Tamamen kesin olmak gerekirse, olayların böyle bir açıklamasının yalnızca yerel koda derleyen derleyiciler için geçerli olduğuna dikkat edilmelidir. Yönetilen dillerde, sanal makinenin, durumunun izlenmesi çok daha kolay olan yönetilen programlar için kendi yığını vardır ve hatta bir taşma meydana geldiğinde programa bir istisna atmayı göze alabilirsiniz. C ve C++ dillerinde böyle bir "lükse" güvenemezsiniz.

Hatanın nedenleri

Böyle hoş olmayan bir duruma ne yol açabilir? Yukarıda açıklanan mekanizmaya göre çok fazla iç içe işlev çağrısının olması bir olasılıktır. Bu senaryo özellikle özyineleme kullanıldığında olasıdır. Bazen faydalı uygulamalara sahip olan sonsuz özyineleme (tembel bir değerlendirme mekanizmasının yokluğunda), bu şekilde kesintiye uğrar. Bununla birlikte, yığına ayrılan az miktarda bellekle (bu, örneğin mikro denetleyiciler için tipiktir), basit bir çağrı dizisi yeterli olabilir.

Diğer bir seçenek ise çok fazla bellek gerektiren yerel değişkenlerdir. Bir milyon öğeden veya bir milyon yerel değişkenden oluşan yerel bir diziye sahip olmak (ne olacağını asla bilemezsiniz) en iyi fikir değildir. Böylesine açgözlü bir işleve yapılan tek bir çağrı bile kolayca yığın taşmasına neden olabilir. Büyük miktarda veri elde etmek için, eksikliğinin hatasını gidermenizi sağlayacak dinamik bellek mekanizmalarını kullanmak daha iyidir.

Bununla birlikte, dinamik bellek, ayırma ve ayırma açısından oldukça yavaştır (çünkü işletim sistemi bunu yönetir) ve doğrudan erişimle, onu manuel olarak ayırmanız ve yeniden ayırmanız gerekir. Yığındaki bellek çok hızlı bir şekilde tahsis edilir (aslında yalnızca bir kaydın değerini değiştirmeniz gerekir); buna ek olarak, yığına tahsis edilen nesnelerde, işlevin kontrolü geri döndüğünde ve yığın temizlendiğinde otomatik olarak çağrılan yıkıcılar bulunur. Elbette yığından hafıza alma arzusu hemen ortaya çıkıyor. Bu nedenle taşmanın üçüncü yolu, programcının yığında kendi bellek tahsisidir. C kütüphanesi özellikle bu amaç için alloca fonksiyonunu sağlar. Dinamik bellek malloc tahsis etme fonksiyonunun onu serbest bırakmak için kendi "ikizi" varsa, o zaman alloca fonksiyonunda buna sahip olmadığını not etmek ilginçtir - fonksiyonun kontrolü geri döndükten sonra hafıza otomatik olarak serbest bırakılır. Belki de bu sadece durumu daha da karmaşık hale getiriyor - sonuçta, işlevden çıkmadan önce hafızayı boşaltmak mümkün olmayacak. Man sayfasına göre, "alloca işlevi makineye ve derleyiciye bağımlıdır; birçok sistemde uygulanması sorunlu ve hatalıdır; kullanımı çok anlamsız ve hoş karşılanmaz" olmasına rağmen - hala kullanılmaktadır.

Örnekler

Örnek olarak, MSDN'de bulunan özyinelemeli dosya arama koduna bakalım:

Void DirSearch(String* sDir) ( try ( // Aktarılan klasördeki alt klasörleri bulun. String* d = Directory::GetDirectories(sDir); int numDirs = d->get_Length(); for (int i= 0;ben< numDirs; i++) { // Find all the files in the subfolder. String* f = Directory::GetFiles(d[i],textBox1->Metin); int numFiles = f->get_Length(); for (int j=0; j< numFiles; j++) { listBox1->Öğeler->Ekle(f[j]); ) DiziArama(d[i]); ) ) catch (System::Exception* e) (MessageBox::Show(e->Message); ) )

Bu işlev, belirtilen dizindeki dosyaların bir listesini alır ve ardından listenin dizin olan öğeleri için kendisini çağırır. Buna göre yeterince derin bir ağaçla dosya sistemi doğal bir sonuç elde ederiz.

"Yığın taşması neden oluyor?" sorusundan alınan ikinci yaklaşımın bir örneği. Stack Overflow adlı bir siteden (site, göründüğü gibi yalnızca Stack Overflow değil, herhangi bir programlama konusuna ilişkin soru ve yanıtların bir koleksiyonudur):

#define W 1000 #define H 1000 #define MAX 100000 //... int main() ( int resim; float dtr; initImg(resim,dtr); return 0; )

Gördüğünüz gibi, ana işlev, her biri bir milyon öğeye sahip olan int ve float türlerindeki diziler için yığında bellek ayırır ve bu toplamda 8 megabayttan biraz daha az verir. Varsayılan olarak Visual C++'ın yığın için yalnızca 1 megabayt ayırdığını düşünürseniz, cevap daha açık hale gelir.

Lightspark Flash oynatıcı projesinin GitHub deposundan alınan bir örnek:

DefineSoundTag::DefineSoundTag(/* ... */) ( // ... unsigned int soundDataLength = h.getLength()-7; unsigned char *tmp = (unsigned char *)alloca(soundDataLength); // .. . )

Bir sonraki satırda taşma olmaması için h.getLength()-7'nin çok büyük bir sayı olmadığını umabilirsiniz. Ancak bellek tahsisinde kazanılan zaman, programın "potansiyel" çökmesine değer mi?

Sonuç olarak

Yığın taşması, çoğunlukla özyinelemeli işlevler içeren programları etkileyen önemli bir hatadır. Bununla birlikte, program bu tür işlevleri içermese bile, yerel değişkenlerin büyük boyutu veya yığında belleğin manuel olarak tahsis edilmesindeki bir hata nedeniyle taşma hala mümkündür. Tüm klasik kurallar yürürlükte kalır: Bir seçenek varsa, yineleme yerine yinelemeyi seçmek daha iyidir ve ayrıca derleyici yerine manuel çalışma yapmayın.

Kaynakça

  • E. Tanenbaum. Bilgisayar Mimarisi.
  • Vikipedi. Yığın taşması.
  • Yığın Taşması. Yığın taşması C++.

Bu bağlamda yığın, programınızın yürütülmesi sırasında ayırdığınız ilk arabellekteki sonuncudur. Son, İlk (LIFO), en son koyduğunuz şeyin her zaman geri attığınız ilk şey olduğu anlamına gelir - eğer yığına 2 öğe atarsanız, "A" ve sonra "B", o zaman yığından çıkardığınız ilk şey olur "B" olacak ve sonraki şey "A" olacaktır.

Kodunuzda bir işlevi çağırdığınızda, işlev çağrısından sonraki komut, yığında ve işlev çağrısı tarafından üzerine yazılabilecek herhangi bir bellek alanında depolanır. Seçilen işlev kendi yerel değişkenleri için daha fazla yığın kullanabilir. Bu yapıldığında, kullandığı yerel değişken alanını boşaltacak ve ardından önceki işleve geri dönecektir.

Yığın Taşması

Yığın taşması, yığında programınızın kullanmayı amaçladığından daha fazla bellek kullanmanızdır. Gömülü sistemlerde, yığın için yalnızca 256 baytınız olabilir ve her işlev 32 bayt alırsa, o zaman işlev 3'ü çağıran, işlev 4'ü çağıran derin işlev 1 işleviyle işlev 2'ye yalnızca 8 işlev çağrınız olabilir. 8. işlevi çağıran, 9. işlevi çağıran, ancak 9. işlev yığının dışındaki belleğin üzerine yazar. Bu, belleğin, kodun vb. üzerine yazılmasına neden olabilir.

Birçok programcı bu hatayı A fonksiyonunu çağırarak yapar, o da B fonksiyonunu çağırır, o da C fonksiyonunu çağırır, o da C fonksiyonunu çağırır, o da A fonksiyonunu çağırır. Çoğu zaman işe yarayabilir, ancak tek bir yanlış giriş bile onun bilgisayar tarafından sonsuza kadar dönmesine neden olacaktır. başarısız olursa yığının dolu olduğunu öğrenir.

Özyinelemeli işlevler de bunun bir nedenidir, ancak yinelemeli olarak yazıyorsanız (yani işlevinizin kendisini çağırması), o zaman bunun farkında olmanız ve sonsuz özyinelemeyi önlemek için statik/global değişkenler kullanmanız gerekir.

Tipik olarak, kullandığınız işletim sistemi ve programlama dili yığını yönetir ve bu sizin elinizde değildir. İşlev çağrılarınızın ne kadar derin olduğunu görmek ve amaçlanmayan döngüleri ve özyinelemeleri belirlemek için çağrı grafiğinize (ana noktanızdan her işlevin neyi çağırdığını gösteren bir ağaç yapısı) bakmanız gerekir. Kasıtlı döngüler ve özyineleme, eğer birbirlerini çok fazla çağırıyorsa, yapay olarak hata kontrolü yapılmalıdır.

İyi programlama uygulamaları, statik ve dinamik testler dışında bu üst düzey sistemlerde yapabileceğiniz pek bir şey yoktur.

Gömülü sistemler

Gömülü dünyada, özellikle yüksek güvenceli kodda (otomotiv, havacılık, uzay), kapsamlı testler ve kod incelemesi yaparsınız, ancak aynı zamanda aşağıdakileri de yaparsınız:

  • Özyinelemeyi ve döngüleri devre dışı bırakın - politika ve test uyumluluğu
  • Kodu ve yığını birbirinden uzak tutun (kod flaşta, yığın RAM'dedir ve hiçbir zaman birbiriyle eşleşmez)
  • Koruma çubuklarını yığının etrafına yerleştirin - sihirli bir sayıyla doldurduğunuz boş bir bellek alanı (genellikle kesme rutini, ancak burada birçok varyasyon vardır) ve koruma çubuklarına saniyede yüzlerce veya binlerce kez baktığınız üzerine yazılmadığından emin olun.
  • Bellek korumasını kullanın (yani yığın üzerinde işlem yapmayın, doğrudan yığının arkasında okumayın veya yazmayın)
  • Kesmeler ikincil işlevleri çağırmaz; bayrakları ayarlar, verileri kopyalar ve uygulamanın bu verileri işlemesine izin verir (aksi takdirde işlev çağrı ağacınızın 8. derinliğine düşebilir, bir kesinti yaşayabilir ve ardından içeride birkaç işleve daha sahip olabilirsiniz) kesinti çıkışı, bir atışa neden olur). Birden fazla çağrı ağacınız var; biri ana işlemler için, biri de her kesinti için. Eğer kesintileriniz birbirini rahatsız edebiliyorsa... eh, ejderhalar var...

Üst düzey diller ve sistemler

Ancak işletim sistemlerinde çalışan üst düzey dillerde:

  • Yerel değişken depolama alanını azaltın (yerel değişkenler yığında saklanır), ancak derleyiciler bu konuda oldukça akıllıdır ve çağrı ağacınız sığsa bazen yığına büyük parçalar koyarlar)
  • Yinelemeden kaçının veya kesinlikle sınırlayın
  • Programlarınızı giderek daha küçük işlevlere ayırmayın; yerel değişkenleri dikkate almadan bile, her işlev çağrısı yığında 64 bayta kadar yer kaplar (32 bit işlemci, işlemci kayıtlarının, işaretlerinin yarısını kaydeder, vb.).
  • Çağrı ağacını sığ tutun (yukarıdaki açıklamaya benzer)

Web sunucuları

Yığını kontrol edip edememeniz, hatta görüp görememeniz, sahip olduğunuz sanal alana bağlıdır. Muhtemelen web sunucularını diğer herhangi bir üst düzey dil ve işletim sistemi gibi yönetebilirsiniz; bu büyük ölçüde sizin elinizde değildir, ancak kullandığınız dili ve sunucu yığınını kontrol edin. Örneğin, SQL sunucunuzdaki yığını bölebilirsiniz.

Informix® DataBlade™ API Programcı Kılavuzu indirilebilir. "Yığın Alanını Yönetme" bölümü, kullanıcı tanımlı işlevlerin (UDR'ler) oluşturulmasını açıklar. Bu makalede ek bilgi ve hata ayıklama ipuçları sağlanmaktadır.

Aşağıdaki bilgiler, UDR'nin kullanıcı tanımlı bir sanal işlemci (VP) üzerinde mi yoksa bir VP CPU'da mı çalıştığına göre geçerlidir. Bir iş parçacığının yığını, UDR yürütülmeden hemen önce kullanıcı tanımlı bir sanal işlemciye taşınabilir.

UDR için hangi boyutta yığın ayrılmıştır?

Bir UDR'nin kullanabileceği yığının boyutu, UDR'nin nasıl oluşturulduğuna bağlıdır:

    UDR'nin özel olarak ayrılmış yığınını kullanmasına olanak tanıyan STACK değiştiricisini kullanarak,

    STACK değiştiricisi olmadan; bu, UDR'nin sunucu tarafından tahsis edilen yığını istekte bulunan iş parçacığıyla paylaşacağı anlamına gelir. Bu durumda yığın boyutu, onconfig yapılandırma dosyasındaki STACKSIZE parametresinin değeriyle belirlenecektir.

STACK değiştirici

CREATE PROCEDURE veya CREATE FUNCTION ifadeleri, UDR'yi yürütmek için gereken yığın alanı miktarını bayt cinsinden belirtmenize olanak tanıyan isteğe bağlı bir STACK değiştiricisine sahiptir.

Bir UDR oluştururken STACK değiştiricisini kullanırsanız, sunucu, UDR'nin her yürütülmesinde yığın alanını tahsis edecek ve serbest bırakacaktır. Mevcut gerçek boyut, bayt cinsinden STACK değerinden, işlev bağımsız değişkenlerinin sayısına bağlı olarak bazı ek yüklerin çıkarılmasıyla elde edilen değere eşittir.

STACK değeri onconfig dosyasındaki STACKSIZE parametresinden küçükse (sonraki bölüme bakın), UDR için ayrılan yığın boyutu otomatik olarak STACKSIZE değerine yuvarlanacaktır.

STACKSIZE konfigürasyon parametresi

Onconfig yapılandırma dosyası, kullanıcı iş parçacıkları için varsayılan yığın boyutunu belirten bir STACKSIZE parametresi içerir.

Bir UDR oluştururken STACK belirtmezseniz, sunucu bu UDR'yi yürütmek için ek yığın alanı ayırmaz. Bunun yerine UDR, isteği yürütmek için ayrılan yığın alanını kullanır. Kullanılabilir yığın boyutu, işlevin SQL düzeyinde yürütülmesinin ek yüküne bağlı olacaktır.

İş parçacığı başına yığın, isteği yürüten belirli iş parçacığına bir kez tahsis edilir. Sunucu, her UDR çağrısı için ek bir yığın tahsis ederek kaynakları israf etmediğinden, UDR bir yığını bir iş parçacığıyla paylaştığında performans daha iyidir. Öte yandan, UDR tarafından kullanılan yığın boyutu STACKSIZE değerine yaklaşırsa, karmaşık bir sorgunun parçası olarak işlev çağrılırken yığın taşmasına neden olabilir (bu durumda UDR yürütmesi için daha az yığın alanı kullanılabilir).

Lütfen STACKSIZE değerini çok yüksek ayarlamamanız gerektiğini unutmayın, çünkü bu tüm kullanıcı konularını etkileyecektir.

Yığın boyutunu kontrol etmek ne zaman gereklidir?

YUDR özyinelemeli çağrılar yapıyorsa veya UDR, istek iş parçacığının yığınında (STACKSIZE) varsayılan olarak mevcut olandan daha fazla yığın alanı gerektiriyorsa yığın alanını yönetmelisiniz.

UDR yürütmesi için yığını artırmanın iki yolu vardır:

    UDR oluştururken STACK değiştiricisini belirtin.

    Özyinelemeli çağrılar yapmak için mi_call() işlevini kullanın (örnek için Informix DataBlade API Programcı Kılavuzu'na bakın).

STACK aracılığıyla bir boyut belirtmezseniz ve geçerli yığını artırmak için mi_call() yöntemini kullanmazsanız ve UDR çok fazla yığın alanı gerektiren bir şey yaparsa, yığın taşmasına neden olur.

Bazı mi_* işlevlerinin kendi yürütmeleri için yeni bir yığın bölümü eklediğini unutmayın. Çağıran UDR işlevine geri döndüğünüzde bu bölümler serbest bırakılır.

Bir şeyler ters giderse ne yapmalı?

Yığın Kullanımını İzleme

İzlemenin amacı, yığın taşmasına neden olan belirli UDR'yi tanımlamak ve böylece söz konusu UDR için STACK değerini özel olarak değiştirebilmenizi sağlamaktır.

    "Onstat -g sts" komutuyla yığın kullanımını izleme

    "Onstat -g ses session_id" kullanarak bir SQL sorgusu yürüten bir oturumu izleme

Yığın taşmasıyla sonuçlanan bir SQL sorgusunu tanımladıktan sonra, orijinal sorgunun parçası olan UDR sorgularını ayrı ayrı yürüterek yığın kullanımını belirlemelisiniz.

UDR için STACK değerini dinamik olarak ayarlayabilirsiniz. Örneğin:

MyFoo (lvarchar,lvarchar) işlevini (add stack=131072) ile değiştirin;

STACK değerini değiştirdikten sonra, orijinal isteğin artık kararlı olduğundan emin olmak için test etmelisiniz.

STACKSIZE'ı artırın

Alternatif olarak STACKSIZE değerini artırmayı deneyin. Bunun sorunu çözüp çözmediğini kontrol edin. (Daha sonra eski değeri döndürmeyi unutmayın).

STACKSIZE değerini artırmak işe yaramazsa sorun büyük olasılıkla bellek bozulmasıdır. İşte bazı öneriler:

    Bellek karalama ve bellek havuzu denetimini etkinleştirin. UDR'ler için Bellek Ayırma makalesindeki "Hata Ayıklama Sorunları" bölümünde bunun nasıl yapılacağı açıklanmaktadır.

    mi_lvarchar kullanmayı yeniden düşünün. Mi_lvarchar'ın boş karakterle sonlandırılmış bir dizeyi bağımsız değişken olarak almayı bekleyen bir işleve iletildiği yerlere özellikle dikkat edilmelidir.

    Sorunu daha hızlı yeniden oluşturmak için CPU (veya kullanıcı) VP'lerinin sayısını bire düşürün.

mi_print_stack() -- Solaris

Solaris OS için Informix Dynamic Server, UDR'de çağrılabilecek bir mi_print_stack() işlevi içerir. Varsayılan olarak bu işlev yığın çerçevesini aşağıdaki dosyaya kaydeder:

/tmp/default.stack

Çıktı dosyasının adını değiştiremezsiniz ancak DBTEMP ortam değişkeninin değerini değiştirerek konumunu değiştirebilirsiniz. $DBTEMP dizininin informix kullanıcısı tarafından yazılabilir olduğundan emin olun. mi_print_stack() yürütülürken karşılaşılan hatalar $MSGPATH'e bildirilir.

Bu özellik yalnızca OC Solaris'te mevcuttur.

Sözlük

Bu makalede kullanılan terimler ve kısaltmalar:

UDRKullanıcı Tanımlı Rutin
Başkan YardımcısıSanal İşlemci

Bu makale, herhangi bir güvenlik önlemi dizisinin uygulamanın tüm aşamalarını kapsaması gerektiğini bir kez daha göstermektedir: geliştirme, dağıtım, sistem yönetimi ve tabii ki organizasyonel önlemler. Bilgi sistemlerinde temel güvenlik tehdidi “insan faktörüdür” (kullanıcılar dahil). Bu önlemler dizisi makul ve dengeli olmalıdır: mantıklı değildir ve verinin maliyetini aşan korumayı organize etmek için yeterli fonun tahsis edilmesi pek olası değildir.

giriiş

1C:Enterprise, Rusya'daki en yaygın muhasebe sistemidir, ancak buna rağmen 8.0 sürümüne kadar geliştiricileri güvenlik sorunlarına çok az dikkat ediyordu. Temel olarak, elbette bu, ürünün fiyat nişi ve kalifiye BT uzmanlarının bulunmadığı küçük işletmelere odaklanılmasıyla belirlendi ve güvenli bir sistemi kurmanın ve sürdürmenin olası maliyeti, kuruluş için aşırı derecede pahalı olacaktı. 8.0 sürümünün piyasaya sürülmesiyle vurgunun değişmesi gerekiyordu: Çözümlerin maliyeti önemli ölçüde arttı, sistem çok daha ölçeklenebilir ve esnek hale geldi - gereksinimler önemli ölçüde değişti. Sistemin yeterince güvenilir ve emniyetli hale gelip gelmediği oldukça bireysel bir sorudur. Modern bir işletmenin ana bilgi sistemi en azından aşağıdaki güvenlik gereksinimlerini karşılamalıdır:

  • Dahili nedenlerden dolayı sistem arızası olasılığı oldukça düşüktür.
  • Güvenilir kullanıcı yetkilendirmesi ve yanlış işlemlere karşı veri koruması.
  • Kullanıcı haklarını atamak için etkili bir sistem.
  • Arıza durumunda çevrimiçi yedekleme ve kurtarma sistemi.

1C:Enterprise 8.0 tabanlı çözümler bu gereksinimleri karşılıyor mu? Net bir cevap yok. Erişim kontrol sistemindeki önemli değişikliklere rağmen çözülmemiş birçok sorun devam etmektedir. Sistemin nasıl tasarlanıp yapılandırıldığına bağlı olarak, tüm bu gereksinimler belirli bir uygulama için yeterli ölçüde karşılanamayabilir veya karşılanamayabilir, ancak dikkat etmeye değer (ve bu, platformun "gençliğinin" önemli bir sonucudur) ) listelenen koşulları tam olarak yerine getirmek için gerçekten Herkül'ün çabalarını uygulamanın gerekli olduğunu.

Bu makale, 1C:Enterprise platformundaki çözümlerin geliştiricileri ve uygulayıcılarının yanı sıra 1C:Enterprise'ın kullanıldığı kuruluşların sistem yöneticilerine yöneliktir ve sistemin istemci-sunucu sürümünün geliştirilmesi ve yapılandırılmasının bazı yönlerini açıklamaktadır. organizasyonun görünümü bilgi Güvenliği. Bu makale, dokümantasyonun yerine kullanılamaz, yalnızca henüz yansıtılmamış bazı noktalara işaret eder. Ve elbette, ne bu makale ne de tüm belgeler, aynı zamanda birbiriyle çelişen güvenlik, performans, rahatlık ve işlevsellik gereksinimlerini de karşılaması gereken güvenli bir bilgi sistemi oluşturma sorununun karmaşıklığını yansıtamayacaktır.

Sınıflandırma ve terminoloji

Makalede ele alınan temel konu bilgi tehditleridir.

Bilgi tehdidi– Verilerin izinsiz olarak okunacağı, kopyalanacağı, değiştirileceği veya engelleneceği bir durum olasılığı.

Makalede bu tanıma dayanarak bilgi tehditleri şu şekilde sınıflandırılıyor:

  • Verilerin izinsiz imhası
  • Verilerin izinsiz değiştirilmesi
  • Verilerin izinsiz kopyalanması
  • Verilerin izinsiz okunması
  • Veri kullanılamıyor

Tüm tehditler kasıtlı ve kasıtsız olarak ikiye ayrılır. Gerçekleşmiş bir bilgi tehdidi diyeceğiz olay. Sistemin özellikleri şunlardır:

Güvenlik açıkları– olaylara yol açan özellikler Koruma önlemleri– bir olay olasılığını engelleyen özellikler

Temel olarak, yalnızca olasılığı istemci-sunucu sürümünde 1C: Enterprise 8.0 teknolojik platformunun kullanılmasından kaynaklanan durumlar dikkate alınır (ayrıca, bunun sadece 1C veya 1C 8.0'ın anlamı ile çelişmediği durumlarda) . Sistemin kullanımına ilişkin aşağıdaki ana rolleri tanımlayalım:

  • Operatörler– bir uygulama rolüyle sınırlı olarak verileri görüntüleme ve değiştirme haklarına sahip olan ancak yönetim işlevlerine sahip olmayan kullanıcılar
  • Sistem yöneticileri– uygulama sunucusunun ve MS SQL sunucusunun işletim sistemlerindeki yönetici hakları, MS SQL'deki yönetici hakları vb. dahil olmak üzere sistemde yönetici haklarına sahip olan kullanıcılar.
  • Bilgi güvenliği yöneticileri– 1C bilgi tabanındaki belirli yönetim işlevlerinin devredildiği kullanıcılar (kullanıcı ekleme, test etme ve düzeltme, yedekleme, uygulama çözümü kurma vb.)
  • Sistem geliştiricileri– bir uygulama çözümü geliştiren kullanıcılar. Genel olarak çalışma sistemine erişimleri olmayabilir.
  • Sisteme doğrudan erişimi olmayan kişiler– 1C'ye erişim hakları verilmeyen, ancak sistemin çalışmasını bir dereceye kadar etkileyebilen kullanıcılar (genellikle bunların tümü, sistemin kurulu olduğu aynı Active Directory etki alanının kullanıcılarıdır). Bu kategori öncelikle sistemdeki potansiyel olarak tehlikeli konuları tanımlamak için değerlendirilir.
  • Otomatik yönetim komut dosyaları– belirli eylemleri otomatik olarak gerçekleştirmek üzere tasarlanmış, belirli işlevlerin devredildiği programlar (örneğin, verilerin içe ve dışa aktarımı)

Burada iki noktaya dikkat edilmelidir: birincisi, bu sınıflandırma çok kabadır ve her grup içindeki bölünmeleri hesaba katmaz - bazı özel durumlar için böyle bir bölünme oluşturulacaktır ve ikincisi, diğer kişilerin operasyonu etkileyemeyeceği varsayılmaktadır. 1C'nin dışındaki araçlarla sağlanması gereken sistemin.

Herhangi bir güvenlik sistemi, fizibilite ve sahip olma maliyeti göz önünde bulundurularak tasarlanmalıdır. Genel olarak, bir bilgi sistemi geliştirirken ve uygularken, sistemi korumanın fiyatının aşağıdakilere karşılık gelmesi gerekir:

  • korunan bilgilerin değeri;
  • bir olay yaratmanın maliyetleri (kasıtlı bir tehdit durumunda);
  • bir olay durumunda mali riskler

Mali etkinliğini değerlendirmekten çok daha pahalı bir savunma düzenlemek anlamsız ve zararlıdır. Bilgi kaybı risklerini değerlendirmenin çeşitli yöntemleri vardır ancak bunlar bu makale kapsamında ele alınmamıştır. Bir diğer önemli husus, bilgi güvenliği, sistem performansı, sistemle çalışmanın rahatlığı ve kolaylığı, geliştirme ve uygulama hızı ve kurumsal bilgi sistemlerine yönelik diğer gereksinimler için sıklıkla çelişen gereksinimler arasında bir dengenin korunmasıdır.

Sistem bilgi güvenliği mekanizmasının temel özellikleri

1C:Enterprise 8.0 iki versiyon halinde gelir: dosya ve istemci-sunucu. Dosya sürümünün aşağıdaki nedenlerden dolayı sistemin bilgi güvenliğini sağladığı kabul edilemez:

  • Veriler ve konfigürasyon, sistemin tüm kullanıcıları tarafından okunabilen ve yazılabilen bir dosyada saklanır.
  • Aşağıda gösterileceği gibi sistem yetkilendirmesi çok kolay bir şekilde atlanabilir.
  • Sistemin bütünlüğü yalnızca istemci kısmının çekirdeği tarafından sağlanır.

İstemci-sunucu sürümünde, MS SQL Server aşağıdakileri sağlayan bilgileri depolamak için kullanılır:

  • Daha güvenilir veri depolama.
  • Dosyaların doğrudan erişimden yalıtılması.
  • Daha gelişmiş işlem ve kilitleme mekanizmaları.

Sistemin dosya ve istemci-sunucu sürümleri arasındaki önemli farklılıklara rağmen, uygulama çözümü düzeyinde aşağıdaki yetenekleri sağlayan birleşik bir erişim kontrol şemasına sahiptirler:

  • 1C'de belirtilen şifreyi kullanarak kullanıcı yetkilendirmesi.
  • Geçerli Windows kullanıcısını temel alan kullanıcı yetkilendirmesi.
  • Sistem kullanıcılarına rol atama.
  • Yönetim işlevlerinin role göre sınırlandırılması.
  • Kullanılabilir arayüzlerin rollere göre atanması.
  • Meta veri nesnelerine erişimi role göre kısıtlama.
  • Nesne ayrıntılarına erişimi role göre kısıtlama.
  • Veri nesnelerine erişimi rollere ve oturum parametrelerine göre kısıtlama.
  • Verilere ve yürütülebilir modüllere etkileşimli erişimi kısıtlama.
  • Bazı kod yürütme kısıtlamaları.

Genel olarak, kullanılan veri erişim şeması bu seviyedeki bilgi sistemleri için oldukça tipiktir. Ancak, üç katmanlı istemci-sunucu mimarisinin bu uygulamasıyla ilgili olarak, nispeten çok sayıda güvenlik açığına yol açan birkaç temel husus vardır:

  1. Çok sayıda veri işleme aşaması vardır ve her aşamada nesnelere erişim için farklı kurallar geçerli olabilir.

    Güvenlik açısından önemli olan veri işleme aşamalarının biraz basitleştirilmiş bir diyagramı Şekil 1'de gösterilmektedir. Genel kural 1C'nin amacı, bu şemada aşağı doğru ilerledikçe kısıtlamaları azaltmaktır, bu nedenle aşağıdakilerden birinde bir güvenlik açığı kullanmak üst seviyeler sistemi her düzeyde bozabilir.

  2. Bir seviyeden diğerine geçerken iletilen verileri izlemek için yeterince oluşturulmamış prosedürler.

    Ne yazık ki, sistemin tüm iç mekanizmaları, özellikle de etkileşimli olmayan mekanizmalar için mükemmel bir şekilde hata ayıklamaz; hata ayıklama, bir yandan her zaman daha emek yoğun, diğer yandan daha sorumlu olur. Bu "hastalık" yalnızca 1C'ye özgü bir sorun değildir; çoğu satıcının birçok sunucu ürününde bulunur. Ancak son yıllarda bu sorunlara olan ilgi önemli ölçüde arttı.

  3. Önceki sürümden devralınan geliştiricilerin ve sistem yöneticilerinin ortalama niteliklerinin yeterince yüksek olmaması.

    1C:Enterprise serisinin ürünleri başlangıçta geliştirme ve destek kolaylığına ve küçük kuruluşlarda çalışmaya odaklanmıştı, bu nedenle tarihsel olarak uygulama çözümleri "geliştiricilerinin" ve "yöneticilerinin" önemli bir kısmının gelişmesi şaşırtıcı değil. sistemlerin çok daha karmaşık bir ürün olan 8.0 versiyonuyla çalışacak yeterli bilgi ve becerisi yoktur. Franchise alan şirketlerin, bu konuya sistematik bir şekilde yaklaşmadan, müşterilerin pahasına "savaşta" eğitim verme uygulamasıyla sorun daha da kötüleşiyor. 1C şirketine, son birkaç yılda bu durumun kademeli olarak düzeltildiğini belirtmek gerekir: ciddi franchise sahibi şirketler, personel seçimi ve eğitimi sorununa, bilgi teknolojisi desteğinin düzeyine daha sorumlu bir yaklaşım benimsemeye başladı. 1C şirketi önemli ölçüde arttı, yüksek düzeyde hizmete yönelik sertifika programları ortaya çıktı; ancak durum anında düzeltilemez, bu nedenle sistemin güvenliği analiz edilirken bu faktörün dikkate alınması gerekir.

  4. Platform nispeten genç.

    Benzer odak ve kullanım amacına sahip ürünler arasında en genç çözümlerden biridir. Platformun işlevselliği aşağı yukarı bir yıldan daha kısa bir süre önce oluşturuldu. Aynı zamanda, platformun 8.0.10'dan başlayarak her sürümü (sistemin neredeyse tüm mevcut yeteneklerinin uygulandığı bu sürümdeydi) öncekilerden önemli ölçüde daha kararlı hale geldi. Platformun yeteneklerinin yalnızca yarısı kullanılmasına rağmen, standart uygulama çözümlerinin işlevselliği hâlâ hızla artıyor. Elbette, bu tür koşullarda kararlılıktan oldukça şartlı olarak bahsedebiliriz, ancak genel olarak 1C 8.0 platformundaki çözümlerin birçok açıdan 1C'deki benzer çözümlerin işlevselliği ve performansında (ve genellikle kararlılıkta) önemli ölçüde önde olduğu kabul edilmelidir. 7.7 platformu.

Böylece sistem (ve muhtemelen standart bir uygulama çözümü) kuruluşta dağıtılır ve bilgisayarlara yüklenir. Öncelikle 1C güvenliği kurmanın mantıklı olduğu bir ortam oluşturmak gerekiyor ve bunun için sistem güvenliğinin sistem ayarlarından önemli ölçüde etkileneceği varsayımını karşılayacak şekilde yapılandırılması gerekiyor.

Güvenliği ayarlamak için genel kurallara uyun.

Güvenli sistemler oluşturmanın temel ilkelerine uyulmadığı takdirde, bir sistemin bilgi güvenliğinden söz edilemez. En azından aşağıdaki koşulların karşılandığından emin olun:

  • Sunuculara erişim fiziksel olarak sınırlandırılmış olup, kesintisiz çalışmaları sağlanmaktadır:
    • sunucu ekipmanı güvenilirlik gereksinimlerini karşılıyor, hatalı sunucu ekipmanının değiştirilmesi ayarlandı, özellikle kritik alanlar için donanım çoğaltma şemaları kullanıldı (RAID, birden fazla kaynaktan gelen güç, çoklu iletişim kanalları vb.);
    • sunucular kilitli bir odada bulunmaktadır ve bu oda yalnızca uzaktan gerçekleştirilemeyen iş süresince açıktır;
    • Sunucu odasını yalnızca bir veya iki kişinin açma hakkı bulunmaktadır, acil durumlarda sorumlular için bildirim sistemi geliştirilmiş olup;
    • sunuculara kesintisiz güç sağlanması sağlanır
    • ekipmanın normal iklimsel çalışma koşulları sağlanır;
    • sunucu odasında yangın alarmı vardır, su baskını riski yoktur (özellikle birinci ve son katlar için);
  • İşletmenin ağ ve bilgi altyapısının ayarları doğru bir şekilde tamamlanmıştır:
    • Güvenlik duvarları tüm sunuculara kurulur ve yapılandırılır;
    • ağdaki tüm kullanıcılar ve bilgisayarlar yetkilidir, şifreler tahmin edilemeyecek kadar karmaşıktır;
    • sistem operatörleri onunla normal şekilde çalışmak için yeterli haklara sahiptir, ancak idari işlem haklarına sahip değildir;
    • ağdaki tüm bilgisayarlara anti-virüs araçları kurulur ve etkinleştirilir;
    • Kullanıcıların (ağ yöneticileri hariç) istemci iş istasyonlarında yönetici haklarına sahip olmaması arzu edilir;
    • İnternete ve çıkarılabilir depolama ortamına erişim düzenlenmeli ve sınırlandırılmalıdır;
    • güvenlik olaylarının sistem denetimi yapılandırılmalıdır;
  • Ana organizasyon sorunları çözüldü:
    • kullanıcılar 1C ve donanımla çalışmak için yeterli niteliklere sahiptir;
    • kullanıcılara çalışma kurallarını ihlal etme sorumluluğu konusunda bilgi verilir;
    • bilgi sisteminin her önemli unsuru için mali açıdan sorumlu kişiler atanmıştır;
    • tüm sistem birimleri mühürlü ve kapalıdır;
    • Temizlikçilere, inşaat işçilerine ve elektrikçilere talimat vermeye ve denetlemeye özellikle dikkat edin. Bu kişiler, ihmal yoluyla, sistemi vicdansız bir kullanıcının verdiği kasıtlı zararla kıyaslanamayacak derecede zarara neden olabilirler.

Dikkat! Bu liste kapsamlı değildir, yalnızca oldukça karmaşık ve pahalı bir bilgi sistemi kurulurken sıklıkla gözden kaçırılanları açıklar!

  • MS SQL Server, uygulama sunucusu ve istemci kısmı farklı bilgisayarlarda çalışır, sunucu uygulamaları özel olarak oluşturulmuş Windows kullanıcılarının hakları altında çalışır;
  • MS SQL Sunucusu için
    • karma yetkilendirme modu ayarlandı
    • Sunucuyönetici rolüne dahil olan MS SQL kullanıcıları 1C çalışmasına katılmaz,
    • her IB 1C için sunucuya ayrıcalıklı erişimi olmayan ayrı bir MS SQL kullanıcısı oluşturulmuştur,
    • Bir IS'nin MS SQL kullanıcısının diğer IS'ye erişimi yoktur;
  • Kullanıcıların uygulama sunucusuna ve MS SQL sunucu dosyalarına doğrudan erişimi yoktur.
  • Operatör iş istasyonları Windows 2000/XP ile donatılmıştır (Windows 95/98/Me değil)

Sistem geliştiricilerinin tavsiyelerini ve dokümantasyonu okumayı ihmal etmeyin. Sistemin kurulumuna ilişkin önemli materyaller ITS disklerinde “Metodolojik Öneriler” bölümünde yayınlanmaktadır. Aşağıdaki makalelere özellikle dikkat edin:

  1. 1C:Enterprise sunucusuyla çalışan uygulamaların özellikleri
  2. Veri yerleştirme 1C:İşletme 8.0
  3. Kullanıcılar tarafından 1C:Enterprise 8.0 güncellemesi Microsoft Windows yönetici hakları olmadan
  4. Yönetici haklarına sahip olmayan bir kullanıcı adına kullanıcı listesini düzenleme
  5. Windows XP SP2 Güvenlik Duvarı Ayarlarını SQL Server 2000 ve SQL Server Desktop Engine'i (MSDE) Çalıştıracak Şekilde Yapılandırma
  6. 1C:Enterprise 8.0 sunucusunu çalıştırmak için COM+ Windows XP SP2 parametrelerini yapılandırma
  7. 1C:Enterprise 8.0 sunucusu için Windows XP SP2 güvenlik duvarı ayarlarını yapılandırma
  8. HASP Lisans Yöneticisi için Windows XP SP2 güvenlik duvarı ayarlarını yapılandırma
  9. Yedekleme Oluşturma bilgi tabanı SQL Server 2000 kullanarak
  10. "İstemci-sunucu" sürümünde 1C:Enterprise 8.0 yükleme ve yapılandırma sorunları(en önemli makalelerden biri)
  11. Özellikler Windows ayarları 1C:Enterprise 8.0 sunucusunu kurarken Server 2003
  12. İstemci-sunucu sürümünde bilgi tabanına kullanıcı erişiminin düzenlenmesi(en önemli makalelerden biri)
  13. Sunucu 1C:Kurumsal ve SQL sunucusu
  14. "İstemci-sunucu" sürümünde 1C:Enterprise 8.0 için ayrıntılı kurulum prosedürü(en önemli makalelerden biri)
  15. 1C:Enterprise sunucusundaki yerleşik dili kullanma

Ancak belgeleri okurken, alınan bilgilere eleştirel yaklaşın; örneğin, "İstemci-sunucu sürümünde 1C: Enterprise 8.0'ı kurma ve yapılandırma sorunları" makalesi, USER1CV8SERVER kullanıcısı için gerekli olan hakları doğru bir şekilde tanımlamıyor. Aşağıdaki listeye bağlantılar olacaktır, örneğin [ITS1], “1C:Enterprise sunucusuyla çalışan uygulamaların özellikleri” makalesi anlamına gelir. Makalelere ilişkin tüm bağlantılar, ITS'nin bu yazının yazıldığı tarihteki son sayısına (Ocak 2006) verilmiştir.

Kullanıcılar için Windows yetkilendirmeyle birlikte yetkilendirme yeteneklerini kullanın

İki olası kullanıcı yetkilendirme modundan: yerleşik 1C ve Windows işletim sistemi yetkilendirmesiyle birleştirilmiş, mümkünse birleşik yetkilendirmeyi seçmelisiniz. Bu, kullanıcıların çalışırken birden fazla şifreyle karıştırılmamasını sağlayacak ancak sistem güvenliği düzeyini düşürmeyecektir. Ancak, yalnızca Windows yetkilendirmesini kullanan kullanıcılar için bile, oluştururken bir parola belirlemeniz ve ancak bundan sonra bu kullanıcı için 1C yetkilendirmesini devre dışı bırakmanız önemle tavsiye edilir. Active Directory yapısının bozulması durumunda sistemin kurtarılmasını sağlamak için 1C yetkilendirmesini kullanarak sisteme giriş yapabilecek en az bir kullanıcı bırakmak gerekir.

Uygulama çözümü rolleri oluştururken "yedek" hakları eklemeyin

Her uygulama çözümü rolü, bu rol tarafından tanımlanan eylemleri gerçekleştirmek için gereken minimum hak kümesini yansıtmalıdır. Ancak bazı roller bağımsız olarak kullanılamayabilir. Örneğin, etkileşimli başlatma için harici tedaviler Ayrı bir rol oluşturabilir ve bunu harici işleme kullanması gereken tüm kullanıcılara ekleyebilirsiniz.

Günlükleri ve sistem çalışma protokollerini düzenli olarak gözden geçirin

Mümkünse günlüklerin ve sistem çalışma protokollerinin görüntülenmesini düzenleyin ve otomatikleştirin. Günlüklerin doğru yapılandırılması ve düzenli olarak incelenmesi (yalnızca önemli olaylara göre filtreleme) ile yetkisiz eylemler erkenden tespit edilebilir ve hatta hazırlık aşamasında önlenebilir.

İstemci-sunucu sürümünün bazı özellikleri

Bu bölümde istemci-sunucu seçeneğinin bazı işletim özellikleri ve bunların güvenlik üzerindeki etkileri açıklanmaktadır. Okumayı daha kolay hale getirmek için aşağıdaki gösterimler kullanılır:

Dikkat! güvenlik açığı açıklaması

Sisteme erişimi kontrol eden bilgilerin saklanması

Bilgi güvenliği kullanıcılarının listesinin saklanması

Bu bilgi güvenliği kullanıcılarının listesi ve bu listede onlara sunulan roller hakkındaki tüm bilgiler, MS SQL veritabanındaki Params tablosunda saklanır (bkz. [ITS2]). Bu tablonun yapısına ve içeriğine bakıldığında tüm kullanıcı bilgilerinin DosyaAdı alanı değeri “users.usr” olan bir kayıtta saklandığı açıkça görülmektedir.

Kullanıcıların MS SQL veritabanına erişiminin olmadığını varsaydığımız için bu durum tek başına bir saldırgan tarafından kullanılamaz, ancak MS SQL'de kod çalıştırmak mümkünse, bu herhangi bir(! ) 1C'den erişim. Aynı mekanizma (küçük değişikliklerle), sistemin dosya sürümünde de kullanılabilir; bu, dosya sürümünün özelliklerini dikkate alarak, güvenli sistemler oluşturmada uygulanabilirliğini tamamen dışlar.

Öneri:Şu anda, MS SQL Server düzeyindeki tetikleyicilerin kullanılması dışında, uygulamayı bu tür değişikliklerden tamamen korumanın bir yolu yoktur; bu da platform sürümünü güncellerken veya platform sürümünü değiştirirken sorunlara neden olabilir. kullanıcılar. Bu tür değişiklikleri izlemek için 1C günlüğünü kullanabilir (kullanıcıyı belirtmeden yapılandırıcı modunda "şüpheli" oturum açmalara dikkat ederek) veya SQL Profiler'ı sürekli çalışır durumda tutabilirsiniz (bu, sistem performansı üzerinde son derece olumsuz bir etkiye sahip olacaktır) veya Uyarıları yapılandırabilirsiniz. mekanizma (büyük olasılıkla tetikleyicileri kullanarak birlikte)

IS listesi hakkındaki bilgilerin sunucuda saklanması

Her 1C uygulama sunucusu için, kendisine bağlı MS SQL veritabanlarının listesi hakkında bilgi depolanır. Her bilgi tabanı, çalışmak için uygulama sunucusundan ve MS SQL sunucusundan gelen kendi bağlantı dizesini kullanır. Uygulama sunucusunda kayıtlı bilgi tabanları hakkındaki bilgiler, bağlantı dizeleriyle birlikte, sunucuda dizinde bulunan srvrib.lst dosyasında saklanır.<Общие данные приложений>/1C/1Cv8 (örneğin, C:/Documents and Settings/Tüm Kullanıcılar/Uygulama Verileri/1C/1Cv8/srvrib.lst). Her bilgi güvenliği sistemi için, karma MS SQL yetkilendirme modeli kullanıldığında MS SQL kullanıcı şifresi de dahil olmak üzere tam bir bağlantı dizisi saklanır. MS SQL veritabanına yetkisiz erişimden korkmayı mümkün kılan bu dosyanın varlığıdır ve tavsiyelerin aksine, en az bir veritabanına erişmek için ayrıcalıklı bir kullanıcı (örneğin, "sa") kullanılırsa, o zaman Bir bilgi güvenliğine yönelik tehdidin yanı sıra, MS SQL kullanan tüm sisteme yönelik bir tehdit söz konusudur.

Bir MS SQL sunucusunda karma yetkilendirme ve Windows yetkilendirmesinin kullanılmasının, belirli bir dosyaya erişim sağlanırken farklı türde sorunlara yol açtığını belirtmek ilginçtir. Dolayısıyla Windows yetkilendirmesinin temel olumsuz özellikleri şöyle olacaktır:

  • Uygulama sunucusundaki ve MS SQL sunucusundaki tüm bilgi güvenliğinin tek bir haklar kümesi altında (büyük olasılıkla yedekli) çalıştırılması
  • 1C uygulama sunucusu işleminden (veya genel olarak USER1CV8SERVER kullanıcısından veya eşdeğerinden), şifre belirtmeden, herhangi bir bilgi güvenliğine şifre belirtmeden kolayca bağlanabilirsiniz.

Öte yandan, bir saldırganın USER1CV8SERVER kullanıcısının bağlamından rastgele kod yürütmesi, belirtilen dosyayı elde etmekten daha zor olabilir. Bu arada, böyle bir dosyanın varlığı, sunucu işlevlerini farklı bilgisayarlara dağıtmanın başka bir argümanıdır.

Öneri: srvrib.lst dosyasına yalnızca sunucu işlemi tarafından erişilebilir olmalıdır. Bu dosyayı değiştirmek için denetimi yapılandırdığınızdan emin olun.

Maalesef varsayılan olarak bu dosya sistemi dağıtırken dikkate alınması gereken okumaya karşı neredeyse korunmuyor. İdeal seçenek, uygulama sunucusunun bu dosyanın çalışma sırasında okunmasını ve yazılmasını engellemesidir (bu sunucuda çalışan kullanıcı bağlantılarının okunması ve yazılması dahil).

Sunucuda bilgi güvenliği oluşturulurken yetki eksikliği

Dikkat! Yetkilendirme eksikliği hatası, 1C:Enterprise platformunun 8.0.14 sürümünde düzeltildi. Bu sürümde “1C:Enterprise Server Administrator” kavramı ortaya çıktı ancak sunucuda yönetici listesi belirtildiği sürece sistem aşağıda anlatıldığı gibi çalışmaktadır, dolayısıyla bu olası özelliği de unutmayın.

Muhtemelen bu bölümdeki en büyük güvenlik açığı, uygulama sunucusuna neredeyse sınırsız bilgi güvenliği ekleme yeteneğidir; bunun sonucunda, uygulama sunucusuyla bağlantıya erişim kazanan herhangi bir kullanıcı, otomatik olarak uygulama sunucusunda rastgele kod çalıştırma becerisine sahip olur. . Buna bir örnekle bakalım.

Sistem aşağıdaki gibi kurulmalıdır

  • MS SQL Server 2000 (örneğin, ağ adı SRV1)
  • Sunucu 1C:Enterprise 8.0 (ağ adı SRV2)
  • İstemci bölümü 1C:Enterprise 8.0 (ağ adı WS)

WS üzerinde çalışan kullanıcının (bundan böyle KULLANICI olarak anılacaktır), SRV2 üzerinde kayıtlı bilgi güvenliği sistemlerinden birine en az minimum düzeyde erişime sahip olduğu, ancak SRV1 ve SRV2'ye ayrıcalıklı erişime sahip olmadığı varsayılmaktadır. Genel olarak, listelenen bilgisayarların işlevlerinin birleşimi durumu etkilemez. Sistem, belgelerdeki ve ITS disklerindeki öneriler dikkate alınarak yapılandırıldı. Durum Şekil 2'de gösterilmektedir. 2.


  • uygulama sunucusunda COM+ güvenliğini yalnızca 1C kullanıcılarının uygulama sunucusu işlemine bağlanma hakkına sahip olacağı şekilde yapılandırın (daha fazla ayrıntı [ITS12]);
  • srvrib.lst dosyası USER1CV8SERVER kullanıcısı için salt okunur olmalıdır (sunucuya yeni bir bilgi güvenliği eklemek için geçici olarak yazmaya izin verin);
  • MS SQL'e bağlanmak için yalnızca TCP/IP protokolünü kullanın; bu durumda şunları yapabilirsiniz:
    • bir güvenlik duvarı kullanarak bağlantıları kısıtlayın;
    • “yabancılar” IB 1C'nin bağlantısını zorlaştıracak standart dışı bir TCP bağlantı noktasının kullanımını yapılandırmak;
    • uygulama sunucusu ile SQL sunucusu arasında iletilen verilerin şifrelenmesini kullanın;
  • sunucu güvenlik duvarını, üçüncü taraf MS SQL sunucularının kullanılması imkansız olacak şekilde yapılandırın;
  • Yetkisiz bir bilgisayarın yerel ağda görünme olasılığını ortadan kaldırmak için intranet güvenlik araçlarını kullanın (IPSec, grup güvenlik politikaları, güvenlik duvarları vb.);
  • Hiçbir koşulda USER1CV8SERVER kullanıcısına uygulama sunucusunda yönetici hakları vermeyin.

Sunucuda çalışan kodu kullanma

1C'nin istemci-sunucu sürümünü kullanırken geliştirici, kod yürütmeyi istemci ve uygulama sunucusu arasında dağıtabilir. Kodun (prosedür veya işlevin) yalnızca sunucuda yürütülmesi için, onu "Sunucu" özelliğinin ayarlandığı genel bir modüle yerleştirmek gerekir ve modülün yürütülmesine yalnızca sunucuda izin verilmemesi durumunda sunucuda, kodu "#If Server" adlı kısıtlı bölüme yerleştirin:

#If Sunucu O zaman
Function OnServer(Param1, Param2 = 0) Export // Bu fonksiyon basit olmasına rağmen sunucuda çalıştırılır.
Param1 = Param1 + 12;
Param1'i döndür;
Son Fonksiyon
#EndIf

Sunucuda çalışan kodu kullanırken şunları dikkate almanız gerekir:

  • kod, uygulama sunucusunda USER1CV8SERVER haklarıyla çalışır (COM nesneleri ve sunucu dosyaları mevcuttur);
  • tüm kullanıcı oturumları hizmetin bir örneği tarafından yürütülür; dolayısıyla, örneğin sunucudaki bir yığın taşması, tüm etkin kullanıcıların bağlantısının kesilmesine neden olur;
  • sunucu modüllerinde hata ayıklamak zordur (örneğin, hata ayıklayıcıda bir kesme noktası ayarlayamazsınız), ancak yapılması gerekir;
  • kontrolün istemciden uygulama sunucusuna ve geri aktarımı, büyük miktarda aktarılan parametre içeren önemli kaynaklar gerektirebilir;
  • etkileşimli araçların kullanımı (formlar, elektronik tablo belgeleri, diyalog kutuları), harici raporlar ve uygulama sunucusunda kodla işlem yapılması imkansızdır;
  • global değişkenlerin ("Dışa Aktar" göstergesiyle bildirilen uygulama modülü değişkenleri) kullanımına izin verilmez;

Daha fazla ayrıntı için [ITS15] ve diğer ITS makalelerine bakın.

Uygulama sunucusunun özel güvenilirlik gereksinimleri olmalıdır. Düzgün oluşturulmuş bir istemci-sunucu sisteminde aşağıdaki koşulların karşılanması gerekir:

  • istemci uygulamasının hiçbir eylemi sunucunun çalışmasını kesintiye uğratmamalıdır (idari durumlar hariç);
  • sunucu istemciden alınan program kodunu çalıştıramıyor;
  • Kaynaklar ülke genelinde “adil” dağıtılmalıdır istemci bağlantıları mevcut yükten bağımsız olarak sunucu kullanılabilirliğinin sağlanması;
  • veri engelleme olmadığında istemci bağlantıları birbirinin çalışmasını etkilememelidir;
  • sunucuda değil Kullanıcı arayüzü ancak izleme ve kayıt tutma araçları geliştirilmelidir;

Genel olarak, 1C sistemi bu gereksinimlere yaklaşacak şekilde inşa edilmiştir (örneğin, harici işlemleri sunucuda gerçekleştirilmeye zorlamak imkansızdır), ancak bazı hoş olmayan özellikler hala mevcuttur, bu nedenle:

Öneri: Bir çalışma zamanı sunucusu geliştirirken minimum arayüz ilkesine uyulması önerilir. Onlar. istemci uygulamasından sunucu modüllerine yapılan girişlerin sayısı çok sınırlı olmalı ve parametreler sıkı bir şekilde düzenlenmelidir. Öneri: Sunucudaki prosedürlerin ve işlevlerin parametrelerini alırken, parametrelerin doğrulanması gerekir (parametrelerin beklenen türe ve değer aralığına uygun olup olmadığını kontrol edin). Bu, standart çözümlerde yapılmaz, ancak kendi geliştirmelerinizde zorunlu doğrulamayı uygulamaya koymanız son derece arzu edilir. Öneri: Sunucu tarafında istek metni (ve özellikle Çalıştır komut parametresi) oluştururken, istemci uygulamasından alınan dizeleri kullanmayın.

Genel bir öneri, güvenli bina oluşturma ilkelerine aşina olmanız olacaktır. -veritabanı uygulamaları ve benzer prensiplerle çalışır. Benzerlikler gerçekten dikkate değerdir: birincisi, bir web uygulaması gibi, uygulama sunucusu da veritabanı ile kullanıcı arayüzü arasında bir ara katmandır (temel fark, web sunucusunun kullanıcı arayüzünü oluşturmasıdır); ikincisi, güvenlik açısından istemciden alınan verilere güvenemezsiniz çünkü harici raporları ve işlemleri başlatmak mümkündür.

Parametrelerin geçirilmesi

Sunucuda yürütülen bir işleve (prosedüre) parametrelerin aktarılması oldukça hassas bir konudur. Bunun temel nedeni, bunları uygulama sunucusu ile istemci işlemleri arasında aktarma ihtiyacıdır. Kontrol istemci tarafından sunucu tarafına geçtiğinde, iletilen tüm parametreler serileştirilir, sunucuya aktarılır ve burada "paketten çıkarılır" ve kullanılır. Sunucu tarafından istemci tarafına geçildiğinde süreç tersine döner. Burada bu şemanın geçen parametreleri referansa ve değere göre doğru şekilde işlediğine dikkat edilmelidir. Parametreleri aktarırken aşağıdaki kısıtlamalar geçerlidir:

  • İstemci ile sunucu arasında (her iki yönde) yalnızca değiştirilemeyen değerler (yani değerleri değiştirilemeyen) aktarılabilir: ilkel türler, referanslar, evrensel koleksiyonlar, sistem numaralandırma değerleri, değer depolama. Başka bir şey iletmeye çalışırsanız istemci uygulaması çöker (sunucu yanlış bir parametre iletmeye çalışsa bile).
  • Parametreleri aktarırken büyük miktarda verinin (örneğin 1 milyon karakterden fazla dizeler) aktarılması önerilmez, bu durum sunucu performansını olumsuz etkileyebilir.
  • Döngüsel referans içeren parametreleri hem sunucudan istemciye hem de sunucudan istemciye aktaramazsınız. Böyle bir parametreyi iletmeye çalışırsanız, istemci uygulaması çöker (sunucu yanlış parametreyi iletmeye çalışsa bile).
  • Çok karmaşık veri koleksiyonlarının aktarılması önerilmez. Çok büyük iç içe geçme düzeyine sahip bir parametreyi aktarmaya çalıştığınızda sunucu çöker (!).

Dikkat! Şu anda en sinir bozucu özellik muhtemelen karmaşık değer koleksiyonlarının iletilmesindeki hatadır. Örneğin kod: Nesting Level = 1250;
M = Yeni Dizi;
Geçilen Parametre = M;
Hesap İçin = 1 Yuvalama Döngüsü Düzeyine Göre
MVInt = Yeni Dizi;
M.Add(MVInt);
M = MVint;
EndCycle;
ServerFunction(PassedParameter);

Tüm kullanıcıların bağlantısının kesilmesiyle sunucunun acil olarak durdurulmasına yol açar ve bu, kontrolün yerleşik dildeki koda aktarılmasından önce gerçekleşir.

Sunucu tarafında güvenli olmayan işlevlerin kullanılması.

Uygulama sunucusunda yürütülen kodda tüm yerleşik dil araçları kullanılamaz, ancak mevcut araçlar arasında bile kabaca aşağıdaki gibi sınıflandırılabilecek birçok "sorunlu" yapı vardır:

  • konfigürasyonda yer almayan kodu yürütme yeteneği sağlama yeteneği ("Kod Yürütme" grubu)
  • istemci uygulamasına dosya hakkında bilgi sağlama ve işletim sistemi kullanıcı veya verilerle çalışmayla ilgili olmayan eylemler gerçekleştirebilir (“Hak İhlali”)
  • sunucunun çökmesine neden olabilecek veya çok büyük kaynakları kullanabilecek ("Sunucu çökmesi" grubu)
  • istemci hatasına neden olabilecek kapasitede (istemci hatası grubu) - bu tür dikkate alınmaz. Örnek: sunucuya değiştirilebilir bir değer iletmek.
  • programlama algoritmalarındaki hatalar (sonsuz döngüler, sınırsız yineleme vb.) (“Programlama hataları”)

Bildiğim başlıca sorunlu tasarımlar (örneklerle birlikte) aşağıda listelenmiştir:

Prosedür Yürütme(<Строка>)

Kod yürütülüyor. Kendisine dize değeri olarak iletilen bir kod parçasını yürütmenize olanak tanır. Sunucuda kullanıldığında istemciden alınan verilerin parametre olarak kullanılmadığından emin olmalısınız. Örneğin aşağıdaki kullanıma izin verilmez:

#If Sunucu O zaman
ProsedürOnServer(Param1) Dışa Aktarma
Çalıştır(Param1);
Prosedürün Sonu
#EndIf

"COMObject" yazın (yapıcı New COMObject(<Имя>, <Имя сервера>))

Uygulama sunucusunda (veya belirtilen diğer bilgisayarda) USER1CV8SERVER haklarına sahip harici bir uygulama COM nesnesi oluşturur. Bir sunucuda kullanıldığında parametrelerin istemci uygulamasından aktarılmadığından emin olun. Ancak sunucu tarafında içe/dışa aktarım yaparken, internet üzerinden veri gönderirken, standart dışı işlevler uygularken vb. durumlarda bu özelliğin kullanılması etkilidir.

İşlev GetCOMObject(<Имя файла>, <Имя класса COM>)
Hak ihlali ve kod yürütme.Öncekine benzer şekilde, yalnızca dosyaya karşılık gelen COM nesnesi alınıyor.
Prosedürler ve işlevler ComputerName(), TemporaryFileDirectory(), ProgramDirectory(), WindowsUsers()
Hak ihlali. Bunları sunucuda çalıştırarak, sunucu alt sisteminin organizasyonunun ayrıntılarını öğrenmenizi sağlar. Bir sunucuda kullanıldığında, verilerin istemciye aktarılmadığından veya uygun izin olmadan operatörler tarafından erişilemediğinden emin olun. Referans olarak iletilen bir parametrede verilerin geri aktarılabileceğine özellikle dikkat edin.
Dosyalarla (CopyFile, FindFiles, MergeFiles ve diğerleri) ve Dosya türleriyle çalışmaya yönelik prosedürler ve işlevler.

Hak ihlali. Bunları sunucuda çalıştırarak, USER1CV8SERVER kullanıcı hakları altında erişilebilen yerel (ve ağda bulunan) dosyalara paylaşılan erişim elde edilmesine olanak tanırlar. Bilinçli kullanıldığında sunucuya veri alma/dışa aktarma gibi görevleri etkin bir şekilde gerçekleştirmek mümkündür.

Bu işlevleri kullanmadan önce 1C kullanıcı haklarınızı kontrol ettiğinizden emin olun. Kullanıcı haklarını kontrol etmek için sunucu modülünde aşağıdaki yapıyı kullanabilirsiniz:

#If Sunucu O zaman
PerformWorkWithFile() Dışa Aktarma Prosedürü
RoleAdministrator = Metadata.Roles.Administrator;
Kullanıcı = SessionParameters.CurrentUser;
User.Roles.Contains(RoleAdministrator) ise O zaman
//Dosyalarla çalışma kodu burada yürütülür
endIf;
#EndIf

Bu prosedürleri ve işlevleri kullanıyorsanız parametreleri kontrol ettiğinizden emin olun, aksi takdirde, örneğin sunucuda aşağıdaki kodu çalıştırırken, yanlışlıkla veya bilerek 1C uygulama sunucusuna onarılamaz zarar verme riski vardır:

Yol = "C:\Belgeler ve Ayarlar\Tüm Kullanıcılar\Uygulama Verileri\1C\1Cv8\";
MoveFile(Yol + "srvrib.lst", Yol + "İşte Dosyanın Gideceği Yer");

Sunucuda bu tür bir kod çalıştırıldıktan sonra, USER1CV8SERVER kullanıcısı yukarıda açıklandığı gibi bunu değiştirme hakkına sahipse ve sunucu işlemini yeniden başlattıktan sonra (varsayılan olarak, tüm kullanıcılar çıktıktan 3 dakika sonra), sunucunun başlatılmasıyla ilgili BÜYÜK bir soru ortaya çıkacaktır. . Ancak dosyaları tamamen silmek de mümkündür...

"XBase", "BinaryData", "XML Okuyucu", "XML Yazıcı", "XSL Dönüşümü", "ZipFile Yazıcı", "ZipFile Okuyucu", "Metin Okuyucu", "Metin Yazarı" türleri
Hak ihlali. Bunları sunucuda çalıştırarak, belirli türdeki yerel (ve ağda bulunan) dosyalara erişime ve bunları USER1CV8SERVER kullanıcı hakları altında okuma/yazmaya izin verirler. Bilinçli kullanıldığı takdirde sunucuya veri alma/dışa aktarma, belirli fonksiyonların çalışmasını kaydetme, idari görevleri çözme gibi görevleri etkin bir şekilde gerçekleştirmek mümkündür. Genel olarak öneriler önceki paragrafla örtüşmektedir, ancak istemci ve sunucu parçaları arasında bu dosyalardan (ancak tüm bu türdeki nesnelerden değil) veri aktarma olasılığını göz önünde bulundurmalısınız.
"Sistem Bilgileri" yazın
Hak ihlali. Yanlış kullanım ve verilerin uygulamanın istemci kısmına aktarılması durumunda uygulama sunucusu hakkında veri elde etmenizi sağlar. Kullanırken kullanım hakkının sınırlandırılması tavsiye edilir.
"InternetConnection", "InternetMail", "InternetProxy", "HTTPConnection", "FTPConnection" türleri

Hak ihlali. Bir sunucuda kullanıldığında, USER1CV8SERVER hakları altında bir uygulama sunucusundan uzaktaki bir bilgisayara bağlanır. Öneriler:

  • Yöntemleri çağırırken parametrelerin kontrolü.
  • 1C kullanıcı haklarının kontrolü.
  • USER1CV8SERVER kullanıcısının ağa erişim haklarına ilişkin ciddi kısıtlamalar.
  • 1C uygulama sunucusunda güvenlik duvarını doğru şekilde kurun.

Doğru kullanıldığında, örneğin bir uygulama sunucusundan e-posta göndermeyi organize etmek uygundur.

"InformationBaseUserManager", "InformationBaseUser" türleri

Hak ihlali. Yanlış kullanıldığında (ayrıcalıklı bir modülde), kullanıcı eklemek veya mevcut kullanıcıların yetkilendirme parametrelerini değiştirmek mümkündür.

İşlev Formatı

Sunucu çökmesi. Evet! Görünüşte zararsız olan bu işlev, eğer parametreleri sunucuda kontrol edilmez ve yürütülmezse, sunucu uygulamasının çökmesine neden olabilir. Hata, sayıları biçimlendirirken ve baştaki sıfırları ve çok sayıda karakteri görüntüleme modunu kullanırken oluşur; örneğin

Biçim(1, "CHZ=999; CHVN=");

Bu hatanın sonraki platform sürümlerinde düzeltileceğini umuyorum, ancak bu arada, bu işleve sunucuda yürütülebilecek tüm çağrılarda çağrı parametrelerini kontrol edin.

Değerleri kaydetmeye yönelik prosedürler ve işlevler (ValueInRowInt, ValueInFile)
Sunucu çökmesi. Bu işlevler koleksiyonlardaki döngüsel başvuruları veya çok derin iç içe yerleştirmeleri işlemez, dolayısıyla bazı çok özel durumlarda çökebilirler.

Fonksiyonlarda sınır ve özel parametre değerlerinde hatalar. Yürütme kontrolü.

Sunucu kullanırken karşılaşabileceğiniz sorunlardan biri, sunucu işlevlerinin yüksek "sorumluluğu"dur (bir bağlantıdaki hata nedeniyle tüm sunucu uygulamasının çökmesi ve tüm bağlantılar için tek bir "kaynak alanı" kullanılması olasılığı) . Bu nedenle ana çalışma zamanı parametrelerini kontrol etme ihtiyacı:

  • Yerleşik dil işlevleri için başlatma parametrelerini kontrol edin (bunun iyi bir örneği “Format” işlevidir)
  • Döngüleri kullanırken döngü çıkış koşulunun karşılandığından emin olun. Döngü potansiyel olarak sonsuzsa yineleme sayısını yapay olarak sınırlayın: MaximumIterationCounterValue = 1000000;
    Yineleme Sayacı = 1;
    Hoşçakal
    FunctionWhichMayNotReturnFalseValue()
    VE (Yineleme Sayısı<МаксимальноеЗначениеСчетчикаИтераций) Цикл

    //.... Döngünün gövdesi
    Yineleme Sayacı = Yineleme Sayacı + 1;
    EndCycle;
    Yineleme Sayacı>Yineleme Sayacı Maksimum Değeri ise O zaman
    //.... aşırı uzun döngü yürütme olayını ele alır
    endIf;

  • Özyinelemeyi kullanırken maksimum iç içe geçme düzeyini sınırlayın.
  • Sorguları oluştururken ve yürütürken, çok uzun seçimleri ve büyük miktarda bilginin seçilmesini engellemeye çalışın (örneğin, "HİYERARŞİDE" koşulunu kullanırken boş bir değer kullanmayın)
  • Bir bilgi tabanı tasarlarken, sayılar için yeterince büyük bir bit derinliği rezervi sağlayın (aksi takdirde toplama ve çarpma, değişmeli ve ilişkisel olmayan hale gelir, bu da hata ayıklamayı zorlaştırır)
  • Yürütülebilir sorgularda, NULL değerlerinin varlığı ve NULL kullanarak sorgu koşullarının ve ifadelerinin doğru çalışıp çalışmadığını kontrol etmek için işlem mantığını kontrol edin.
  • Koleksiyonları kullanırken, bunları uygulama sunucusu ile istemci tarafı arasında aktarma yeteneğini kontrol edin.

Erişimi kısıtlamak için istemci tarafına terminal erişimini kullanma

Verilere erişimi sınırlamak ve terminal sunucusunda istemci tarafı kodu çalıştırarak performansı artırmak için terminal erişimini kullanmaya yönelik önerileri sıklıkla bulabilirsiniz. Evet, doğru yapılandırılırsa terminal erişiminin kullanımı gerçekten de genel sistem güvenliği seviyesini artırabilir, ancak ne yazık ki pratik kullanımda sistem güvenliğinin yalnızca azaldığı gerçeğiyle sıklıkla karşılaşabilirsiniz. Bunun neyle bağlantılı olduğunu anlamaya çalışalım. Artık terminal erişimini organize etmenin iki yaygın yolu var; bunlar Microsoft Terminal Hizmetleri (RDP protokolü) ve Citrix Metaframe Sunucusu (ICA protokolü). Genel olarak Citrix araçları çok daha esnek erişim yönetimi seçenekleri sunar ancak bu çözümlerin fiyatı çok daha yüksektir. Yalnızca her iki protokolde ortak olan ve genel güvenlik düzeyini azaltabilecek temel özellikleri ele alacağız. Terminal erişimini kullanırken yalnızca üç ana tehlike vardır:
  • Aşırı miktarda kaynağı ele geçirerek diğer kullanıcıların çalışmasını engelleme yeteneği
  • Diğer kullanıcıların verilerine erişim.
  • Verilerin terminal sunucusundan kullanıcının bilgisayarına izinsiz kopyalanması

Her durumda, Terminal Hizmetleri şunları yapmanızı sağlar:

  • İşin güvenilirliğini artırın (Terminal bilgisayarda bir arıza olması durumunda kullanıcı daha sonra aynı yerden çalışmaya devam edebilir)
  • İstemci uygulamasına ve kaydettiği dosyalara erişimi kısıtlayın.
  • Bilgi işlem yükünü kullanıcının iş istasyonundan terminal erişim sunucusuna aktarın
  • Sistem ayarlarını daha merkezi bir şekilde yönetin. Kullanıcılar için sisteme hangi bilgisayardan giriş yaptıklarına bakılmaksızın kaydedilen ayarlar geçerli olacaktır.
  • Bazı durumlarda sisteme uzaktan erişim için bir terminal çözümü kullanabilirsiniz.

Bir kullanıcı için terminal sunucusuna olası bağlantı sayısını sınırlamak gerekir

1C istemci uygulamasının kaynaklarla ilgili "oburluğu" nedeniyle, bir kullanıcının (operatörün) terminal sunucusuna maksimum eşzamanlı bağlantı sayısını sınırlamak zorunludur. Aktif olarak kullanılan bir bağlantı, uygulamanın yalnızca bir örneğiyle 300 MB'a kadar bellek kullanabilir. Belleğe ek olarak CPU zamanı da aktif olarak kullanılıyor ve bu da bu sunucunun kullanıcılarının stabilitesine katkıda bulunmuyor. Böyle bir kısıtlama aynı zamanda sunucu kaynaklarının aşırı kullanımını da önleyebilir. hesap. Standart terminal sunucusu ayarlarıyla uygulanır.

Bir bağlantıda birden fazla veya iki 1C istemci uygulamasının aynı anda çalışmasına izin vermemelisiniz

Önceki paragraftakiyle aynı nedenlerle dikte edilmiştir, ancak uygulanması teknik olarak daha zordur. Sorun şu ki, terminal sunucusu araçlarını kullanarak 1C'nin yeniden başlatılmasını önlemek neredeyse imkansızdır (neden aşağıda açıklanacaktır), bu nedenle bu özelliği uygulama çözümü düzeyinde uygulamanız gerekir (bu da iyi bir çözüm değildir, çünkü oturumlar bir süre "askıda kalabilir" Uygulama yanlış şekilde sonlandırılırsa, uygulama modülünde ve bazı referans kitaplarında uygulama çözümünün iyileştirilmesine ihtiyaç vardır, bu da 1C'den gelen güncellemelerin kullanımını zorlaştıracaktır). Arka planda bazı eylemleri (örneğin, rapor oluşturma) çalıştırabilmek için kullanıcıya 2 uygulamayı çalıştırma yeteneğinin bırakılması son derece arzu edilir - istemci uygulaması ne yazık ki aslında tek iş parçacıklıdır.

1C'de kaynak yoğun bilgi işlem görevlerini çalıştırma hakkına sahip olan kullanıcılara terminal sunucusuna erişim hakları verilmesi veya diğer kullanıcılar aktif olarak çalışırken bu tür başlatmaların engellenmesi önerilmez.

Elbette, terminal sunucusuna erişimi yalnızca veri madenciliği, coğrafi diyagramlar, içe/dışa aktarma gibi görevleri ve uygulamanın istemci kısmını ciddi şekilde yükleyen diğer görevleri kullanmayan kullanıcılara bırakmak daha iyidir. Hala bu tür görevlere izin verilmesine ihtiyaç varsa, o zaman şunları yapmak gerekir: kullanıcıya bu görevlerin diğer kullanıcıların performansını etkileyebileceğini bildirmek, böyle bir işlemin başlangıcını ve bitişini günlüğe kaydetmek, yalnızca düzenlenmiş bir şekilde yürütülmesine izin vermek zaman vb.

Her kullanıcının terminal sunucusundaki yalnızca kesin olarak tanımlanmış dizinlere yazma haklarına sahip olduğundan ve diğer kullanıcıların bunlara erişimi olmadığından emin olmak gerekir.

İlk olarak, paylaşılan dizinlere (1C'nin kurulu olduğu dizin gibi) yazma yeteneğini sınırlamazsanız, o zaman bir saldırganın programın davranışını tüm kullanıcılar için değiştirmesi mümkün olmaya devam eder. İkinci olarak, bir kullanıcının verileri (geçici dosyalar, rapor ayarlarını kaydetme dosyaları vb.) hiçbir durumda terminal sunucusunun başka bir kullanıcısı tarafından erişilemez - genel olarak normal yapılandırma sırasında bu kurala uyulur. Üçüncüsü, saldırganın hala sabit diskte yer kalmayacak şekilde bölümü "çöpleme" fırsatı var. Windows 2000'den başlayarak Windows işletim sisteminin bir kota mekanizmasına sahip olduğu konusunda bana itiraz edeceklerini biliyorum, ancak bu oldukça pahalı bir mekanizma ve bunun gerçek anlamda kullanıldığını neredeyse hiç görmedim.

Erişimi ayarlamaya ilişkin önceki sorunların uygulanması genellikle oldukça kolaysa, o zaman (görünüşte) dosyalara kullanıcı erişimini düzenlemek gibi basit bir görev önemsiz bir şekilde uygulanmaz. Öncelikle kota mekanizması kullanılmazsa büyük dosyalar kaydedilebilir. İkincisi, sistem, dosyayı başka bir kullanıcının kullanımına sunacak şekilde kaydetmenin neredeyse her zaman mümkün olacağı şekilde inşa edilmiştir.

Görevin tamamen çözülmesinin zor olduğu göz önüne alındığında, çoğu dosya olayının denetlenmesi önerilir.

Disk aygıtlarının, yazıcıların ve istemci iş istasyonunun panosunun bağlantısını (eşlemesini) yasaklamak gerekir.

RDP ve ICA'da, terminal bilgisayarın disklerinin, yazıcılarının, pano com portlarının sunucuya otomatik bağlantısını düzenlemek mümkündür. Böyle bir fırsat mevcutsa, terminal sunucusunda yabancı kodun başlatılmasını ve 1C'den terminal erişim istemcisine veri kaydedilmesini önlemek neredeyse imkansızdır. Bu özelliklere yalnızca yönetici haklarına sahip olanlar için izin verin.

Terminal sunucusundan ağ dosyası erişimi sınırlı olmalıdır.

Bu yapılmazsa, kullanıcı tekrar istenmeyen kodu çalıştırabilecek veya verileri kaydedebilecektir. Normal günlük, dosya olaylarını izlemediğinden (bu arada, platform geliştiricileri tarafından uygulama için iyi bir fikir) ve tüm ağ boyunca bir sistem denetimi ayarlamak neredeyse imkansızdır (bunu sürdürmek için yeterli kaynak yoktur), kullanıcının verileri yazdırmak için veya e-postayla gönderebilmesi daha iyidir. Terminal sunucusunun doğrudan kullanıcıların çıkarılabilir ortamıyla çalışmamasını sağlamaya özellikle dikkat edin.

Güvenli bir sistem oluştururken hiçbir durumda uygulama sunucusunu terminal sunucusunda bırakmamalısınız.

Uygulama sunucusu istemci uygulamalarıyla aynı bilgisayarda çalışıyorsa, normal çalışmasını bozacak birçok fırsat vardır. Herhangi bir nedenle terminal sunucusunun ve uygulama sunucusunun işlevlerini ayırmak mümkün değilse, uygulama sunucusu tarafından kullanılan dosyalara kullanıcı erişimine özellikle dikkat edin.

Terminal sunucusunda 1C:Enterprise dışındaki tüm uygulamaları çalıştırma olasılığını dışlamak gerekir.

Bu, gerçekleştirilmesi en zor dileklerden biridir. Etki alanında Grup Güvenlik Politikası politikasını doğru şekilde yapılandırmanız gerektiği gerçeğiyle başlayalım. Tüm Yönetim Şablonları ve Yazılım Kısıtlama İlkeleri doğru şekilde yapılandırılmalıdır. Kendinizi test etmek için en azından aşağıdaki özelliklerin engellendiğinden emin olun:

Bu gereksinimin uygulanmasının karmaşıklığı genellikle terminal sunucusunda "ekstra" bir 1C oturumu başlatma olasılığına yol açar (diğer uygulamalar sınırlı olsa bile, 1C'nin Windows kullanılarak başlatılmasını yasaklamak temelde imkansızdır).

Normal günlüğün sınırlamalarını göz önünde bulundurun (tüm kullanıcılar programı tek bir bilgisayardan kullanır)

Açıkçası, kullanıcılar 1C'yi terminal modunda açtığından, terminal sunucusu günlüğe kaydedilecektir. Günlük, kullanıcının hangi bilgisayardan bağlandığını göstermez.

Terminal Sunucusu – Koruma mı, Güvenlik Açığı mı?

Dolayısıyla, kuzeydeki terminalin ana özelliklerini göz önünde bulundurduktan sonra, kuzeydeki terminalin bilgi işlem yükünü dağıtmak için otomasyona potansiyel olarak yardımcı olabileceğini söyleyebiliriz, ancak güvenli bir sistem oluşturmak oldukça zordur. Terminal sunucusu kullanmanın en etkili olduğu durumlardan biri, sınırlı işlevselliğe ve özel bir arayüze sahip kullanıcılar için Windows Gezgini olmadan 1C'nin tam ekran modunda çalıştırılmasıdır.

Müşteri kısmının çalışması

Internet Explorer'ı (IE) kullanma

1C istemci kısmının normal çalışması için koşullardan biri bileşenlerin kullanılmasıdır İnternet Explorer. Bu bileşenlere çok dikkat etmeniz gerekiyor.

Dikkat! İlk olarak, IE'ye bir casus yazılım veya reklam yazılımı modülü "ekliyse", 1C'de herhangi bir HTML dosyasını görüntüleseniz bile yüklenecektir. Şu ana kadar bu özelliğin bilinçli bir şekilde kullanıldığını görmedim, ancak kuruluşlardan birinde 1C çalıştıran pornografik ağlardan birinden yüklü bir "casus" modülü gördüm (virüsten koruma programı güncellenmedi, belirtileri tespit edildi) : güvenlik duvarını kurarken, 1C'nin 80 numaralı bağlantı noktasında bir porno sitesine bağlanmaya çalıştığı açıktı). Aslında bu, korumanın kapsamlı olması gerektiğini destekleyen bir başka argümandır.

Dikkat! İkincisi, 1C sistemi, görüntülenen HTML belgelerinde Flash filmlerin, ActiveX nesnelerinin, VBScript'in kullanılmasına, İnternet'e veri gönderilmesine, hatta PDF dosyalarının (!) açılmasına izin verir, ancak ikinci durumda "aç veya kaydet" komutunu ister... Genel olarak kalbinizin arzuladığı her şey. Yerleşik HTML görüntüleme ve düzenleme yeteneklerinin tamamen makul olmayan kullanımına bir örnek:

  • Yeni bir HTML belgesi oluşturun (Dosya -> Yeni -> HTML Belgesi).
  • Boş belgenin "Metin" sekmesine gidin.
  • Metni (tamamen) kaldırın.
  • Bu belgenin "Görünüm" sekmesine gidin
  • Sürükle ve bırak yöntemini kullanarak, SWF uzantılı bir dosyayı (bunlar Flash film dosyalarıdır) açık bir Explorer'dan, örneğin tarayıcı önbelleğinden bir belge penceresine taşıyın; ancak eğlence için bir FLASH oyuncağı da kullanabilirsiniz.
  • Ne kadar sevimli! 1C'de bir oyuncağı çalıştırabilirsiniz!

Sistem güvenliği açısından bakıldığında bu tamamen yanlıştır. Şu ana kadar bu güvenlik açığı nedeniyle 1C'ye herhangi bir özel saldırı görmedim, ancak büyük olasılıkla bu bir zaman meselesi ve bilgilerinizin değeri meselesi olacaktır.

Bir HTML belge alanıyla çalışırken ortaya çıkan bazı başka küçük sorunlar da vardır, ancak asıl sorunlar listelenen iki tanesidir. Bununla birlikte, bu özelliklere yaratıcı bir şekilde yaklaşırsanız, 1C ile çalışmak için gerçekten harika arayüz yeteneklerini organize edebilirsiniz.

Harici raporları kullanma ve işleme.

Dikkat! Dış raporlar ve işlemler - bir yandan - uygun yol diğer yandan ek basılı formların, düzenleyici raporların, özel raporların uygulanması, birçok sistem güvenlik kısıtlamasını atlamanın ve uygulama sunucusunun çalışmasını kesintiye uğratmanın potansiyel bir yoludur (örneğin, yukarıdaki "Parametrelerin aktarılması" bölümüne bakın). 1C sisteminde, “Harici işlemenin etkileşimli açılması” rolü için haklar kümesinde özel bir parametre vardır, ancak bu sorunu tamamen çözmez - tam bir çözüm için, yönetebilecek kullanıcı çemberini daraltmak gerekir. harici işlemler kullanılarak uygulanan standart çözümlerin harici basılı formları, düzenleyici raporları ve diğer standart yetenekleri. Örneğin, UPP'de varsayılan olarak tüm ana kullanıcı rolleri ek basılı formlardan oluşan bir dizinle çalışma yeteneğine sahiptir ve bu aslında herhangi bir harici işlemi kullanma yeteneğidir.

Standart çözümler ve platformlar için standart mekanizmaların kullanılması (veri alışverişi)

Standart mekanizmalardan bazıları potansiyel olarak tehlikelidir ve beklenmedik şekillerdedir.

Listeleri yazdırma

Sistemdeki herhangi bir liste (örneğin bir dizin veya bilgi kaydı) yazdırılabilir veya bir dosyaya kaydedilebilir. Bunu yapmak için içerik menüsünde ve "Eylemler" menüsünde bulunan standart özelliği kullanmanız yeterlidir:

Kullanıcının listelerde gördüğü hemen hemen her şeyin harici dosyalara aktarılabileceğini unutmayın. Önerebileceğimiz tek şey, yazdırma sunucularında belge yazdırma günlüğü tutmaktır. Özellikle kritik formlar için, korumalı tablo alanıyla ilişkili eylem panelini, bu panelde liste görüntüleme özelliği kullanılamayacak şekilde yapılandırmak ve içerik menüsünü devre dışı bırakmak gerekir (bkz. Şekil 6).

Dağıtılmış bir veritabanında veri alışverişi

Veri alışverişi formatı oldukça basittir ve belgelerde açıklanmıştır. Kullanıcının birden fazla dosyayı değiştirme olanağı varsa, sistemde yetkisiz değişiklikler yapabilir (bu oldukça emek yoğun bir görev olmasına rağmen). Dağıtılmış veritabanı değişim planlarını kullanırken çevresel bir veritabanı oluşturma yeteneği sıradan operatörlerin kullanımına açık olmamalıdır.

Standart XML Veri Değişimi

Standart konfigürasyonlar (örneğin, "Ticaret Yönetimi" ve "Kurumsal Muhasebe") arasındaki alışveriş için kullanılan standart veri alışverişinde, alışveriş kurallarındaki nesnelerin yüklenmesi ve boşaltılması için olay işleyicileri belirlemek mümkündür. Bu, dosyadan bir işleyicinin alınması ve dosya yükleme ve boşaltmanın standart işlenmesi için "Run()" prosedürünün alınmasıyla gerçekleştirilir ("Run()" prosedürü istemci tarafında başlatılır). Kötü niyetli eylemler gerçekleştirecek böyle bir sahte değişim dosyası oluşturmak elbette zor değil. Standart çözümlerin çoğu kullanıcı rolü için paylaşıma varsayılan olarak izin verilir.

Öneri:çoğu kullanıcı için XML alışverişine erişimi kısıtlayın (bu işi yalnızca bilgi güvenliği yöneticilerine bırakın). Değişim dosyasını kaydederek, örneğin göndererek, bu işlemin işlemlerinin günlüklerini tutun e-mail ile indirmeden önce bilgi güvenliği yöneticisi.

Genel raporların, özellikle Raporlar Konsolunun kullanılması

Başka bir sorun, genel raporlara, özellikle de Rapor Konsolu raporuna varsayılan kullanıcı erişimidir. Bu rapor, bilgi güvenliğine yönelik hemen hemen her türlü talebi yerine getirmenize izin vermesi ve 1C haklar sistemi (RLS dahil) oldukça katı bir şekilde yapılandırılmış olsa bile, kullanıcının çok sayıda "ekstra" bilgi almasına olanak sağlamasıyla karakterize edilir. ve sunucuyu tüm sistem kaynaklarını tüketecek bir isteği yürütmeye zorlayın.

Tam Ekran Modunu Kullanma (Masaüstü Modu)

Program işlevselliğine sınırlı erişime sahip özel arayüzleri düzenlemenin etkili yollarından biri, kullanılan arayüzün ana (ve muhtemelen tek) formunun tam ekran modudur. Bu durumda, örneğin "Dosya" menüsü gibi erişilebilirlik sorunları yoktur ve tüm kullanıcı eylemleri, kullanılan formun yetenekleriyle sınırlıdır. Daha fazla ayrıntı için ITS diskindeki "Masaüstü modunu uygulama özellikleri" konusuna bakın.

Destek olmak

1C'nin istemci-sunucu sürümü için yedekleme iki şekilde gerçekleştirilebilir: verileri dt uzantılı bir dosyaya yüklemek ve SQL kullanarak yedek kopyalar oluşturmak. İlk yöntemin birçok dezavantajı vardır: özel erişim gereklidir, bir kopyanın kendisinin oluşturulması çok daha uzun sürer, bazı durumlarda (bilgi güvenliği yapısı ihlal edilirse) arşiv oluşturmak imkansızdır, ancak bir avantaj vardır - minimum boyut Arşiv. SQL yedekleme için bunun tersi doğrudur: basit yapı ve sıkıştırma eksikliği nedeniyle bir kopyanın oluşturulması arka planda SQL sunucusu kullanılarak gerçekleşir - bu çok hızlı bir işlemdir ve SQL'in fiziksel bütünlüğü olduğu sürece veritabanı bozulmaz, yedekleme yapılır ancak kopyanın boyutu gerçek olanla çakışır, genişletilmiş durumdaki bilgi güvenliğinin boyutu (sıkıştırma yapılmaz). MS SQL yedekleme sisteminin ek avantajları nedeniyle, kullanılması daha tavsiye edilir (3 tür yedeklemeye izin verilir: tam, diferansiyel, işlem günlüğü kopyası; düzenli olarak yürütülen işler oluşturmak mümkündür; bir yedek kopya ve bir yedek) sistem hızlı bir şekilde devreye alınır; gerekli disk alanının boyutunu vb. tahmin etmek mümkündür). Sistem güvenliği açısından bir yedekleme düzenlemenin ana noktaları şunlardır:

  • Yedeklemeler için kullanıcıların erişemeyeceği bir depolama konumu seçme ihtiyacı.
  • Yedeklemelerin MS SQL sunucusundan fiziksel bir mesafede saklanması ihtiyacı (doğal afetler, yangınlar, saldırılar vb. durumlarda)
  • Yedeklemelere erişimi olmayan bir kullanıcıya yedekleme başlatma hakkı verme yeteneği.

Daha fazla ayrıntı için lütfen MS SQL belgelerine bakın.

Veri şifreleme

Verileri yetkisiz erişimden korumak için sıklıkla çeşitli şifreleme araçları (hem yazılım hem de donanım) kullanılır, ancak bunların uygulanabilirliği büyük ölçüde doğru uygulamaya ve sistemin genel güvenliğine bağlıdır. En yaygın araçları kullanarak veri iletiminin ve depolamasının çeşitli aşamalarında veri şifrelemeye ve kriptografik araçlar kullanılarak sistem tasarımındaki ana hatalara bakacağız.

Korunabilecek bilgi işlemenin birkaç ana aşaması vardır:

  • Sistemin istemci kısmı ile uygulama sunucusu arasında veri aktarımı
  • Uygulama sunucusu ile MS SQL Server arasında veri aktarımı
  • MS SQL Server'da depolanan veriler (fiziksel diskteki veri dosyaları)
  • Bilgi güvenliğinde saklanan verilerin şifrelenmesi
  • Dış veriler (bilgi güvenliğiyle ilgili olarak)

İstemci tarafında ve uygulama sunucusunda depolanan veriler (kayıtlı kullanıcı ayarları, bilgi güvenliği listesi vb.) için şifreleme yalnızca çok nadir durumlarda gerekçelendirilir ve bu nedenle burada dikkate alınmaz. Kriptografik araçları kullanırken, bunların kullanımının bir bütün olarak sistemin performansını önemli ölçüde azaltabileceğini unutmamalıyız.

TCP/IP protokolünü kullanırken ağ bağlantılarının kriptografik koruması hakkında genel bilgi.

Güvenlik olmadan, tüm ağ bağlantıları yetkisiz gözetim ve erişime karşı savunmasızdır. Bunları korumak için ağ protokolü düzeyinde veri şifrelemeyi kullanabilirsiniz. Yerel ağda iletilen verileri şifrelemek için çoğunlukla işletim sistemi tarafından sağlanan IPSec araçları kullanılır.

IPSec araçları, iletilen verilerin DES ve 3DES algoritmalarını kullanarak şifrelenmesini ve ayrıca MD5 veya SHA1 karma işlevlerini kullanarak bütünlük doğrulamasını sağlar. IPSec iki modda çalışabilir: taşıma modu ve tünel modu. Aktarım modu, yerel ağdaki bağlantıların güvenliğini sağlamak için daha uygundur. Tünel modu, ayrı ağ bölümleri arasındaki VPN bağlantılarını düzenlemek veya açık veri kanalları üzerinden yerel bir ağa yapılan uzak bağlantıyı korumak için kullanılabilir.

Bu yaklaşımın başlıca avantajları şunlardır:

  • Active Directory araçlarını kullanarak merkezi güvenlik yönetimi imkanı.
  • Uygulama sunucusuna ve MS SQL sunucusuna yetkisiz bağlantıları hariç tutma yeteneği (örneğin, uygulama sunucusuna yetkisiz bilgi güvenliği eklenmesine karşı koruma sağlamak mümkündür).
  • Ağ trafiğinin "dinlenmesinin" ortadan kaldırılması.
  • Uygulama programlarının davranışını değiştirmeye gerek yoktur (bu durumda 1C).
  • Böyle bir çözümün standart doğası.

Ancak bu yaklaşımın sınırlamaları ve dezavantajları vardır:

  • IPSec, verileri doğrudan kaynak ve hedef bilgisayarlara müdahaleye ve gizlice dinlenmeye karşı korumaz.
  • Ağ üzerinden aktarılan veri miktarı, IPSec kullanılmadan aktarılandan biraz daha fazladır.
  • IPSec kullanıldığında merkezi işlemci üzerindeki yük biraz daha yüksektir.

IPSec araçlarının uygulanmasına ilişkin ayrıntılı bir açıklama bu makalenin kapsamı dışındadır ve IP protokolünün işleyişine ilişkin temel ilkelerin anlaşılmasını gerektirir. Bağlantı güvenliğini doğru şekilde yapılandırmak için lütfen ilgili belgeleri okuyun.

Ayrı olarak, VPN bağlantılarını düzenlerken 1C ile yapılan lisans sözleşmesinin çeşitli yönlerinden bahsetmek gerekir. Gerçek şu ki, teknik kısıtlamaların olmamasına rağmen, yerel bir ağın birkaç bölümünü bağlarken veya bireysel bir bilgisayarın yerel ağa uzaktan erişimini sağlarken, genellikle birkaç temel malzemeye ihtiyaç duyulur.

Sistemin istemci kısmı ile uygulama sunucusu arasında aktarıldığında verilerin şifrelenmesi.

Ağ protokolü düzeyinde şifrelemenin yanı sıra, ITS'nin “İstemci-sunucu sürümünde bilgi tabanına kullanıcı erişiminin düzenlenmesi” makalesinde bahsedilen COM+ protokolü düzeyinde de veri şifrelemek mümkündür. Bunu uygulamak için, "Bileşen Hizmetleri"nde 1CV8 uygulaması için çağrılara yönelik Kimlik Doğrulama düzeyini "Paket Gizliliği" olarak ayarlamanız gerekir. Bu moda ayarlandığında, gönderenin verileri, kimliği ve imzası da dahil olmak üzere paketin kimliği doğrulanır ve şifrelenir.

Uygulama sunucusu ile MS SQL Server arasında aktarıldığında verilerin şifrelenmesi

MS SQL Server, veri şifreleme için aşağıdaki araçları sağlar:

  • Uygulama sunucusu ile MS SQL Server arasında veri aktarımı yapılırken Güvenli Yuva Katmanı (SSL) kullanılması mümkündür.
  • Çoklu Protokol ağ kitaplığını kullanırken, RPC düzeyinde veri şifreleme kullanılır. Bu muhtemelen SSL kullanmaktan daha zayıf bir şifrelemedir.
  • Paylaşılan Bellek değişim protokolü kullanılıyorsa (bu, uygulama sunucusu ve MS SQL Server aynı bilgisayarda bulunuyorsa gerçekleşir), o zaman şifreleme hiçbir durumda kullanılmaz.

Belirli bir MS SQL sunucusu için iletilen tüm verilerin şifrelenmesi ihtiyacını belirlemek için "Sunucu Ağı Yardımcı Programı" yardımcı programını kullanmanız gerekir. Çalıştırın ve "Genel" sekmesinde "Protokol şifrelemesini zorla" onay kutusunu işaretleyin. Şifreleme yöntemi, istemci uygulaması (yani 1C uygulama sunucusu) tarafından kullanılan yönteme bağlı olarak seçilir. SSL kullanmak için ağınızdaki sertifika hizmetini doğru şekilde yapılandırmanız gerekir.

Belirli bir uygulama sunucusu için iletilen tüm verilerin şifrelenmesi ihtiyacını ayarlamak amacıyla, "İstemci Ağı Yardımcı Programı" yardımcı programını kullanmanız gerekir (genellikle "C:\WINNT\system32\cliconfg.exe" konumunda bulunur). Önceki durumda olduğu gibi, "Genel" sekmesinde "Protokol şifrelemesini zorla" onay kutusunu işaretleyin.

Bu durumda şifreleme kullanımının, özellikle büyük miktarda bilgi döndüren sorgular kullanıldığında, sistem performansı üzerinde önemli bir etkiye sahip olabileceğini dikkate almakta fayda var.

TCP/IP protokolünü kullanırken uygulama sunucusu ile MS SQL Server arasındaki bağlantıyı daha iyi korumak için, varsayılan ayarlarda birkaç değişiklik önerebiliriz.

Öncelikle standart portun dışında bir port ayarlayabilirsiniz (varsayılan olarak port 1433 kullanılır). Veri alışverişi için standart olmayan bir TCP bağlantı noktası kullanmaya karar verirseniz lütfen şunu unutmayın:

  • MS SQL sunucusu ve uygulama sunucusu aynı bağlantı noktasını kullanmalıdır.
  • Güvenlik duvarı kullanırken bu bağlantı noktasına izin verilmelidir.
  • MS SQL sunucusundaki diğer uygulamaların kullanabileceği bir bağlantı noktası ayarlayamazsınız. Referans olarak http://www.ise.edu/in-notes/iana/questments/port-numbers adresini kullanabilirsiniz (adres SQL Server Books Online'dan alınmıştır).
  • MS SQL Server hizmetinin birden çok örneğini kullanırken, yapılandırma için MS SQL belgelerini okuduğunuzdan emin olun ("Ağ Bağlantılarını Yapılandırma" bölümü).

İkinci olarak, MS SQL sunucusundaki TCP/IP protokol ayarlarında, MS SQL Server hizmetinin bu örneği için yayın isteklerine yanıt verilmesini yasaklayan "Sunucuyu gizle" bayrağını ayarlayabilirsiniz.

Diskte saklanan MS SQL verilerinin şifrelenmesi

Yerel diskte bulunan verileri şifrelemek için oldukça geniş bir yazılım ve donanım yelpazesi vardır (buna standart Windows'un EFS kullanma yeteneği, eToken anahtarlarının kullanımı ve Jetico Bestcrypt veya PGPDisk gibi üçüncü taraf programları dahildir). Bu araçların gerçekleştirdiği ana görevlerden biri, medya kaybı durumunda (örneğin bir sunucunun çalınması) verileri korumaktır. Microsoft'un MS SQL veritabanlarının şifrelenmiş ortamlarda saklanmasını önermediğini özellikle belirtmekte fayda var ve bu oldukça haklı. Bu durumda asıl sorun üretkenlikte önemli bir düşüş ve olası sorunlar başarısızlıklardan kaynaklanan güvenilirlik. Sistem yöneticisinin hayatını zorlaştıran ikinci faktör, MS SQL hizmetinin onlara ilk eriştiği sırada tüm veritabanı dosyalarının kullanılabilirliğini sağlama ihtiyacıdır (yani, şifreli bir ortama bağlanırken etkileşimli eylemlerin hariç tutulması arzu edilir).

Sistem performansında gözle görülür bir düşüşü önlemek için, MS SQL'in çeşitli dosyalarda veritabanları oluşturma yeteneğini kullanabilirsiniz. Elbette bu durumda MS SQL veritabanı, bilgi tabanını oluştururken 1C sunucusu tarafından oluşturulmamalı, ayrı olarak oluşturulmalıdır. Aşağıda yorum içeren bir TSQL betiği örneği verilmiştir:

ana KULLANIM
GİTMEK
-- SomeData veritabanı oluşturun,
VERİTABANI OLUŞTUR
-- verilerinin tamamı PRIMARY dosya grubunda yer alır.
İLKOKULDA
-- Ana veri dosyası şifrelenmiş ortamda bulunur (mantıksal E sürücüsü:)
-- ve başlangıç ​​boyutu 100 MB'tır, otomatik olarak 200 MB'a yükseltilebilir.
-- 20 MB'lık artışlarla
(NAME = BazıVeriler1,
DOSYA ADI = "E:\BazıVeriler1.mdf",
BOYUT = 100MB,
MAKS BOYUT = 200,
DOSYA BÜYÜME = 2),
-- İkinci veri dosyası şifrelenmemiş ortamda (mantıksal C sürücüsü) bulunur
-- ve başlangıç ​​boyutu 100 MB'tır, otomatik olarak sınıra kadar artırılabilir
-- geçerli dosya boyutunun %5'lik artışlarla disk alanı (64 KB'ye yuvarlanır)
(NAME = BazıVeriler2,
DOSYA ADI = "c:\program files\microsoft sql sunucusu\mssql\data\SomeData2.ndf",
BOYUT = 100MB,
MAXBOYUT = SINIRSIZ,
DOSYA BÜYÜMESİ = %5
OTURUM AÇ
-- İşlem günlüğünün bölümlere ayrılması da mümkün olsa da bu yapılmamalıdır,
-- Çünkü bu dosya çok daha sık değişir ve düzenli olarak temizlenir (örneğin,
--veritabanı yedeği oluşturma).
(NAME = Bazı Veri Günlüğü,
DOSYA ADI = "c:\program files\microsoft sql sunucusu\mssql\data\SomeData.ldf",
BOYUT = 10MB,
MAXBOYUT = SINIRSIZ,
DOSYA BÜYÜME = 10)
GİTMEK
-- Veritabanının sahipliğini, adına yetki verilen kullanıcıya derhal vermek daha iyidir.
-- 1C bağlanacaktır. Bunu yapmak için mevcut tabanı bildirmemiz gerekiyor.
- yeni oluşturuldu,
Bazı Verileri KULLANIN
GİTMEK
-- ve sp_changedbowner'ı çalıştırın
EXEC sp_changedbowner @loginame = "SomeData_dbowner"

Veri dosyası boyutunun otomatik olarak büyümesi hakkında kısa bir açıklama. Varsayılan olarak, yeni veritabanlarının dosya boyutları mevcut dosya boyutunun %10'u oranında artırılır. Bu, küçük veritabanları için tamamen kabul edilebilir bir çözümdür, ancak büyük veritabanları için pek iyi değildir: örneğin 20 GB'lık bir veritabanı boyutunda, dosyanın hemen 2 GB artması gerekir. Bu olay çok nadiren meydana gelse de, birkaç on saniye sürebilir (bu süre zarfında diğer tüm işlemler fiilen boştadır), bu da veritabanıyla aktif çalışma sırasında meydana gelirse bazı arızalara neden olabilir. Disk alanı neredeyse tamamen dolduğunda ortaya çıkan orantısal artışın ikinci olumsuz sonucu, yetersiz boş alan nedeniyle erken arıza olasılığıdır. Örneğin, 40 GB kapasiteli bir disk bölümü tamamen bir veritabanına (daha doğrusu bu veritabanının bir dosyasına) ayrılmışsa, o zaman acilen (çok acilen) gerekli olan veritabanı dosyasının kritik boyutu, Kullanıcıların normal çalışmasını kesintiye uğratacak kadar) bilgilerin depolanmasını yeniden düzenlemek için kullanılan veri dosyası boyutu 35 GB'dir. Artış boyutu 10-20 MB olarak ayarlandığında 39 GB'a ulaşana kadar çalışmaya devam edebilirsiniz.

Bu nedenle, yukarıdaki listede veritabanı dosyalarından birinin boyutunda %5'lik artışlarla bir artış belirtilmesine rağmen, büyük veritabanı boyutları için 10-20 MB'lık sabit bir artış ayarlamak daha iyidir. Veritabanı dosya boyutunun büyümesi için artış değerlerini ayarlarken, bir dosya grubundaki dosyalardan biri maksimum boyutuna ulaşana kadar şu kuralın geçerli olduğunu dikkate almak gerekir: bir dosya grubundaki dosyalar aynı anda artırılır hepsinin tamamen dolduğu zaman. Yani yukarıdaki örnekte SomeData1.mdf dosyası maksimum boyutu olan 200 MB'a ulaştığında SomeData2.ndf dosyasının boyutu yaklaşık 1,1 GB olacaktır.

Böyle bir veritabanı oluşturduktan sonra, korumasız dosyaları SomeData2.ndf ve SomeData.ldf bir saldırgan tarafından erişilebilir hale gelse bile, veritabanının gerçek durumunu - verileri (veritabanının mantıksal yapısı hakkındaki bilgiler dahil) geri yüklemek son derece zor olacaktır. ) birkaç dosyaya dağılacak ve anahtar bilgiler (örneğin, bu veritabanını hangi dosyaların oluşturduğu hakkında) şifrelenmiş dosyada olacaktır.

Elbette, veritabanı dosyalarının kriptografik yöntemlerle saklanması kullanılıyorsa, yedekleme (en azından bu dosyaların) şifrelenmemiş ortamda gerçekleştirilmemelidir. Tek tek veritabanı dosyalarını yedeklemek için uygun BACKUP DATABASE komut sözdizimini kullanın. Bir veritabanı yedeklemesini bir parolayla korumak mümkün olsa da ("BACKUP DATABASE" komutunun "PASSWORD = " ve "MEDIAPASSWORD = " seçenekleri), bu tür bir yedeklemenin şifrelenmeyeceğini lütfen unutmayın!

Disklerde saklanan uygulama sunucusu ve istemci verilerinin şifrelenmesi

Çoğu durumda, makul olmayan yüksek maliyetler nedeniyle 1C:Enterprise tarafından kullanılan dosyaların (istemci kısmı ve uygulama sunucusu) şifreli ortamda saklanması haklı görülemez, ancak böyle bir ihtiyaç varsa lütfen uygulama sunucusu ve istemci kısmının uygulamanın çoğu zaman geçici dosyalar oluşturur. Çoğu zaman, bu dosyalar uygulamanın çalışmasını tamamladıktan sonra da kalabilir ve 1C araçlarını kullanarak bunların kaldırılmasını garanti etmek neredeyse imkansızdır. Bu nedenle, geçici dosyalar için kullanılan dizini 1C'de şifrelemek veya bir RAM sürücüsü kullanarak diskte saklamamak gerekli hale gelir (oluşturulan dosyaların boyutu ve 1C: Enterprise'ın RAM gereksinimleri nedeniyle ikinci seçenek her zaman mümkün değildir). uygulamanın kendisi).

Yerleşik 1C araçlarını kullanarak veri şifreleme.

1C'de şifrelemeyi kullanmanın standart yetenekleri, şifreleme parametrelerine sahip Zip dosyalarıyla çalışmak için nesnelerin kullanılmasına bağlıdır. Aşağıdaki şifreleme modları mevcuttur: 128, 192 veya 256 bit anahtarlı AES algoritması ve orijinal olarak Zip arşivleyicisinde kullanılan eski bir algoritma. AES ile şifrelenmiş zip dosyaları birçok arşivleyici (WinRAR, 7zip) tarafından okunamaz. Şifrelenmiş veriler içeren bir dosya oluşturmak için bir parola ve şifreleme algoritması belirtmeniz gerekir. Bu özelliğe dayalı şifreleme-şifre çözme fonksiyonlarının en basit örneği aşağıda verilmiştir:

İşlev EncryptData(Veri, Parola, Şifreleme Yöntemi = Tanımsız) Dışa Aktarma

// Verileri geçici bir dosyaya yazın. Aslında tüm veriler bu şekilde kaydedilemez.
ValueInFile(GeçiciDosyaAdı, Veri);

// Geçici verileri arşive yaz
Zip = Yeni ZipFileRecord(TemporaryArchiveFileName, Şifre, EncryptionMethod);
Zip.Add(GeçiciDosyaAdı);
Zip.Write();

// Alınan arşivdeki verileri oku Veri deposu
EncryptedData = NewValueStorage(NewBinaryData(ArchiveTemporaryFileName));

// Geçici dosyalar - sil

EndFunctions Function DecryptData(EncryptedData, Parola) Dışa Aktarma

// Dikkat! Geçilen parametrelerin doğruluğu izlenmez

// Aktarılan değeri bir dosyaya yazıyoruz
ArchiveTemporaryFileName = GetTemporaryFileName("zip");
BinaryArchiveData = EncryptedData.Get();
BinaryArchiveData.Write(ArchiveTemporaryFileName);

// Yeni yazılan arşivin ilk dosyasını çıkartıyoruz
TemporaryFileName = GetTemporaryFileName();
Zip = Yeni ReadZipFile(GeçiciArchiveFileName, Şifre);
Zip.Extract(Zip.Items, TemporaryFileName, ZIPFilePathRecoveryMode.Do NotRecover);

//Yazılan dosyayı oku
Veri = ValueFromFile(GeçiciDosyaAdı + "\" + Zip.Items.Name);

//Geçici dosyaları sil
SilFiles(GeçiciDosyaAdı);
deleteFiles(ArchiveTemporaryFileName);

Verileri Dönüştür;

Son Fonksiyon

Elbette bu yöntem ideal olarak adlandırılamaz - veriler geçici bir klasöre açık metin olarak yazılır, açıkçası yöntemin performansı her zamankinden daha kötü, veritabanında depolama son derece büyük miktarda alan gerektirir, ancak bu yalnızca platformun yerleşik mekanizmalarına dayanan tek yöntemdir. Ek olarak, diğer birçok yönteme göre bir avantajı vardır; bu yöntem, verileri şifrelemeyle birlikte aynı anda paketler. Şifrelemeyi bu yöntemin dezavantajları olmadan uygulamak istiyorsanız, bunları ya harici bir bileşende uygulamanız ya da örneğin Microsoft CryptoAPI kullanarak COM nesneleri oluşturarak mevcut kitaplıklara yönelmeniz gerekir. Örnek olarak, alınan şifreye göre bir dizeyi şifreleme/şifre çözme fonksiyonlarını vereceğiz.

İşlev EncryptStringDES(ŞifrelenmemişDize, Parola)

CAPICOM_ENCRYPTION_ALGORITHM_DES = 2; // Bu sabit CryptoAPI'dendir


EncryptionMechanism.Content = UnencryptedString;
Şifreleme Motoru.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_DES;
EncryptedString = EncryptionMechanism.Encrypt();

EncryptedString'i döndür;

EndFunction // EncryptStringDES()

Function DecryptStringDES(EncryptedString, Şifre)

//Dikkat! Parametreler kontrol edilmiyor!

Şifreleme Motoru = Yeni COMObject("CAPICOM.EncryptedData");
EncryptionMechanism.SetSecret(Password);
Girişim
EncryptionMechanism.Decrypt(EncryptedString);
İstisna
// Yanlış parola!;
Tanımsız Dönüş;
Deneme Sonu;

ReturnEncryptionMechanism.Content;

EndFunction // DecryptStringDES()

Aktarım sırasında lütfen unutmayın boş değer bu işlevlere bir dize veya parola girilmesi bir hata mesajı oluşturacaktır. Bu şifreleme prosedürü kullanılarak elde edilen dize orijinalinden biraz daha uzundur. Bu şifrelemenin özelliği, bir dizeyi iki kez şifrelerseniz ortaya çıkan dizelerin aynı OLMAYACAĞIDIR.

Kriptografik araçları kullanırken yapılan temel hatalar.

Şifreleme araçlarını kullanırken sıklıkla aynı hatalar yapılır:

Kriptografi kullanırken performans cezasını hafife almak.

Kriptografi oldukça fazla sayıda hesaplama gerektiren bir iştir (özellikle DES, 3DES, GOST, PGP gibi algoritmalar için). Yüksek performanslı ve optimize edilmiş algoritmalar (RC5, RC6, AES) kullanıldığında bile bellekte ve hesaplamalı işlemlerde gereksiz veri aktarımından kaçış yoktur. Bu da birçok sunucu bileşeninin (RAID dizileri, ağ bağdaştırıcıları) yeteneklerini neredeyse geçersiz kılar. Donanım şifrelemesi veya şifreleme anahtarının donanımdan türetilmesi kullanıldığında, olası ek bir performans darboğazı söz konusudur: ek aygıt ile bellek arasındaki veri aktarımının hızı (bu tür aygıtın performansının kritik olmayabileceği durumda). Küçük miktarda verinin (örneğin bir e-posta mesajı) şifrelenmesi kullanıldığında, sistemdeki bilgi işlem yükündeki artış o kadar fark edilmez, ancak her şeyin tamamen şifrelenmesi durumunda bu, sistemin performansını büyük ölçüde etkileyebilir. bir bütün olarak.

Parola ve anahtar seçimine ilişkin modern yeteneklerin küçümsenmesi.

Şu anda teknolojinin imkanları öyledir ki, 40-48 bit uzunluğunda bir anahtar küçük bir kuruluş tarafından, 56-64 bit uzunluğunda bir anahtar ise büyük bir kuruluş tarafından seçilebilir. Onlar. en az 96 veya 128 bitlik anahtar kullanan algoritmalar kullanılmalıdır. Ancak çoğu anahtar, kullanıcı tarafından girilen şifrelere dayalı karma algoritmalar (SHA-1 vb.) kullanılarak oluşturulur. Bu durumda 1024 bit uzunluğunda bir anahtar işe yaramayabilir. İlk olarak, sıklıkla tahmin edilmesi kolay bir şifre kullanılır. Seçimi kolaylaştıran faktörler şunlardır: yalnızca tek bir harf kullanılması; şifrelerde kelimelerin, isimlerin ve ifadelerin kullanımı; bilinen tarihlerin, doğum günlerinin vb. kullanılması; şifreleri oluştururken "kalıplar" kullanmak (örneğin, kuruluş genelinde 3 harf, ardından 2 rakam, ardından 3 harf). İyi bir şifre, büyük harfler, rakamlar ve noktalama işaretlerinden oluşan oldukça rastgele bir diziden oluşmalıdır. Klavyeden girilen 7-8 karakter uzunluğundaki şifreler, bu kurallara uyulsa bile makul bir sürede tahmin edilebilir, dolayısıyla şifrenin en az 11-13 karakter olması daha iyidir. İdeal çözüm, örneğin çeşitli akıllı kartlar vb. kullanarak bir parola kullanarak anahtar oluşturmaktan kaçınmaktır, ancak bu durumda şifreleme anahtarı ortamının kaybına karşı koruma olasılığının sağlanması gerekir.

Anahtarların ve şifrelerin güvenli olmayan şekilde saklanması.

Bu hatanın yaygın örnekleri şunlardır:

  • kullanıcının monitörüne yapıştırılan yapışkan notlara yazılan uzun ve karmaşık şifreler.
  • tüm şifrelerin korunmayan (veya sistemin kendisinden çok daha zayıf korunan) bir dosyada saklanması
  • elektronik anahtarların kamuya açık alanda saklanması.
  • elektronik anahtarların kullanıcılar arasında sık sık aktarılması.

Anahtarı paspasın altındaysa neden zırhlı kapı yapasınız ki?

Başlangıçta şifrelenmiş verilerin güvenli olmayan bir ortama aktarılması.

Bir güvenlik sistemi kurarken işini yaptığından emin olun. Örneğin, başlangıçta şifrelenmiş bir dosyanın, program açık bir biçimde çalışırken, güvenli bir şekilde okunabileceği geçici bir klasöre yerleştirildiği bir durumla (1C ile ilgili olmayan) karşılaştım. Çoğu zaman, şifrelenmiş verilerin net biçimdeki yedek kopyaları bu verilerden "uzak olmayan" bir yerde bulunur.

Kriptografik araçların başka amaçlarla kullanılması

Aktarım halindeki verileri şifreleyerek, verilerin kullanıldığı yerde erişilemez olmasını bekleyemezsiniz. Örneğin, IPSec hizmetleri, uygulama sunucusunun uygulama düzeyinde ağ trafiğini "koklamasını" hiçbir şekilde engellemez.

Bu nedenle, kriptografik sistemleri uygularken hataları önlemek için, sistemi dağıtmadan önce (en azından) aşağıdakileri yapmalısınız.

  • Anlamak:
    • Neyin korunması gerekiyor?
    • Hangi koruma yöntemini kullanmalısınız?
    • Sistemin hangi bölümlerinin güvenliğinin sağlanması gerekiyor?
    • Erişimi kim kontrol edecek?
    • Şifreleme tüm doğru alanlarda çalışacak mı?
  • Bilginin nerede saklanacağını, ağ üzerinden nasıl gönderileceğini ve bilgiye hangi bilgisayarlardan erişileceğini belirleyin. Bu, sistemi uygulamadan önce ağ hızı, kapasitesi ve kullanımı hakkında bilgi sağlayacaktır; bu da performansı optimize etmek için faydalıdır.
  • Sistemin çeşitli saldırı türlerine karşı savunmasızlığını değerlendirin.
  • Bir sistem güvenlik planı geliştirin ve belgeleyin.
  • Sistemi kullanmanın ekonomik verimliliğini (gerekçesini) değerlendirin.

Çözüm

Elbette hızlı bir incelemeyle 1C'de güvenlikle ilgili tüm hususları belirtmek imkansızdır, ancak bazı ön sonuçlar çıkarmamıza izin verin. Elbette bu platform ideal olarak adlandırılamaz - diğerleri gibi onun da güvenli bir sistemi organize etme konusunda kendi sorunları vardır. Ancak bu hiçbir şekilde bu sorunların aşılamayacağı anlamına gelmez; tam tersine sistemin doğru geliştirilmesi, uygulanması ve kullanılmasıyla neredeyse tüm eksikliklerin giderilebileceği anlamına gelir. Sorunların çoğu, belirli bir uygulama çözümünün ve uygulama ortamının yetersiz geliştirilmesinden kaynaklanmaktadır. Örneğin, önemli değişiklikler yapılmayan standart çözümler, yeterince güvenli bir sistemin oluşturulması anlamına gelmez.

Bu makale, herhangi bir güvenlik önlemi dizisinin uygulamanın tüm aşamalarını kapsaması gerektiğini bir kez daha göstermektedir: geliştirme, dağıtım, sistem yönetimi ve tabii ki organizasyonel önlemler. Bilgi sistemlerinde temel güvenlik tehdidi “insan faktörüdür” (kullanıcılar dahil). Bu önlemler dizisi makul ve dengeli olmalıdır: mantıklı değildir ve verinin maliyetini aşan korumayı organize etmek için yeterli fonun tahsis edilmesi pek olası değildir.

Şirket alıcılar, geliştiriciler, bayiler ve bağlı ortaklar için benzersiz bir hizmettir. Buna ek olarak, müşterilere geniş bir ürün yelpazesi, birçok ödeme yöntemi, hızlı (genellikle anında) sipariş işleme ve kişisel bir bölümde sipariş sürecini takip etme olanağı sunan Rusya, Ukrayna ve Kazakistan'daki en iyi çevrimiçi yazılım mağazalarından biridir. .