entziehen sie eine zeichenfolge in sql server, damit die verwendung in like-ausdrücken sicher ist
<p>wie kann ich eine zeichenfolge in der gespeicherten prozedur von sql server maskieren, damit sie sicher im ausdruck <code>like</code> verwendet werden kann?.</p><p>angenommen, ich habe eine <code>nvarchar</code> -variable wie folgt:</p><pre><code>declare @mystring nvarchar(100); </code></pre><p>und ich möchte es in einem <code>like</code> ausdruck verwenden:</p><pre><code>... where ... like '%' + @mystring + '%'; </code></pre><p>wie kann ich die zeichenfolge umgehen (genauer gesagt, zeichen, die für die <code>like</code> mustererkennung von bedeutung sind, z. b. <code>%</code> oder <code>?</code>) in t-sql, damit die verwendung auf diese weise sicher ist?</p><p>zum beispiel gegeben:</p><pre><code>@mystring = 'aa%bb' </code></pre><p>ich möchte:</p><pre><code>where ... like '%' + @somehowescapedmystring + '%' </code></pre><p>passen <code>'aa%bb'</code>, <code>'caa%bbc'</code> aber nicht <code>'aaxbb'</code> oder <code>'caaxbb'</code>.</p>
<p>um sonderzeichen in einem like-ausdruck zu maskieren, wird ihnen ein escape-zeichen vorangestellt. sie können auswählen, welches escapezeichen mit dem escape-schlüsselwort verwendet werden soll. ( <a href="http://msdn.microsoft.com/en-us/library/ms179859.aspx">msdn ref</a> )</p><p>dies maskiert beispielsweise das% -symbol mit\als escapezeichen:</p><pre><code>select * from table where myfield like '%15\% off%' escape '\' </code></pre><p>wenn sie nicht wissen, welche zeichen in ihrer zeichenfolge enthalten sein werden, und sie sie nicht als platzhalter behandeln möchten, können sie allen platzhalterzeichen ein escapezeichen voranstellen, z.</p><pre><code>set @mystring = replace( replace( replace( replace( @mystring , '\', '\\' ) , '%', '\%' ) , '\_', '\\_' ) , '[', '\[' ) </code></pre><p>(beachten sie, dass sie auch ihrem escape-zeichen entkommen müssen und sicherstellen müssen, dass dies das innere <code>replace</code> ist, damit sie nicht den anweisungen entgehen, die aus den anderen <code>replace</code> -anweisungen hinzugefügt wurden.) dann können sie so etwas verwenden:</p><pre><code>select * from table where myfield like '%' + @mystring + '%' escape '\' </code></pre><p>denken sie auch daran, mehr platz für ihre @ mystring-variable zu reservieren, da diese mit dem ersetzen der zeichenfolge länger wird.</p>
<p>sie können das meiste davon tun, indem sie eine login.sql verwenden. login.sql wird während der - überraschenden - anmeldung ausgeführt und aus ihrem sqlpath oder dem aktuellen verzeichnis geladen. für die beispiele, die sie gegeben haben, haben sie wirklich den schlimmsten fall gewählt.</p><p>problem ist der sqlterminator. was auch immer sie dort eingeben, der schrägstrich wird als kostenloser sql-minator beibehalten. daneben sucht sqlplus zuerst nach dem sqlterminator und führt dies vor dem scannen zum string-terminator durch. ein fehler, wenn sie mich fragen. der schrägstrich kann in einer zeichenfolge verwendet werden, solange er nicht allein in einer separaten zeile steht. sobald sqlplus das als sqlterminator angegebene zeichen findet, ignoriert es alles andere und hört auf zu lesen.</p><p>der schrägstrich kann behandelt werden, solange er nicht alleine in einer zeile steht.</p><p>login.sql enthält:</p><pre><code>prompt run login.sql show sqlterminator show sqlblanklines set sqlblanklines on set sqlterminator ';' show sqlterminator show sqlblanklines prompt ready login.sql set echo on </code></pre><p>leigh.sql enthält:</p><pre><code>insert into t1 values ('fail bc semicolon a;a / '); insert into t1 values ('fail bc solo / aa / '); insert into t1 values ('ok / not solo aa /a '); delete from t1 where a = 'c a/ '; </code></pre><p>führen sie das skript aus:</p><pre><code>sqlplus leigh/leigh@orcl @leigh sql*plus: release 10.2.0.4.0 - production on thu aug 9 22:36:20 2012 copyright (c) 1982, 2007, oracle. all rights reserved. connected to: oracle database 11g enterprise edition release 11.2.0.3.0 - 64bit production with the partitioning, real application clusters, automatic storage management, olap, data mining and real application testing options run login.sql sqlterminator ";" (hex 3b) sqlblanklines off sqlterminator ";" (hex 3b) sqlblanklines on ready login.sql sql&gt; insert into t1 values ('fail bc semicolon 2 a;a 3 / error: ora-01756: quoted string not properly terminated sql&gt; '); sp2-0042: unknown command "')" - rest of line ignored. sql&gt; sql&gt; insert into t1 values ('fail bc solo / 2 3 4 aa 5 / error: ora-01756: quoted string not properly terminated sql&gt; '); sp2-0042: unknown command "')" - rest of line ignored. sql&gt; sql&gt; insert into t1 values ('ok / not solo 2 3 4 aa 5 /a 6 '); 1 row created. sql&gt; sql&gt; delete from t1 where a = 'c 2 3 4 a/ 5 '; 0 rows deleted. </code></pre><p>sie müssen nicht mit start-/endblöcken herumspielen. der befehl sqlterminator innerhalb des befehls kann nicht verarbeitet werden, unabhängig davon, wo er sich in einer zeichenfolge befindet oder nicht. er kann keine zeilen mit schrägstrich allein in einer zeile in einer zeichenfolge verarbeiten.</p> <p>hinweis: ab azure sql database v12 gelten diese einschränkungen nicht mehr.</p><p>das ist kein "primärindex". es gibt so etwas wie einen "primärschlüssel" und es gibt auch so etwas wie einen "clustered index". unterschiedliche konzepte, oft verwirrt. lassen sie uns angesichts dieser unterscheidung die frage noch einmal betrachten:</p><p>q1) kann der clustered-index in einer sql azure-tabelle geändert werden?<br> a: ja. verwenden sie <code>with (drop\_existing=on)</code>:</p><pre><code>create table friend ( userid int not null, id int not null); go create clustered index cdxfriend on friend (userid, id); go create clustered index cdxfriend on friend (id, userid) with (drop\_existing=on); go </code></pre><p>f2) kann der clustered-index einer tabelle mit einer primärschlüsseleinschränkung geändert werden?<br> a: ja, wie oben, solange die primärschlüsseleinschränkung nicht über den clustered-index erzwungen wird:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key nonclustered (id)); create clustered index cdxfriend on friend (userid, id); go create clustered index cdxfriend on friend (id, userid) with (drop\_existing=on); go </code></pre><p>f3) kann die primärschlüsseleinschränkung einer tabelle geändert werden?<br> a: ja, solange die primäre einschränkung nicht über den clustered-index erzwungen wird:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key nonclustered (id)); go create clustered index cdxfriend on friend (userid, id); go alter table friend drop constraint pk\_friend; alter table friend add constraint pk\_friend primary key nonclustered (userid) go </code></pre><p>f4) kann der primärschlüssel einer tabelle geändert werden, wenn er über den clustered-index erzwungen wird?<br> a: ja, wenn die tabelle nie zeilen hatte:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go alter table friend drop constraint pk\_friend; alter table friend add constraint pk\_friend primary key clustered (id, userid) go </code></pre><p>f5) kann der primärschlüssel einer tabelle geändert werden, wenn er über den clustered-index erzwungen wird, wenn die tabelle gefüllt ist?<br> a: nein. jede operation, die einen aufgefüllten clustered-index in einen heap konvertiert, wird in sql azure blockiert <em>, auch wenn die tabelle leer ist </em>:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go insert into friend (userid) values (1); delete from friend; go alter table friend drop constraint pk\_friend; </code></pre><p>als randnotiz: die einschränkung kann geändert werden, wenn die tabelle <em> abgeschnitten ist </em>.</p><p>die problemumgehung zum ändern der pk-einschränkung einer aufgefüllten tabelle besteht darin, das gute alte <a href="http://msdn.microsoft.com/en-us/library/ms188351.aspx"><code>sp\_rename</code></a> trick:</p><pre><code>create table friend ( userid int not null, id int not null identity(1,1), constraint pk\_friend primary key clustered (userid, id)); go insert into friend (userid) values (1); go create table friendnew ( userid int not null, id int not null identity(1,1), constraint pk\_friend\_new primary key clustered (id, userid)); go set identity\_insert friendnew on; insert into friendnew (userid, id) select userid, id from friend; set identity\_insert friendnew off; go begin transaction exec sp\_rename 'friend', 'friendold'; exec sp\_rename 'friendnew', 'friend'; commit; go sp\_help 'friend'; </code></pre><p>das <code>sp\_rename</code> ansatz hat einige probleme, vor allem, dass berechtigungen für die tabelle während des umbenennens nicht übertragen werden, sowie fremdschlüsseleinschränkungen.</p> <p>erwägen sie die verwendung eines <strong> mehrfachauswahl-designs mit token </strong>. die filter-as-you-type-funktion ist nett, aber nicht unbedingt erforderlich. diese funktionieren gut, wenn im allgemeinen anwendungsfall entweder einer oder nur wenige ausgewählt werden. die benutzerfreundlichkeit nimmt jedoch schnell ab, wenn sie viele auswählen müssen, da der benutzer das menü für jedes element erneut aufrufen muss.</p><p><img src="https://i.stack.imgur.com/fth7o.png" alt="multi-select with tokens, via harvesthq.github.com/chosen"></p><ul> <li> <a href="http://harvesthq.github.com/chosen/">http://harvesthq.github.com/chosen/</a> </li> <li> <a href="http://designingwebinterfaces.com/the-multi-select-solution">http://designingwebinterfaces.com/the-multi-select-solution</a> </li> <li> <a href="http://loopj.com/jquery-tokeninput/">http://loopj.com/jquery-tokeninput/</a> </li> </ul><p>sie haben die tokenisierte mehrfacheingabemethode bereits in ihren e-mail-clients gesehen. <img src="https://i.stack.imgur.com/h1aid.png" alt="multi-select-tokens in email"></p><p>wenn häufig mehrere ausgewählt werden, können sie ein kontrollkästchenmenü <strong> </strong> in betracht ziehen. der unterschied besteht darin, dass das dropdown-menü über alle klicks hinweg dauerhaft bleibt (und die mehrfachauswahl visuell kommuniziert). daher kann der benutzer mit klick-klick-klick schnell mehrere elemente auswählen. für unsere web-app möchten wir dieses design durch hinzufügen der token-funktionalität verbessern.</p><p><img src="https://i.stack.imgur.com/zqizh.png" alt="checkbox menu, via realestate.com.au"></p><ul> <li> <a href="http://www.realestate.com.au/">http://www.realestate.com.au/</a> </li> <li> <a href="http://blogfreakz.com/jquery/jquery-dropdown-check-list/">http://blogfreakz.com/jquery/jquery-dropdown-check-list/</a> </li> </ul> <p>dies kann eine paginierung sein oder auch nicht, aber hier ist, wie ich paginierung in meiner web-app mache:</p><pre><code>|&lt; first, &lt;&lt; previous, page [5] of 12, next &gt;&gt;, last &gt;| </code></pre><p>die äußeren vier optionen sind links, während die <code>page [5] of 12</code> ist ein formular mit dem [5] als eingabefeld. für benutzer mit aktiviertem javascript verstecke ich die schaltfläche "senden" und sende das formular beim ereignis "unfokus" oder drücke den tastendruck. der benutzer hat die option, wie viele zeilen er anzeigen möchte, die er aus einem dropdown-menü auswählen kann: 10, 20, 50, 100, alle. zusätzlich zur paginierung biete ich auch das sortieren und filtern der ergebnisse an, obwohl dies möglicherweise nicht in jeder situation sinnvoll ist.</p><p><strong>bearbeiten</strong>:</p><p>hier ist ein ausschnitt aus einem modell unserer web-app, um ihnen eine bessere vorstellung zu geben. in dieser version wurden die wörter in den schaltflächen weggelassen, werden jedoch nach einer leichten verzögerung als tooltip beim hover angezeigt. möglicherweise stellen sie jedoch fest, dass das beibehalten der wörter zu einer höheren benutzerfreundlichkeit führt.</p><p><img src="https://i.stack.imgur.com/vzbu0.png" alt="virtuosi media&#39;s pagination example"></p><p>ein paar andere dinge, auf die sie hinweisen sollten:</p><ul> <li>die schaltflächen "erste" und "vorherige" wurden deaktiviert, da es sich um die erste seite handelt.</li> <li>das blau zeigt aktive schaltflächen an (ich muss dieses spezielle thema durch eine farbprüfung ausführen, um sicherzustellen, dass farbenblinde benutzer einen unterschied feststellen können).</li> <li>die tasten bleiben immer erhalten, auch wenn sie deaktiviert sind. dies gibt der schnittstelle konsistenz.</li> <li>aufgrund der skalierung habe ich ein eingabefeld anstelle eines dropdown-auswahlfelds ausgewählt. wenn sie 3000 seiten haben, möchten sie nicht nach unten scrollen, um eine seite zu finden</li> <li>die paginierung ist in einer singulären visuellen komponente gruppiert, um ähnlichkeit im zweck anzuzeigen.</li> </ul> <blockquote> <p>angenommen, der server soll daten mit dem privaten schlüssel verschlüsseln und mit dem öffentlichen schlüssel entschlüsseln, um daten zu verteilen, von denen überprüft werden kann, dass sie vom richtigen server stammen.</p> </blockquote><p>sie können dies tun - auf eine sehr vereinfachte ebene funktioniert die rsa-signatur (anmerkung, vereinfacht - es steckt noch ein bisschen mehr dahinter).</p><blockquote> <p>kann ich den privaten schlüssel einfach veröffentlichen und den öffentlichen schlüssel geheim halten, anstatt den code zu ändern, um dies zu ermöglichen? beeinträchtigt dies die sicherheit des systems?</p> </blockquote><p>sie <strong> müssen den privaten schlüssel überhaupt nicht </strong> veröffentlichen - rsa ist eine trapdoor-permutation, was bedeutet:</p><ul> <li>wenn sie mit einem öffentlichen schlüssel verschlüsseln, können sie mit dem privaten schlüssel entschlüsseln.</li> <li>wenn sie mit einem privaten schlüssel verschlüsseln, können sie mit einem öffentlichen schlüssel entschlüsseln.</li> </ul><p>daher unterstützt rsa sowohl das signieren als auch das verschlüsseln, wobei der endbenutzer nur über den öffentlichen schlüssel verfügt.</p><p>wenn der client in ihrem fall überprüfen möchte, ob daten vom server stammen, wenden sie den zweiten fall von rsa an und entschlüsseln die signaturdaten mit dem bereits vorhandenen öffentlichen schlüssel.</p><p>da es sich um eine permutation handelt, sollten sie ihren code außerdem überhaupt nicht ändern müssen. beide tasten sollten mit derselben funktion arbeiten. ich würde erwarten, dass jede anständige kryptobibliothek apis zur überprüfung von signaturen gemäß den unterschiedlichen standards hat - eine davon wäre wahrscheinlich eine gute wahl.</p><p>rsa labs bieten ein nice <a href="https://web.archive.org/web/20130718172549/https://www.rsa.com/rsalabs/node.asp?id=2182">erklärung hierfür</a> .</p><p>wenn sie dies zwischen servern erweitern oder die clientkommunikation überprüfen möchten, generieren sie schlüssel für jede entität und tauschen sie die öffentlichen aus. das verfahren kann dann an beiden enden angewendet werden.</p><p>theoretisch sind e und d austauschbar (weshalb rsa funktioniert) (man muss als geheim bezeichnet und geheim gehalten werden), aber p und q müssen <strong> immer </strong> sein geheim gehalten, da diese es ihnen ermöglichen, d von e abzuleiten und umgekehrt. sie müssen jedoch beim verständnis des privaten schlüssels äußerst vorsichtig sein - speichert ihre software p/q im privaten schlüssel? wenn ja, können sie es nicht so veröffentlichen, wie es ist. auch wenn ich austauschbar sage - sobald sie eines dieser paare (e oder d zusammen mit ihrem modul n) veröffentlicht haben, müssen sie das andere <em> mit ihrem leben</em> schützen. praktisch gesehen <a href="https://stackoverflow.com/questions/696472/given-a-private-key-is-it-possible-to-derive-its-public-key">wie graeme in den kommentaren verlinkt</a> e wird oft als kleiner/fester wert gewählt. mein kommentar, dass e/d austauschbar ist, trifft eindeutig nicht zu, wenn e leicht zu bestimmen ist. wenn sie so etwas tun, kann dies zu verwirrung und fehlimplementierung führen. verwenden sie eine bibliothek eines drittanbieters/veröffentlichen sie keine privaten schlüssel.</p> Netzfund:  
Da es hier nun mal so viele Probleme mit der Rechtschreibung gibt, plädiere ich dafür, die Dinge etwas zu vereinfachen, damit auch Benutzer, die des Lesens und Schreibens


nicht so ganz mächtig sind (und derer gibt es im Internet erschreckend viele), am Gedankenaustausch teilhaben können.


Erster Schritt: Wegfall der Großschreibung.


einer sofortigen einführung steht nichts im weg, zumal schon viele grafiker und werbeleute zur kleinschreibung übergegangen sind.


zweiter schritt: wegfall der dehnungen und schärfungen.


dise masname eliminirt schon di gröste felerursache in der grundschule, den sin oder unsin unserer konsonantenverdoplung hat onehin nimand kapirt.


driter schrit: v und ph ersezt durch f, z und sch ersezt durch s.


das alfabet wird um swei buchstaben redusirt, sreibmasinen und setsmasinen fereinfachen sich, wertfole arbeitskräfte könen der wirtsaft sugefürt werden.


firter srit: q, c und ch ersetst durch k, j und y ersetst durch i, pf ersetst durch f.


nun sind son seks bukstaben ausgesaltet, di sulseit kan sofort von ein auf swei iare ferkürtst werden, anstat aktsig prosent rektsreibunterikt könen nüslikere fäker wi fisik, kemi, reknen mer


geflegt werden.


fünfter srit: wegfal fon ä, ö und ü seiken.


ales uberflusige ist iest ausgemertst, di ortografi wider slikt und einfak, naturlik benotigt es einige seit, bis dise fereinfakung uberal riktik ferdaut ist, fileikt sasungsweise ein bis swei iare. anslisend durfte als nakstes sil di fereinfakung der nok swirigeren und unsinigeren gramatik anfisirt werden. du musst zum beispiel @lisa petersen eingeben 
und dann machst du petersen einfach weg und 
lisa bleibt dann aber trotzdem blau angestrichen :) weiß nicht, obs klappt, Diagramme sind auch meine Stärke nicht, im Kopf schon gleich gar nicht, aber versuch doch mal, die x-Achse manuell fallend festzulegen, also nicht von zB min 0..max100, sondern von 100..0


Oder Du manipulierst die Werte: in A11: =max($A10:$E10)-A10, rüberziehen.  

(oder =100-A10). Wäre **alternativ** auch für y denkbar (nicht beides gleichzeitig!).
Auch -A10 könnte gehen, wenn Dich das negative Vorzeichen nicht stört. 


Dabei kannst Du vor E:E immer wieder eine Spalte einsetzen. das Diagramm übernimmt das aber nur vielleicht, wenn Du schreibst **"='Tabelle1'!$A$10:$E$10"** . Alle anderen Bezüge entsprechend. Unterschreib so wie du auch normal schreibst - bei mir ist das z.B. eine mischung aus schreib- und druckschrift. nur wenn es explizit angegegben ist in Druckschrift zu schreiben musst du das auch tun.


LG lena <p>es ist keine schwäche für einen kurzen oder langen öffentlichen exponenten für rsa bekannt, solange der öffentliche exponent "korrekt" ist (dh relativ prim zu <em> p-1</em> für alle primzahlen <em> p </em> welche den modul teilen).</p><p><em> if</em> sie verwenden einen kleinen exponenten <em> und</em> sie verwenden kein padding für die verschlüsselung <em> und</em> sie verschlüsseln genau dieselbe nachricht mit bei mehreren unterschiedlichen öffentlichen schlüsseln ist ihre nachricht gefährdet: if <em> e = 3</em> und sie verschlüsseln die nachricht <em> m</em> mit öffentlichen schlüsseln <em> n<sub>1</sub></em>, <em> n<sub>2</sub></em> und <em> n<sub>3</sub></em>, dann hast du <em> c<sub>ich</sub> = m<sup>3</sup></em> mod <em> n<sub>ich</sub></em> für <em> i = 1</em> bis <em> 3</em>. mit dem <a href="http://en.wikipedia.org/wiki/chinese\_remainder\_theorem">chinesischer restsatz</a> können sie dann <em> m<sup>3</sup></em> mod <em> n<sub>1</sub>n<sub>2</sub>n<sub>3</sub></em>, was sich als <em> m herausstellt<sup>3</sup></em> (ohne modulo) weil <em> n<sub>1</sub>n<sub>2</sub>n<sub>3</sub></em> ist eine größere ganze zahl. eine (nicht modulare) kubikwurzelextraktion reicht dann aus, um <em> m</em> zu extrahieren.</p><p>die schwäche ist hier <strong> nicht </strong> der kleine exponent; vielmehr ist es die verwendung einer falschen auffüllung (nämlich überhaupt keine auffüllung) für die verschlüsselung. das auffüllen ist für die sicherheit von rsa sehr wichtig, egal ob verschlüsselung oder signatur. wenn sie keine ordnungsgemäße polsterung verwenden (wie die in <a href="http://www.rsa.com/rsalabs/node.asp?id=2125">pkcs # 1</a> beschriebenen), haben sie viele schwächen, und die im obigen absatz beschriebene ist bei weitem nicht die größte. wenn sich jemand jedoch auf eine schwäche im zusammenhang mit der exponentengröße bezieht, bezieht er sich mehr oder weniger direkt auf dieses ereignis. das ist ein bisschen alte und falsche überlieferung, die manchmal in ein verbot gegen <em> groß</em> exponenten umgewandelt wird (da es sich um einen mythos handelt, ist der umgekehrte mythos auch ein mythos und nicht mehr - und nein weniger begründet); ich glaube, das beobachten sie hier.</p><p>es gibt jedoch einige gründe, warum ein großer öffentlicher exponent vermieden werden sollte:</p><ul> <li> <p>kleine öffentliche exponenten fördern die effizienz (für public-key-operationen).</p> </li> <li> <p>es gibt sicherheitsprobleme, wenn ein kleiner exponent <em> privat</em> vorhanden ist. ein schlüsselwiederherstellungsangriff wurde beschrieben, wenn die länge des privaten exponenten nicht mehr als 29% der länge des öffentlichen exponenten beträgt. wenn sie erzwingen möchten, dass der private exponent kurz ist (z. b. um operationen mit privaten schlüsseln zu beschleunigen), müssen sie mehr oder weniger einen großen öffentlichen exponenten verwenden (so groß wie der modul). die forderung, dass der öffentliche exponent kurz sein muss, kann dann als eine art indirekte gegenmaßnahme angesehen werden.</p> </li> <li> <p>einige weit verbreitete rsa-implementierungen drosseln große öffentliche rsa-exponenten. z.b. der rsa-code in windows (cryptoapi, von internet explorer für https verwendet) besteht darauf, den öffentlichen exponenten in einem einzelnen 32-bit-wort zu codieren. es kann keinen öffentlichen schlüssel mit einem größeren öffentlichen exponenten verarbeiten.</p> </li> </ul><p>dennoch sieht "risiken können groß sein" wie die allgemeine rechtfertigung aus ("dies ist ein sicherheitsproblem" ist die übliche art zu sagen "wir haben es nicht implementiert, aber wir wollen keine art von faulheit zugeben").</p>