title: Classic ASP :: Cross-Site Scripting (XSS) Poor Validation Issue
body: <p>For a legacy Classic ASP application, I am supposed to remove all security attack issues. Currently, DB contains data which is already encoded and there will be no more Insert/update operations. Only select operations from now on wards.</p>
  
  <p>I am able to remove SQL Injection and few other security issues, but, unable to remove    </p>
  
  <blockquote>
    <p><strong>Cross Site Scripting (XSS) : Poor Validation Issue</strong></p>
  </blockquote>
  
  <p>This became bottle neck for delivery of the project.</p>
  
  <p>Could anybody help me on this.</p>
  
  <p><strong>Example:</strong>
  My data in DB as following. </p>
  
  <p><strong>One Cell Sample Data (Korean and English Char)</strong></p>
  
  <pre><code>1..&amp;nbsp;Rupture&amp;nbsp;disc&amp;nbsp;설치&amp;nbsp;관련&amp;nbsp;필요&amp;nbsp;자재&amp;nbsp;List&lt;BR&gt;──────────────────────────────────────&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;No 필요&amp;nbsp;자재 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;재질 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;비&amp;nbsp;고 &lt;BR&gt;──────────────────────────────────────&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;1 inlet&amp;nbsp;isolation&amp;nbsp;valve,&amp;nbsp;8" &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hast&amp;nbsp;C276 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;기존&amp;nbsp;재고&amp;nbsp;사용 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;2 RD&amp;nbsp;holder&amp;nbsp;inlet/outlet &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hast&amp;nbsp;C276&amp;nbsp;/&amp;nbsp;316L&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;신규&amp;nbsp;구매 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;3 Rupture&amp;nbsp;Disc &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Hast&amp;nbsp;C276 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;신규&amp;nbsp;구매 &lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;4 SV&amp;nbsp;outlet&amp;nbsp;isolation&amp;nbsp;valve,&amp;nbsp;10"&amp;nbsp;&amp;nbsp;&amp;nbsp;SUS&amp;nbsp;316L &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;신규&amp;nbsp;구매 &lt;BR&gt;──────────────────────────────────────&lt;BR&gt;&lt;BR&gt;2.&amp;nbsp;Rupture&amp;nbsp;Disc&amp;nbsp;Specification&lt;BR&gt;&amp;nbsp;&amp;nbsp;1)&amp;nbsp;Rupture&amp;nbsp;design&amp;nbsp;press  :&amp;nbsp;4kg/cm2&lt;BR&gt;&amp;nbsp;&amp;nbsp;2)&amp;nbsp;Design&amp;nbsp;temperature  :&amp;nbsp;100℃&lt;BR&gt;&amp;nbsp;&amp;nbsp;3)&amp;nbsp;Rupture&amp;nbsp;press&amp;nbsp;tolerance&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;±&amp;nbsp;5%&lt;BR&gt;&amp;nbsp;&amp;nbsp;4)&amp;nbsp;Manufacturing&amp;nbsp;range  :&amp;nbsp;+&amp;nbsp;0%,&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;nbsp;10%&lt;BR&gt;&amp;nbsp;&amp;nbsp;5)&amp;nbsp;Material&amp;nbsp;spec   :&amp;nbsp;M1,&amp;nbsp;M4,&amp;nbsp;C31&lt;BR&gt;&amp;nbsp;&amp;nbsp;6)&amp;nbsp;Max.&amp;nbsp;allowable&amp;nbsp;oper&amp;nbsp;press &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;:&amp;nbsp;3.2kg/cm2&amp;nbsp;(at&amp;nbsp;100℃)&lt;BR&gt;&lt;BR&gt;3.&amp;nbsp;Rupture&amp;nbsp;Disc&amp;nbsp;spec&amp;nbsp;선정&amp;nbsp;기준&lt;BR&gt;&amp;nbsp;&amp;nbsp;.&amp;nbsp;Code,&amp;nbsp;&amp;nbsp;Standard&amp;nbsp;=&amp;nbsp;API&amp;nbsp;520,&amp;nbsp;&amp;nbsp;ASME&amp;nbsp;VIII&lt;BR&gt;&amp;nbsp;&amp;nbsp;.&amp;nbsp;Required&amp;nbsp;Burst&amp;nbsp;Pressure&amp;nbsp;=&amp;nbsp;Vessel&amp;nbsp;Design&amp;nbsp;Pressure&lt;BR&gt;&amp;nbsp;&amp;nbsp;.&amp;nbsp;Manufacturing&amp;nbsp;range(+0%&amp;nbsp;∼&amp;nbsp;-10%)&amp;nbsp;of&amp;nbsp;Required&amp;nbsp;Burst&amp;nbsp;Pressure&lt;BR&gt;&amp;nbsp;&amp;nbsp;.&amp;nbsp;Rupture&amp;nbsp;Pressure&amp;nbsp;Tolerance&amp;nbsp;+5%,&amp;nbsp;-5%&amp;nbsp;of&amp;nbsp;Stamped&amp;nbsp;Burst&amp;nbsp;Pressure&lt;BR&gt;&amp;nbsp;&amp;nbsp;.&amp;nbsp;Specified&amp;nbsp;Disc&amp;nbsp;Temperature&amp;nbsp;=&amp;nbsp;Actual&amp;nbsp;Temperature&amp;nbsp;of&amp;nbsp;Disc&amp;nbsp;in&amp;nbsp;Operation&amp;nbsp;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;→&amp;nbsp;usually&amp;nbsp;lower&amp;nbsp;at&amp;nbsp;disc&amp;nbsp;than&amp;nbsp;in&amp;nbsp;liquid&amp;nbsp;phase&amp;nbsp;of&amp;nbsp;vessel&amp;nbsp;&amp;nbsp;&lt;BR&gt;&lt;BR&gt;4.&amp;nbsp;Rupture&amp;nbsp;Disk&amp;nbsp;전단&amp;nbsp;및&amp;nbsp;SV2209&amp;nbsp;후단&amp;nbsp;Isolation&amp;nbsp;valve는&amp;nbsp;CSO(CAR&amp;nbsp;SEAL&amp;nbsp;OPEN)&amp;nbsp;.&lt;BR&gt;&lt;BR&gt;5.&amp;nbsp;Rupture&amp;nbsp;Disk&amp;nbsp;후단에&amp;nbsp;PG2209를&amp;nbsp;설치하여&amp;nbsp;운전&amp;nbsp;중&amp;nbsp;Rupture&amp;nbsp;disk&amp;nbsp;파손&amp;nbsp;여부&amp;nbsp;확인&amp;nbsp;가능토록&amp;nbsp;함.&lt;BR&gt;
  </code></pre>
  
  <p>I am displaying above cell data as follows:</p>
  
  <p><strong>Sample Page:</strong></p>
  
  <pre><code>&lt;!-- #include file="INCLUDES/HTMLDecode.inc" --&gt;
  .
  .
  .
  &lt;HTML&gt;
  .
  .
  .
  sampledata = rs("sampledata")
  .
  .
  .
  &lt;TD&gt;&lt;%= ClearForAttack(sampledata) =%&gt;&lt;/TD&gt;
  .
  .
  .
  &lt;/HTML&gt;
  </code></pre>
  
  <p>The above functions defined as follows :</p>
  
  <p><strong>User Defined Functions:</strong></p>
  
  <pre><code>    &lt;%
      Function HTMLDecode(sText)
          Dim I
          sText = Replace(sText, "&amp;quot;", Chr(34))
          sText = Replace(sText, "&amp;lt;"  , Chr(60))
          sText = Replace(sText, "&amp;gt;"  , Chr(62))
          sText = Replace(sText, "&amp;amp;" , Chr(38))
          sText = Replace(sText, "&amp;nbsp;", Chr(32))
          For I = 1 to 255
              sText = Replace(sText, "&amp;#" &amp; I &amp; ";", Chr(I))
          Next
          HTMLDecode = sText
      End Function
      %&gt;
      &lt;%
      Function ClearForAttack(pStrValue)
          if len(pStrValue)&gt;0 then
              pStrValue = HTMLDecode(Server.HTMLEncode(pStrValue))
              pStrValue = replace(pStrValue,"'","")
              pStrValue = replace(pStrValue,"`","")
              pStrValue = replace(pStrValue,"%","")
              pStrValue = replace(pStrValue,"&lt;","&amp;lt;")
              pStrValue = replace(pStrValue,"&gt;","&amp;gt;")
          else
              pStrValue = ""
          end if
          ClearForAttack = pStrValue
      End Function
      %&gt;
  </code></pre>
  
  <p>To display already encoded data I am using both HTMLDecode and HTMLEncode Functions</p>
  
  <p>Please <strong>EDIT functions</strong> or suggest me <strong>another</strong> approach.</p>
  
  <p>Your help or suggestions are highly appreciated.</p>
  
  <p>Thanks in advance.</p>