home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 May / PCWorld_2005-05_cd.bin / novinky / Interval / clanek07.htm < prev    next >
Encoding:
Extensible Markup Language  |  2005-04-02  |  26.0 KB  |  353 lines

  1. <?xml version='1.0' encoding='windows-1250'?>
  2. <!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
  3. <html xmlns='http://www.w3.org/1999/xhtml' xml:lang='cs' lang='cs'>
  4. <head>
  5. <meta http-equiv='Content-Type' content='text/html; charset=windows-1250' />
  6. <meta http-equiv='Content-language' content='cs' />
  7. <meta http-equiv='Cache-control' content='no-cache' />
  8. <meta http-equiv='Pragma' content='no-cache' />
  9. <meta http-equiv='Expires' content='-1' />
  10. <meta name='robots' content='index,follow' />
  11. <meta name='googlebot' content='index,follow,snippet,noarchive' />
  12. <meta name='description' content='Interval.cz - Internetov² magazφn o webdesignu, v²voji webov²ch aplikacφ a e-komerci. VÜe podstatnΘ o technologiφch XHTML, HTML, CSS, DHTML, JavaScript, XML, .NET, ASP, PHP, Java, J2ME, SQL, WAP...' />
  13. <meta name='keywords' content='Interval' />
  14. <meta name='ICBM' content='49.1915, 16.626' />
  15. <meta name='DC.Title' content='Interval.cz' />
  16. <meta name='DC.Identifier' content='http://interval.cz' />
  17. <meta name='DC.Language' content='cs' />
  18. <meta http-equiv='pics-label' content='(pics-1.1 "http://www.icra.org/ratingsv02.html" comment "ICRAonline EN v2.0" l gen true for "http://interval.cz" r (nz 1 vz 1 lz 1 oz 1 cz 1) "http://www.rsac.org/ratingsv01.html" l gen true for "http://interval.cz" r (n 0 s 0 v 0 l 0))' />
  19. <meta http-equiv='imagetoolbar' content='no' />
  20. <meta http-equiv='MSThemeCompatible' content='no' />
  21. <meta name='MSSmartTagsPreventParsing' content='true' />
  22. <link rel='shortcut icon' type='image/x-icon' href='favicon.ico' />
  23. <link rel='alternate' type='application/rss+xml' title='RSS Interval.cz' href='http://interval.cz/__rss/rss.asp' />
  24. <link rel='home' href='http://interval.cz' />
  25. <link rel='search' href='http://interval.cz/search_ex.asp' />
  26. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/html4.css' />
  27. <link rel='stylesheet' type='text/css' media='all' href='__services/styles/interval-display.css' />
  28. <link rel='stylesheet' type='text/css' media='print' href='__services/styles/interval-print.css' />
  29. <title>Ovlßdacφ prvok CAPTCHA v ASP.NET -- .NET -- V²voj aplikacφ -- Interval.cz</title>
  30. </head>
  31. <body class='interval interval-articles'>
  32. <div id='page-header'><div id='interval-logo'><h1 title='Interval.cz - denn∞ o tvorb∞ webu a e-komerci (logo & index link)'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Interval.cz<span></span></a></h1></div><div id='advertising-page-header'></div><div class='page-maker'> </div></div>
  33. <div id='page-topmenu'><h2 class='textversion'>Navigace</h2><div id='page-mainmenu'><h3 class='textversion'>Hlavnφ menu</h3><ul><li class='first selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz'>Titulnφ strana</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=14'>Webdesign</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=15'>V²voj aplikacφ</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=18'>E-komerce</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=17'>Nßstroje</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz?idcategory=16'>Magazφn</a></li><li class='right selected'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.inshop.cz'>Knihkupectvφ</a></li><li class='right'><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interforum.interval.cz'>Interforum</a></li></ul></div><div id='page-mainmenu-maker'> </div></div>
  34. <div id='page-body'><div id='page-left'><div id='article'>
  35.  
  36.  
  37. <h2>Ovlßdacφ prvok CAPTCHA v ASP.NET</h2>
  38. <p id='prepend'>SystΘmy CAPTCHA zis¥uj·, s k²m aplikßcia komunikuje, respektφve zabezpeΦuj·, ₧e aplikßcia nekomunikuje so "strojom", ale so skutoΦn²m Φlovekom. Vo webov²ch aplikßcißch sa CAPTCHA najΦastejÜie vyu₧φva pri prihlasovanφ sa do aplikßcie Φφm sa zaruΦuje, ₧e do aplikßcie sa prihlasuje skutoΦn² Φlovek a nie automat, robot. V tomto Φlßnku si priblφ₧ime princφpy CAPTCHA a vytvorφme si ASP.NET ovlßdacφ prvok, ktor² sa dß bez problΘmov pou₧i¥ v ╛ubovo╛nej webovej aplikßcii.</p>
  39.  
  40. <p>CAPTCHA (<em>Completely Automated Public Turing test to tell Computers and Humans Apart</em>) by sa dalo vo╛ne prelo₧i¥ ako "automatick² sp⌠sob ako rozlφÜi¥ stroj od Φloveka". Viac informßciφ nßjdete naprφklad na strßnkach <a href='http://www.captcha.net'>The CAPTCHA Project</a>.</p>
  41.  
  42. <h3>Ako funguje CAPTCHA</h3>
  43. <p>Preto₧e poΦφtaΦe nedokß₧u (aspo≥ nie dostatoΦne spo╛ahlivo) "rozumie¥" obrßzkom, je systΘm CAPTCHA zalo₧en² na obrßzkoch najrozÜφrenejÜφm z t²chto systΘmov. Princφp je jednoduch² - aplikßcia vygeneruje obrßzok, na ktorom je k≤d (text, Φφslo, grafick² objekt, fotografia), ktor² je ╛ahko porozumite╛n² pre Φloveka, ale ¥a₧ko pre poΦφtaΦ. U₧φvate╛ musφ k≤d z obrßzka zada¥ do textovΘho po╛a. Aplikßcia si k≤d na vstupe porovnß s t²m, ktor² vygenerovala do obrßzka. Ak s· k≤dy zhodnΘ, tak je vysoko pravdepodobnΘ, ₧e s aplikßciou komunikuje Φlovek.</p>
  44. <p>Pou₧itie systΘmu CAPTCHA pri prihlasovanφ sa do aplikßcie mß aj ∩alÜφ ve╛mi d⌠le₧it² "ved╛ajÜφ efekt" - zabra≥uje hßdaniu hesiel hrubou silou. ┌tok normßlne funguje tak, ₧e nejak² automat (program, robot) sk·Üa za sebou vÜetky kombinßcie znakov ako heslo a sk⌠r Φi nesk⌠r heslo do systΘmu musφ zφska¥. Pri zabezpeΦenφ prihlasovania CAPTCHA systΘmom ale aplikßcia vygeneruje pri ka₧dom pokuse o prihlßsenie nov² obrßzok s k≤dom. Najprv sa skontroluje sprßvnos¥ CAPTCHA k≤du, ak je nesprßvny, pokus o prihlßsenie sa konΦφ ne·spechom a teda eÜte sk⌠r, ako sa v⌠bec kontroluje sprßvnos¥ zadanΘho hesla. Z bezpeΦnostnΘho hladiska musφ v₧dy plati¥, ₧e po ka₧dom (sprßvnom aj nesprßvnom) pokuse o prihlßsenie sa musφ vygenerova¥ nov² CAPTCHA k≤d.</p>
  45.  
  46. <div class='image'>
  47. <img src='podklady/hlavaty/1134/gmail.png' title='CAPTCHA na Gmaile' alt='CAPTCHA na Gmaile' />
  48. <br /><span class='comment'>Aj Gmail sa proti hßdaniu hesiel hrubou silou brßni systΘmom CAPTCHA</span>
  49. </div>
  50.  
  51. <p>V jednom z predoÜl²ch Φlßnkov som vßm ukßzal, ako Φo najefektφvnejÜie generova¥ obrßzky na strane servra. Prφklad vÜak nemal ve╛kΘ vyu₧itie v praxi. Teraz si tento prφklad rozÜφrime a vytvorφme ovlßdacφ prvok CAPTCHA, ktor² nßjde vyu₧itie prakticky v ka₧dej webovej aplikßcii.</p>
  52.  
  53. <h3>Http handler na generovanie obrßzka</h3>
  54. <p>Zdrojov² k≤d http handlera, ktor² bude generova¥ obrßzok s CAPTCHA k≤dom, je prakticky rovnak² ako v Φlßnku <a href='http://interval.cz/clanek.asp?article=3678' title='Hlavat², DuÜan: DynamickΘ obrßzky v ASP.NET cez HTTP handler'>DynamickΘ obrßzky v ASP.NET cez HTTP handler</a>. V met≤de <code>ProcessRequest(HttpContext context)</code> vÜak upravφme Φas¥, v ktorej vykres╛ujeme samotn² text. Ten zobrazφme nßhodne zdeformovan², aby bol horÜie Φitate╛n²m pre poΦφtaΦ:</p>
  55.  
  56. <div class='sample'>
  57. ...
  58. <br /><span class='comment'>// Nastavime format textu</span>
  59. <br />StringFormat format = new StringFormat();
  60. <br />format.Alignment = StringAlignment.Center;
  61. <br />format.LineAlignment = StringAlignment.Center;
  62. <br />
  63. <br /><span class='comment'>// Vytvorime cestu a nahodne ju 'pokrutime'</span>
  64. <br />GraphicsPath path = new GraphicsPath();
  65. <br />path.AddString(textToDisplay, this.UsedFont.FontFamily, (int) this.UsedFont.Style, this.UsedFont.Size, this.UsedRectangle, format);
  66. <br />float v = 4F;
  67. <br />PointF[] points =
  68. <br />{
  69. <br />    new PointF(this.random.Next(this.UsedRectangle.Width) / v, this.random.Next(this.UsedRectangle.Height) / v),<br />
  70. <br />    new PointF(this.UsedRectangle.Width - this.random.Next(this.UsedRectangle.Width) / v, this.random.Next(this.UsedRectangle.Height) / v),<br />
  71. <br />    new PointF(this.random.Next(this.UsedRectangle.Width) / v, this.UsedRectangle.Height - this.random.Next(this.UsedRectangle.Height) / v),<br />
  72. <br />    new PointF(this.UsedRectangle.Width - this.random.Next(this.UsedRectangle.Width) / v, this.UsedRectangle.Height - this.random.Next(this.UsedRectangle.Height) / v)<br />
  73. <br />};
  74. <br />Matrix matrix = new Matrix();
  75. <br />path.Warp(points, this.UsedRectangle, matrix, WarpMode.Perspective, 0F);
  76. <br />
  77. <br /><span class='comment'>// Vykreslime text</span>
  78. <br />Brush hatchBrush = new HatchBrush(HatchStyle.LargeConfetti, Color.LightGray, Color.DarkGray);
  79. <br />g.FillPath(hatchBrush, path);
  80. <br />...
  81. </div>
  82.  
  83. <p>V met≤de si najprv vytvorφme cestu (trieda <code>GraphicsPath</code>) s CAPTCHA k≤dom. Cestu nßhodne deformujeme met≤dou <code>Warp(...)</code>. A nakoniec vyplnφme pomocou <code>FillPath(...)</code>. NßÜ CAPTCHA obrßzok bude vyzera¥ naprφklad takto:</p>
  84.  
  85. <div class='image'>
  86. <img src='podklady/hlavaty/1134/captcha.png' title='NßÜ CAPTCHA obrßzok' alt='NßÜ CAPTCHA obrßzok' />
  87. <br /><span class='comment'>NßÜ CAPTCHA obrßzok</span>
  88. </div>
  89.  
  90. <p>Zßsadou je - Φφm viac ruÜiv²ch elementov sa v obrßzku nachßdza (Üum, r⌠zne Φiary a podobne), t²m je pre prφpadnΘho ·toΦnφka ¥a₧Üie tento systΘm prekona¥ a vytvori¥ automat, ktor² by vedel k≤d spo╛ahlivo Φφta¥.</p>
  91.  
  92. <h3>Ovlßdacφ prvok CAPTCHA v ASP.NET</h3>
  93. <p>Ovlßdacφ prvok bude obsahova¥ obrßzok so samotn²m CAPTCHA k≤dom a textovΘ pole, kam bude u₧φvate╛ tento k≤d vklada¥. Ovlßdacφ prvok bude tie₧ validßtorom, Φi₧e bude aplikßcii oznamova¥, ₧e u₧φvate╛ zadal nesprßvny k≤d.</p>  
  94. <p>Ovlßdacφ prvok <strong>musφ</strong> pri <strong>ka₧dom</strong> svojom "vykres╛ovanφ" vygenerova¥ nov² CAPTCHA k≤d. Tento ulo₧φ do sessiony, odkia╛ si ju vyzdvihne http handler a vykreslφ ho. Pri post-backu formulßra sa k≤d zadan² u₧φvate╛om porovnß s t²m, ktor² je v session. Ak nie s· k≤dy rovnakΘ, validßtor oznßmi aplikßcii chybu.</p>
  95. <p>Vytvorφme si teda triedu pre nßÜ ovlßdacφ prvok - ten bude dedi¥ z triedy <code>System.Web.UI.Control</code>:</p>
  96.  
  97. <div class='sample'>
  98. public class CaptchaControl : System.Web.UI.Control, IValidator, INamingContainer
  99. <br />{
  100. <br />  private HtmlInputText inputText;
  101. <br />  private Random random = new Random();
  102. <br />  public string Url = "~/captchaimage.axd";
  103. <br />  public string TagKey = "div";
  104. <br />  public string CssClass = "captcha";
  105. <br />
  106. <br />  protected override void CreateChildControls()
  107. <br />  {
  108. <br />    <span class='comment'>// vytvorime input control</span>
  109. <br />    this.inputText = new System.Web.UI.HtmlControls.HtmlInputText("password");
  110. <br />    this.inputText.ID = "input";
  111. <br />    this.inputText.MaxLength = 3;
  112. <br />    <span class='comment'>// vlozime ho medzi svoje detske ovl. prvky</span>
  113. <br />    this.Controls.Add( this.inputText );
  114. <br />  }
  115. <br />
  116. <br />  private string GenerateRandomCode(int length)
  117. <br />  {
  118. <br />    string s = String.Empty;
  119. <br />    System.Text.StringBuilder sb = new System.Text.StringBuilder(length);
  120. <br />    for (int i = 0; i < length; i++)
  121. <br />    {
  122. <br />      sb.Append( this.random.Next(10).ToString() );
  123. <br />    }
  124. <br />    return sb.ToString();
  125. <br />  }
  126. <br />
  127. <br /><span class='comment'>// dalÜφ k≤d p⌠jde sem</span>
  128. <br />
  129. <br />}
  130. </div>
  131.  
  132. <p>Trieda bude ma¥ nieko╛ko verejne prφstupn²ch premenn²ch. Adresa nßÜho http handlera, ktor² generuje samotn² obrßzok s k≤dom, sa bude nastavova¥ pomocou <samp>Url</samp>. (Nezabudnite, ₧e handler musφ by¥ sprßvne zaregistrovan².) Otvßracφ HTML tag nßÜho prvku je v premennej <samp>TagKey</samp>. A CSS trieda je v <samp>CssClass</samp>.</p>
  133. <p>VÜetky kompozitnΘ ovlßdacie prvky by mali vytvßra¥ svojich "potomkov" v met≤de <code>CreateChildControls()</code>. My v tejto met≤de vytvorφme textovΘ pole <samp><input type="password" ...></samp> a pridßme ho do kolekcie <code>Controls</code>.</p>
  134. <p>Na generovanie re¥azca nßhodn²ch Φφsiel sl·₧i met≤da <code>GenerateRandomCode(int length)</code>. Ako parameter staΦφ met≤de zada¥ dσ₧ku re¥azca. My budeme pou₧φva¥ trojcifernΘ Φφsla.</p>
  135. <p>"Vykres╛ovanie" ovlßdacie prvku prebieha v met≤de <code>Render</code>:</p>
  136.  
  137. <div class='sample'>
  138. protected override void Render(HtmlTextWriter writer)
  139. <br />{
  140. <br />  <span class='comment'>// vyrenderujeme id</span>
  141. <br />  if (this.ID != null)
  142. <br />  {
  143. <br />    writer.AddAttribute(HtmlTextWriterAttribute.Id, this.ClientID);
  144. <br />  }
  145. <br />  
  146. <br />  <span class='comment'>// vyrenderujeme CSS triedu</span>
  147. <br />  if (this.CssClass != null)
  148. <br />  {
  149. <br />    writer.AddAttribute(HtmlTextWriterAttribute.Class, this.CssClass);
  150. <br />  }
  151. <br />
  152. <br />  <span class='comment'>// zaciatocna znacka</span>
  153. <br />  writer.RenderBeginTag(this.TagKey);
  154. <br />
  155. <br />  <span class='comment'>// obrazok - odkaz na http handler</span>
  156. <br />  writer.WriteBeginTag( "img" );
  157. <br />  writer.WriteAttribute("src", this.ResolveUrl(this.Url));
  158. <br />  writer.WriteAttribute("alt", String.Empty);
  159. <br />  writer.Write( HtmlTextWriter.TagRightChar );
  160. <br />
  161. <br />  <span class='comment'>// zaciatok tela</span>
  162. <br />  writer.AddAttribute(HtmlTextWriterAttribute.Class, "body");
  163. <br />  writer.RenderBeginTag("div");
  164. <br />
  165. <br />  <span class='comment'>// obsah</span>
  166. <br />  writer.AddAttribute(HtmlTextWriterAttribute.For, this.inputText.ClientID);
  167. <br />  writer.RenderBeginTag("label");
  168. <br />  writer.Write( "Zadaj k≤d ktor² vidφÜ na obrßzku:" );
  169. <br />  writer.RenderEndTag();
  170. <br />
  171. <br />  this.RenderChildren( writer );
  172. <br />  writer.RenderEndTag();
  173. <br />  writer.RenderEndTag();
  174. <br />
  175. <br />}
  176. </div>
  177.  
  178. <p>V met≤de najprv "vykreslφme" <samp><img ...></samp> element, ktor² zobrazuje CAPTCHA k≤d, potom oznam pre u₧φvate╛a a napokon textovΘ pole pre zadßvanie tohto k≤du. NßÜ ovlßdacφ prvok bude generova¥ tak²to HTML k≤d:</p>
  179.  
  180. <div class='sample'>
  181. <div id="CaptchaControl1" class="captcha">
  182. <br />  <img src="/captcha/captchaimage.axd" alt="">
  183. <br />    <div class="body">
  184. <br />      <label for="CaptchaControl1_input">
  185. <br />        Zadaj k≤d ktor² vidφÜ na obrßzku:
  186. <br />      </label>
  187. <br />      <input name="CaptchaControl1:input" id="CaptchaControl1_input" type="password" maxlength="3" />
  188. <br />    </div>
  189. <br /></div>
  190. </div>
  191.  
  192. <p>Ako som u₧ spomφnal, ovlßdacφ prvok <strong>musφ</strong> pri <strong>ka₧dom</strong> svojom "vykres╛ovanφ" vygenerova¥ nov² k≤d. Preto pridßme do naÜej triedy met≤du, ktorß nßm toto spo╛ahlivo zabezpeΦφ - vygeneruje trojcifernΘ Φφslo a ulo₧φ ho do sessiony:</p>
  193.  
  194. <div class='sample'>
  195. protected override void OnPreRender(EventArgs e)
  196. <br />{
  197. <br />  base.OnPreRender (e);
  198. <br />  if (this.IsVisible)
  199. <br />  {
  200. <br />    string captchaKey = this.GenerateRandomCode(3);
  201. <br />    this.Context.Session[ CaptchaHttpHandler.SESSION_CaptchaKey ] = captchaKey;
  202. <br />  }
  203. <br />}
  204. </div>
  205.  
  206. <p>NßÜmu ovlßdaciemu prvku ch²ba u₧ len poslednß vec - kontrola sprßvnosti u₧φvate╛om zadanΘho k≤du. Ovlßdacφ prvok je preto zßrove≥ aj validßtorom a implementuje rozhranie <code>IValidator</code> (Viac o validßtoroch sa doΦφtate v Φlßnku <a href='http://interval.cz/clanek.asp?article=1278' title='Naiman, Michal: ASP.NET - schvalovacφ prvky'>ASP.NET - schvalovacφ prvky</a>). V met≤de <code>Validate()</code> najsk⌠r zistφme, Φi nßÜ ovlßdacφ prvok je vidie¥. Ak nie, tak vlastnos¥ <code>IsValid</code> vrßti <samp>true</samp>, Φi₧e ₧iadna chyba sa nevyskytla. Ak prvok je vidie¥, tak zavolßme met≤du <code>EvaluateIsValid</code>, ktorß naΦφta zo sessiony aktußlny k≤d a porovnß ho s k≤dom, ktor² zadal u₧φvate╛. Ak s· rovnakΘ, vrßti <samp>true</samp>, inßΦ vrßti <samp>false</samp>. No a eÜte do triedy pridßme vlastnos¥ <samp>ErrorMessage</samp>, ktorß obsahuje chybov· hlßÜku. Implementßcia nßÜho validßtora vyzerß nasledovne:</p>
  207.  
  208. <div class='sample'>
  209. public void Validate()
  210. <br />{
  211. <br />  if (!this.IsVisible)
  212. <br />  {
  213. <br />    this.isValid = true;
  214. <br />    return;
  215. <br />  }
  216. <br />  this.isValid = this.EvaluateIsValid();
  217. <br />}
  218. <br />
  219. <br />protected virtual bool EvaluateIsValid()
  220. <br />{
  221. <br />  // ak uzivatel nic nezadal tak konec
  222. <br />  if (this.inputText.Value.Length == 0)
  223. <br />  {
  224. <br />    return false;
  225. <br />  }
  226. <br />
  227. <br />  object o = Context.Session[ CaptchaHttpHandler.SESSION_CaptchaKey ];
  228. <br />  if ( !(o is string) )
  229. <br />  {
  230. <br />    return false;
  231. <br />  }
  232. <br />
  233. <br />  string generated = (string)o;
  234. <br />  if (generated.Equals(this.inputText.Value))
  235. <br />  {
  236. <br />    return true;
  237. <br />  }
  238. <br />  return false;
  239. <br />}
  240. <br />
  241. <br />private bool isValid = true;
  242. <br />
  243. <br />public bool IsValid
  244. <br />{
  245. <br />  get
  246. <br />  {
  247. <br />    return this.isValid;
  248. <br />  }
  249. <br />  set
  250. <br />  {
  251. <br />    this.isValid = value;
  252. <br />  }
  253. <br />}
  254. <br />
  255. <br />private string errorMessage;
  256. <br />
  257. <br />public string ErrorMessage
  258. <br />{
  259. <br />  get
  260. <br />  {
  261. <br />    return this.errorMessage;
  262. <br />  }
  263. <br />  set
  264. <br />  {
  265. <br />    this.errorMessage = value;
  266. <br />  }
  267. <br />}
  268. </div>
  269.  
  270. <p>Pre sprßvnu funkΦnos¥ musφme eÜte nßÜ prvok pri inicializßcii zaregistrova¥ medzi ostatnΘ validßtory na strßnke:</p>
  271.  
  272. <div class='sample'>
  273. protected override void OnInit(EventArgs e)
  274. <br />{
  275. <br />  base.OnInit (e);
  276. <br />  <span class='comment'>// pridame ov. prvok medzi ostatne validatory:</span>
  277. <br />  this.Page.Validators.Add(this);
  278. <br />  this.EnsureChildControls();
  279. <br />}
  280. </div>
  281.  
  282. <h3>Ovlßdacφ prvok v praxi</h3>
  283. <p>NßÜ ovlßdacφ prvok je hotov² a m⌠₧me ho zaΦa¥ pou₧φva¥ pri prihlasovanφ u₧φvate╛ov, alebo naprφklad aj pri overovanφ, Φi u₧φvate╛ naozaj chce vykona¥ nejak· deÜtruktφvnu operßciu. ("Chcete naozaj stornova¥ fakt·ru? Zadajte k≤d, ktor² vidφte na obrßzku...")</p>
  284. <p>Ja som pripravil jednoduch· ASPX strßnku, na ktorej si m⌠₧eme <a href='http://aspx.interval.cz/hlavaty/1134/'>overi¥ funkΦnos¥ ovlßdacieho prvku</a>. Cel² <a href='podklady/hlavaty/1134/captcha_solution.zip'>zdrojov² k≤d</a> nßjdete v prilo₧enom s·bore. Nemß v²znam uvßdza¥ cel² k≤d do Φlßnku - ukß₧eme si iba ako v obsluhe tlaΦidla zistφme, Φi sa na strßnke vyskytla chyba a teda Φi u₧φvate╛ zadal sprßvny k≤d. Je to jednoduchΘ:</p>
  285.  
  286. <div class='sample'>
  287. private void bOK_Click(object sender, EventArgs e)
  288. <br />{
  289. <br />  if (!this.IsValid)
  290. <br />  {
  291. <br />    <span class='comment'>// na stranke je chyba</span>
  292. <br />    return;
  293. <br />  }
  294. <br />
  295. <br />  <span class='comment'>// na stranke nie je chyba - uzivatel zadal spravny kod</span>
  296. <br />}
  297. </div>
  298.  
  299. <p>NaÜa testovacia strßnka v prehliadaΦi:</p>
  300.  
  301. <div class='image'>
  302. <img src='podklady/hlavaty/1134/chybny_kod.png' title='Testovacia strßnka - chybne zadan² k≤d' alt='Testovacia strßnka - chybne zadan² k≤d' />
  303. <br /><span class='comment'>Testovacia strßnka - chybne zadan² k≤d</span>
  304. </div>
  305.  
  306. <div class='image'>
  307. <img src='podklady/hlavaty/1134/spravny_kod.png' title='Testovacia strßnka - sprßvne zadan² k≤d' alt='Testovacia strßnka - sprßvne zadan² k≤d' />
  308. <br /><span class='comment'>Testovacia strßnka - sprßvne zadan² k≤d</span>
  309. </div>
  310.  
  311.  
  312. <h3>Obmedzenia popisovanΘho prvku</h3>
  313. <p>NßÜ ovlßdacφ prvok nie je dokonal² a ani sa nesna₧φ by¥. Mß nieko╛ko obmedzenφ a mo₧nΘ bezpeΦnostnΘ slabiny. Obmedzenφm je naprφklad jeho vzh╛ad (respektφve generovan² HTML k≤d), ktor² je pevne dan² a meni¥ sa dß len pomocou CSS. Nov² CAPTCHA k≤d sa generuje pri ka₧dej po₧iadavke (request) na server - Φo je samozrejme sprßvne. Ale aj obrßzok s k≤dom sa generuje pri ka₧dej po₧iadavke (requeste na nßÜ http handler). To m⌠₧e by¥ bezpeΦnostnß slabina. Ak poÜleme na server naprφklad 10 po₧iadaviek, zaka₧d²m server vygeneruje in² obrßzok (preto₧e ho nßhodne deformujeme), na ka₧dom vÜak bude ten ist² k≤d. Toto m⌠₧e vyu₧i¥ sofistikovan² robot, ktor² bude posiela¥ po₧iadavky na CAPTCHA obrßzok, k²m si nebude ist², ₧e k≤d na ≥om rozpoznal. Potom tento k≤d vlo₧φ do textovΘho po╛a. S· aplikßcie (naprφklad u₧ spomφnanΘ stornovanie fakt·ry v intranetovej aplikßcii), kde tßto slabina nemusφ prekß₧a¥. V ostatn²ch vÜak treba zabezpeΦi¥, aby pri ka₧dej po₧iadavke server vrßtil rovnak² obrßzok, a₧ dok²m sa nevygeneruje nov² CAPTCHA k≤d...</p>
  314.  
  315. <div id='article-author'>
  316. <a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/autor.asp?author=247'>Hlavat², DuÜan</a> (22. 3. 2005)
  317.  
  318. </div>
  319.  
  320.  
  321.  
  322.  
  323. </div></div>
  324. <div id='page-right'><h2 class='textversion'>Prav² sloupek</h2>
  325. <div id='search'><h3 class='textversion'>Vyhledßvßnφ</h3><form method='get' action='http://interval.cz/search.asp'><div><input type='text' name='hledej' class='text' /><input type='submit' class='submit' value='Najdi!' /></div></form><div><a href='http://interval.cz/search_ex.asp'>RozÜφ°enΘ vyhledßvßnφ</a></div></div>
  326.  
  327.  
  328.  
  329. <div class='page-right-box book'>
  330.     <h3>Kni₧nφ novinka</h3>
  331.     <div class='page-right-box-in'>
  332.         <div class='book-top'>
  333.             <h4><a href='http://interval.cz/__redirect/redirect.asp?what=interval_booknews&url=http://interval.inshop.cz/inshop/scripts/detail.asp?ItemID=290'>PHP - moduly, rozÜφ°enφ a akcelerßtory</a></h4>
  334.         </div>
  335.         <div class='image'>
  336.             <img src='podklady/knihy/image.jpg' alt='obßlka' title='obßlka' /></a>
  337.         </div>
  338.         <div class='book-bottom'>Cena: <span class='book-price-old'>299 KΦ</span> <span class='book-price-new'>269 KΦ</span></div>
  339.     </div>
  340. </div>
  341.  
  342.  
  343.  
  344. <div class='page-right-box reading'><h3 title='NejΦten∞jÜφ Φlßnky za poslednφch 14 dn∙'>NejΦten∞jÜφ</h3><div class='page-right-box-in'><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3829'>Interval.cz a jeho Φtenß°i v roce 2005</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3830'>Pou₧φvßme nßvrhovΘ vzory v .NET - Singleton</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3827'>SUN Java Studio Creator</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3824'>Perl-compatible regulßrnφ v²razy v PHP - modifikßtory a lφnΘ kvantifikßtory</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3831'>GNU Gettext - sprßva p°eklad∙</a></li></ul></div></div><div class='page-right-box cauldron'><h3 title='Nejdiskutovan∞jÜφ Φlßnky za poslednφch 21 dn∙'>Diskuznφ kotel</h3><div class='page-right-box-in'><ul><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3818' title='(36 komentß°∙)'>PHP a MS SQL - vklßdßnφ a naΦφtßnφ soubor∙</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3811' title='(26 komentß°∙)'>GNU Gettext - prvnφ kroky</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3829' title='(20 komentß°∙)'>Interval.cz a jeho Φtenß°i v roce 2005</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3815' title='(11 komentß°∙)'>H°φchy pro ÜφlenΘho korektora - jak se vyhnout zbyteΦn²m chybßm</a></li><li><a href='http://interval.cz/__redirect/redirect.asp?what=interval_offline&url=http://interval.cz/clanek.asp?article=3825' title='(11 komentß°∙)'>Ovlßdacφ prvok CAPTCHA v ASP.NET</a></li></ul></div></div>
  345.  
  346.  
  347.  
  348. <div class='page-right-box emailserv'><h3>Email servis</h3><div class='page-right-box-in'><form action='prihlaseni.asp' method='post'><div class='shell'><input class='text' type='text' name='adresa' /></div><div class='shell'><input class='radio' type='radio' value='1' name='co' checked='checked' />T²dennφ p°ehled Φlßnk∙</div><div class='shell'><input class='radio' type='radio' value='2' name='co' />HELP konference</div><div class='shell'><input class='submit' type='submit' value='P°ihlßsit' /></div></form></div></div>
  349. </div>
  350. <div class='page-maker'> </div><div class='page-maker-white'> </div></div>
  351. <div id='page-foot'><div id='page-foot-menu'><a href='http://interval.cz/reklama.asp'>Inzerce na Interval.cz</a> | <a href='http://interval.cz/redakce.asp'>Redakce Interval.cz</a> | <a href='http://interval.cz/autori.asp'>Hledßme novΘ autory</a></div><div id='issn'>ISSN 1212-8651</div><div id='page-foot-zoner'>© Zoner software, s.r.o., vÜechna prßva vyhrazena, tento server dodr₧uje <a href='http://interval.cz/privacy.asp'>prßvnφ p°edpisy</a>o ochran∞ osobnφch ·daj∙.</div></div>
  352. </body>
  353. </html>