[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

Incorporating Captcha in ASP Form that Updates a Database

Posted on 2009-02-14
23
Medium Priority
?
547 Views
Last Modified: 2012-08-13
I need to incorporate Captcha in some ASP forms that take information and update an Access database. I've spent some time perusing the extremely detailed answers provided for a similar question:
http://www.experts-exchange.com/Programming/Languages/Scripting/JavaScript/Q_22068884.html?sfQueryTermInfo=1+asp+captcha
http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/ASP/Q_22073513.html
Since I also have forms that do not update a database, they will be very helpful. But I can't seem to figure out how to perform Captcha validation, based on the examples, and also execute the action to update the database.
The page was developed in Dreamweaver. The action for the form is, in this case, to add information to the db:
      <form action="<%=MM_editAction%>" method="POST" name="eventAdd">
        <fieldset id="loginInfo">
        <legend class="legend">Event Information  <span class="smallRed">*</span> <span class="style1">Indicates required field</span></legend>
        <div id="event"><br />
          <label for="classification">Classification:<span class="smallRed">*</span></label>
          <select name="classification" size="1" id="classification">
How can you execute the asp routine to validate the entered Captcha data and also perform the database update code generated by Dreamweaver?
0
Comment
Question by:slegy
  • 12
  • 6
  • 5
23 Comments
 
LVL 31

Expert Comment

by:Wayne Barron
ID: 23648900
a few links on the subject
http://www.u229.no/stuff/Captcha/
http://www.motobit.com/util/captcha/

There is a LOT of information out there to find.
http://www.google.com/search?hl=en&q=captcha+asp+code&aq=2&oq=Captcha+as
There is so much that it is difficult to go through it all.

Hope that one of them will help you.
Carrzkiss
0
 

Author Comment

by:slegy
ID: 23650159
I know there is a lot of stuff out there - I've been going through it for the last week. As best I now understand it, the form action is to specify a second ASP page which performs the validation and then returns a true or false - or specifies itself as the action so that after checking it can test the results of the validation.

My specific question, for which I have not be able to find any articles, is how to inforporate it in a Dreamweaver form whose primary action is to add/update a database:
<form action="<%=MM_editAction%>" method="POST" name="eventAdd">

<%
Dim MM_editAction
MM_editAction = CStr(Request.ServerVariables("SCRIPT_NAME"))
If (Request.QueryString <> "") Then
  MM_editAction = MM_editAction & "?" & Server.HTMLEncode(Request.QueryString)
End If
' boolean to abort record edit
Dim MM_abortEdit
MM_abortEdit = false
%>
<%
' IIf implementation
Function MM_IIf(condition, ifTrue, ifFalse)
  If condition = "" Then
    MM_IIf = ifFalse
  Else
    MM_IIf = ifTrue
  End If
End Function
%>
<%
If (CStr(Request("MM_insert")) = "eventAdd") Then
  If (Not MM_abortEdit) Then
    ' execute the insert
    Dim MM_editCmd . . .

I'm looking for some assistance on how to accomplish both actions - verify the Captcha entry and if it is good update the database.
0
 
LVL 54

Expert Comment

by:b0lsc0tt
ID: 23654913
You will need to put the code to validate the captcha in the same part of the code that currently processes the form.  In other words the same "If" or section that will update the database.  Put the code to validate BEFORE the code to update the database (although it could be with code that is validating the input before updating the DB).  If you can provide an overall layout of how your code works then I would be glad to show you the general area I would put it in.
For specifics then we need a much better idea of the code you have and what you are using for the Captcha code.  Dreamweaver makes very hard to read code in my opinion so this can sometimes be hard to find but if you already understand it well then what I offered above may be enough.  If you are overwhelmed because your existing page already has tons of code that you don't really understand then it might really be easier to learn by first making a simpler, dummy page to combine the two.  If the general layout of code is the same it will probably prove very helpful as you try to adapt your main page to work with the Captcha code.
Let me know how this helps or if you have a question.
bol
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 

Author Comment

by:slegy
ID: 23684887
Hello - and thank you. I missed the email about your response until just now. It was your thoughtful and thorough responses that I read through on EE, and I'm pleased that you are willing to help. I'm a long-time IT person so am not intimidated by code. I did try to incorporate the Captcha check in the Dreamweaver database update code but was unable to get it to work. I'm trying to use reCaptcha (although the images are nearly impossible to read). The other fellow you helped I believe was using web wiz captcha, and I would not be opposed to that. Here is where I am:
Here's the form (with the middle parts omitted) and the field for the recaptcha form:

      <form action="<%=MM_editAction%>" method="POST" name="eventAdd">
        <fieldset id="loginInfo">
        <legend class="legend">Event Information  <span class="smallRed">*</span> <span class="style1">Indicates required field</span></legend>
        <div id="event"><br />
          <label for="classification">Classification:<span class="smallRed">*</span></label>
          <select name="classification" size="1" id="classification">
            <%
While (NOT rseventClass.EOF)
%>
            <option value="<%=(rseventClass.Fields.Item("eventClass").Value)%>" <%If (Not isNull(" Select an Event Classification")) Then If (CStr(rseventClass.Fields.Item("eventClass").Value) = CStr(" Select an Event Classification")) Then Response.Write("selected=""selected""") : Response.Write("")%> ><%=(rseventClass.Fields.Item("eventClass").Value)%></option>
            <%
  rseventClass.MoveNext()
Wend
If (rseventClass.CursorType > 0) Then
  rseventClass.MoveFirst
Else
  rseventClass.Requery
End If
%>
. . . . . . .
              <textarea name="comments" id="comments" cols="75" rows="4" size="1" tabindex="20"></textarea>
            </p>
          <p>Verify:
          <div id="recaptcha">
            <label>
            <%=recaptcha_challenge_writer(recaptcha_public_key)%>
            </label>
            </div>
       </div>
        </fieldset>
    <div id="submitForm">
      <input name="submit" type="submit" id="submit" onClick="MM_callJS('submitForm()')" value="Submit" />
    </div>
        <input type="hidden" name="MM_insert" value="eventAdd" />
      </form>

The function "submitForm() validates the user input:
<script type="text/javascript" language="javascript">
function submitForm()
{
 alert ("Submit Form");
 function recaptcha_confirm(privkey,rechallenge,reresponse)
    if (document.eventAdd.classification.selectedIndex == "0")
        {
         alert("Event Classification is Required");
      document.eventAdd.classification.focus();
         return false;
        }
. . . . . . . . .
    if (document.eventAdd.endDay.selectedIndex == "0")
        {
         alert("End Day is Required");
      document.eventAdd.endDay.focus();
         return false;
        }
  document.eventAdd.submit();

Here is the code at the top of the page - captcha variables and Dreamweaver add-to-database code:

<!--#include file="../../Connections/ilcaData.asp" -->
<!--#include file="../../Connections/eventCalendar.asp" -->
<!--#include file="adovbs.asp"-->
<!--#include file="iasutil.asp"-->
<%
' On Error Resume Next
' Classsic ASP pages created by Andre F Bruton
' E-mail: andre@bruton.co.za
' Date: 2008/01/19

recaptcha_challenge_field  = Request("recaptcha_challenge_field")
recaptcha_response_field   = Request("recaptcha_response_field")
recaptcha_private_key      = "6LewIAUAAAAAAAjmgc9mSer6yjKmhN8Y0TageoGt"
recaptcha_public_key       = "6LewIAUAAAAAACE74U2jHkO2TEVvUL-64tJvR2g-"
browser                    = Request.ServerVariables("HTTP_USER_AGENT")
ip                         = Request.ServerVariables("REMOTE_HOST")
%>
<%
Dim MM_editAction
MM_editAction = CStr(Request.ServerVariables("SCRIPT_NAME"))
If (Request.QueryString <> "") Then
  MM_editAction = MM_editAction & "?" & Server.HTMLEncode(Request.QueryString)
End If
' boolean to abort record edit
Dim MM_abortEdit
MM_abortEdit = false
%>
<%
' IIf implementation
Function MM_IIf(condition, ifTrue, ifFalse)
  If condition = "" Then
    MM_IIf = ifFalse
  Else
    MM_IIf = ifTrue
  End If
End Function
%>
<%
If (CStr(Request("MM_insert")) = "eventAdd") Then
  If (Not MM_abortEdit) Then
    ' execute the insert
    Dim MM_editCmd
    Set MM_editCmd = Server.CreateObject ("ADODB.Command")
    MM_editCmd.ActiveConnection = MM_eventCalendar_STRING
    MM_editCmd.CommandText = "INSERT INTO eventCalendar (classification, eventTitle, [eventTitle-long], startMonth, startDay, startYear, endMonth, endDay, endYear, [host], district, fleet, city, stateProvince, country, contact, eddress, phone, eddress2, website, comments) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"

And finally, here is the captcha challenge and validation code:

<%
' The code below supplied by Mark Short
' returns string the can be written where you would like the reCAPTCHA challenged placed on your page
function recaptcha_challenge_writer(publickey)
  recaptcha_challenge_writer = "<script type=""text/javascript"">" & _
  "var RecaptchaOptions = {" & _
  " theme : 'white'," & _
  " tabindex : 0" & _
  "};" & _
  "</script>" & _
  "<script type=""text/javascript"" src=""http://api.recaptcha.net/challenge?k=" & publickey & """></script>" & _
  "<noscript>" & _
  "<iframe src=""http://api.recaptcha.net/noscript?k=" & publickey & """ frameborder=""1""></iframe><br>" & _
  "<textarea name=""recaptcha_challenge_field"" rows=""3"" cols=""40""></textarea>" & _
  "<input type=""hidden"" name=""recaptcha_response_field"" value=""manual_challenge"">" & _
  "</noscript>"
end function

function recaptcha_confirm(privkey,rechallenge,reresponse)
  ' Test the captcha field
  Dim VarString
  VarString = _
  "privatekey=" & privkey & _
  "&remoteip=" & Request.ServerVariables("REMOTE_ADDR") & _
  "&challenge=" & rechallenge & _
  "&response=" & reresponse
  Dim objXmlHttp
  Set objXmlHttp = Server.CreateObject("Msxml2.ServerXMLHTTP")
  objXmlHttp.open "POST", "http://api-verify.recaptcha.net/verify", False
  objXmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  objXmlHttp.send VarString
  Dim ResponseString
  ResponseString = split(objXmlHttp.responseText, vblf)
  Set objXmlHttp = Nothing
  if ResponseString(0) = "true" then
    ' They answered correctly
    recaptcha_confirm = "" 
  else
    ' They answered incorrectly
    recaptcha_confirm = ResponseString(1)
  end if
end function
%>

This code appears at the top of a sample page (tho I think it contains errors). The form action is to itself:

<p>This is an example of a simple form using the recaptcha product to check that a human has entered the data.</p>
<%
cTemp = recaptcha_confirm(recaptcha_private_key, recaptcha_challenge_field, recaptcha_response_field)
If cTemp <> "" Then
%>
  <p>An error occured with the recapture wording. Please try again. The error was <b><%=cTemp%></b></p>

The captcha input form displays perfectly, so I just need to get the confirm running. Any help you could provide would be greatly appreciated.
0
 

Author Comment

by:slegy
ID: 23715385
Did I provide too much information?
0
 
LVL 54

Expert Comment

by:b0lsc0tt
ID: 23716557
>> Did I provide too much information? <<
No ... I have just been very busy.  I will try to take a look at this again in a few hours when I should have some time.  If you are getting a little desperate then click the Request Attention link/button that should  be up in the question body (bottom, right part near the Translate list).  It will provide a way to post to ask a Moderator to send a notice to others.  Dreamweaver makes it harder for me to read the code so this hasn't been something I could just look at quick and answer.  I am sorry about the delay though and thanks for the reminder!
bol
0
 

Author Comment

by:slegy
ID: 23717197
No problem. It was clear to me from your previous responses to a similar issue that you are very familiar with this type of problem, so I would like to work with you.

We converted the the new website over the weekend and decided we could survive without the captcha security until it could be successfully worked out. I know you all volunteer and don't always have the time to tackle a problem immediately. I worked on it some this afternoon and will continue tomorrow. I know what needs to be done - I just haven't worked out all the fine details. I am very happy to wait until you are able to find some time and when it is convenient.
0
 
LVL 54

Accepted Solution

by:
b0lsc0tt earned 1000 total points
ID: 23741238
I am not sure how long I will have for this right now.  I am reviewing the code and what you posted though.  This is actually the third try at writing a response.  The examples sure are confusing and documentation not something I found easy to make sense of (or at least missing a point or two).  Oh well. :)
What does the submitForm() Javascript function do?  There seems to be a javascript version of the confirm function in your code above.  I don't know that it is needed or use so please explain (or just remove).
It seems the ASP code is what will validate this.  That is good.  The recaptcha_confirm() function (in the ASP code) needs to be available.  Hopefully that is on the page that gets the form.
You had the line below in your code:
If (CStr(Request("MM_insert")) = "eventAdd") Then
That should be the start of the block that handles processing the form (in the ASP).  The next few lines seem to be that code.  Let me know if I am wrong but the Captcha validation (i.e. calling the function) needs to happen after that If and before the part that executes the insert (see the comment in your code).  I am not sure what MM_abortEdit does so this may need to go in that If or just above it.  I also hope you have other validation for the form fields.  I don't see any but you do need it.
See the snippet below.  It would be the code in the ASP to check the Captcha.  Please notice the variables.  I had to guess so you might already have them with the key and the 2 form fields.  If so then just use your variables.  The If is just a basic example of how to process it.  If you need help, especially to handle a failure, then please elaborate on how you handle bad info in the form and "show it again."  If you are not worried about reporting an error in the form or captcha then you can just leave out the If.
BTW - if you do want to handle a failure in the Captcha then you can assign the function response to a variable.  On failure that function returns an error message.  My If isn't set up to show that but it would be easy to change.
Let me know how this helps.  Hopefully it is clear.  It should give you something to work with and I will be glad to help more with specifics or any questions.
bol

Dim strResponse, strChallenge
strResponse = Request.Form("recaptcha_response_field")
strChallenge = Request.Form("recaptcha_challenge_field")
' line for your key (if not already in ASP variable), assume called strMyKey
 
If recaptcha_confirm(strMyKey, strChallenge, strResponse) = "" then
  ' OK to process form, do other validation and the insert
Else
  ' this is optional, do you have anything to handle a failure and show the form again?
End if

Open in new window

0
 

Author Comment

by:slegy
ID: 23773864
I've been sidetracked with other issues but was able to spend a little time with this yesterday. I must be making some progress because I'm getting new errors. I'm getting an error message about a problem with the iasutil.asp include. It says it is expecing an end statement. The routine was downloaded as a part of an example. When I looked at the file it appeared as if it might have problems because of comments, so I removed them all. Things look OK on the screen, but the error is still there. I think I may look for another Captcha solution. Thank you for your help. I will get back to you.
<script language=VBScript runat=Server>
 
Function SQLEncode(sValue)
  Position = InStr(sValue, "'")
  Do While Position > 0
    sValue = Mid(sValue, 1, Position) & Mid(sValue, Position)
    Position = InStr(Position + 2, sValue, "'")
  Loop
  SQLEncode = sValue
End Function
 
Function SpaceEncode(sValue)
  Position = InStr(sValue, " ")
  Do While Position > 0
    sValue = Mid(sValue, 1, Position - 1) & "%20" & Mid(sValue, Position + 1)
    Position = InStr(sValue, " ")
  Loop
  SpaceEncode = sValue
End Function
 
Function LFEncode(sValue)
  Position = InStr(sValue, Chr(13))
  Do While Position > 0
    sValue = Mid(sValue, 1, Position - 1) & "<br>" & Mid(sValue, Position + 2)
    Position = InStr(sValue, Chr(13))
  Loop
  LFEncode = sValue
End Function
 
Function CheckRequest(RS, ReqParam)  
  On Error Resume Next
  If IsEmpty(Request(ReqParam)) Then
    CheckRequest = RS(ReqParam)
  If Err Then CheckRequest = ""
  Else
    CheckRequest = Request(ReqParam)
  End If
End Function
 
Function CheckRS(RS)
  On Error Resume Next
  bEOF = RS.EOF
  If Err Or bEOF Then
    CheckRS = False
  Else
    CheckRS = True
  End If
End Function
 
Function CheckNextRS(RS)
  On Error Resume Next
  If RS Is Nothing Then
    CheckNextRS = False
  Else
    EOF = RS.EOF
    If Err Or EOF Then
      CheckNextRS = False
    Else
      CheckNextRS = True
    End If
  End If
End Function
 
Function GetDateTime()
  tempDate = CStr(Year(Now())) & "/" & CStr(Month(Now())) & "/" & CStr(Day(Now()))
  GetDateTime = tempDate & " " & Time()
End Function
 
Function Proper(ByVal strInput)
  Dim S, L, SLen, UChars, PrevChar, CurChar
    
  S = ""
  PrevChar = " "
  SLen = Len(strInput)
  UChars = " `1234567890-=" & _
     "~!@#$%^&*()_+[]\{}|;':"",./<>?" & _
     Chr(9) & Chr(10) & Chr(13)
   
  If (SLen < 1) THEN
    Proper = ""
    Exit Function
  End If
    
  For L = 1 To SLen
    If (InStr(UChars, PrevChar) > 0) THEN
      CurChar = UCase(Mid(strInput, L, 1))
    Else
      CurChar = LCase(Mid(strInput, L, 1))
    End If
    S = S & CurChar
    PrevChar = CurChar
  Next
  
  Proper = S
 
End Function
 
Function FileExist(ByVal strDir, ByVal strFileName)
  Dim fso, msg 
  Set fso = CreateObject("Scripting.FileSystemObject") 
  filespec = (strDir & strFileName)
  If (fso.FileExists(filespec)) Then 
    FileExist = TRUE
  Else 
    FileExist = FALSE    
  End If 
End Function
 
Function SubStringCount(ByVal strInput, ByVal strSub, _
  ByVal boolCheckCase)
  Dim Cnt, L, CP, SSLen, S1, S2
 
  Cnt = 0
 
  SSLen = Len(strSub)
 
  If (Len(strInput) < 1) OR (SSLen < 1) THEN
    SubStringCount = 0
    Exit Function
  End If
 
  If (boolCheckCase) THEN
    S1 = strInput
    S2 = strSub
  Else
    S1 = UCase(strInput)
    S2 = UCase(strSub)
  End If
  L = InStr(1, S1, S2)
  While (L > 0)
    Cnt = Cnt + 1
    CP = L + SSLen
    L = InStr(CP, S1, S2)
  Wend
 
  SubStringCount = Cnt
End Function
 
</script>

Open in new window

0
 
LVL 31

Expert Comment

by:Wayne Barron
ID: 23774642
0
 
LVL 54

Expert Comment

by:b0lsc0tt
ID: 23778673
Is the iasutil.asp file the one you posted in the snippet?  If so it looks good.  Did you say that is an include?  What if you move the code to the main file and remove the include line?  Does it still error?
That does seem to be a different issue though (and sounds like it has occurred before so isn't due to the change I suggested).  Let me know if I am wrong.  Let me know how I can help with this or what you want to do.  If you still need to test then just let me know the result or if you have a question.  If you do want to pursue other Captchas then let me know.  I believe I have some to recommend (nothing from personal experience use though).
bol
0
 

Author Comment

by:slegy
ID: 23805832
Thank you for your responses. I have been fighting implementation issues, and now site security issues. I will get back to this in another day or so. The client is very anxious to get it implemented in database-related pages.
0
 
LVL 31

Expert Comment

by:Wayne Barron
ID: 23805872
slegy.
I tested this one out a while back, and it works great.
(What I posted above)
have a look here please.
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=9151&lngWId=4

Give it a shot, I think that you will like it.

Good Luck
Carrzkiss
0
 

Author Comment

by:slegy
ID: 23836710
Thank you so much. I've been fighting other fires. Just finished late yesterday. I have a meeting wiht the client today but will get right back to this later today or first thing tomorrow.
0
 
LVL 54

Expert Comment

by:b0lsc0tt
ID: 23851682
Let us know how that code helps when you are able to get back to this.  If it doesn't and you want me to respond with more info then please review my last comment to answer those questions.  I don't want to distract from what it sounds like Carrzkiss has working and it might be better if that uses another Captcha method.  If not we can always continue with what we were working on so just let us know.

bol
0
 

Author Comment

by:slegy
ID: 23859071
Again, thank you so very much for your input. I spent most of yesterday experimenting, without hopeful results. But I did make some discoveries. I was able to get reCaptcha working and I looked at the alternative method, which I also like. Both methods require a form action which sends the result of the image input to another .asp page. In reCaptcha the validation page presents the user input form with passed variables and allows the user to keep trying until he/she gets the number right. In order to do this, the validation form action is itself.

The stumbling block is that my form updates an Access database. In Dreamweaver CS3 adding the Server Behavior "Insert Record" automatically changes the form action to: <form action="<%=MM_editAction%>" method="POST" name="eventAdd" id="eventAdd">
As far as I can tell, changing the action results in an "Insert Record" error which would prevent the db from being updated.

The alternative method looks a little more promising (I think). It appears that I have to get all the code (form validation, captcha validation and database update) all in one page.

I will be working on this all day and will report results.
0
 
LVL 31

Assisted Solution

by:Wayne Barron
Wayne Barron earned 1000 total points
ID: 23859260
What you do is have the INSERT on the page where you assign the Captcha form to go.
Say:   FormInsert.asp
Once you successfully do the Captcha. Have the Form on the FormInsert.asp page.
Do a Request.form on each of your fields, and then Submit using the OnLoad event.
<body onLoad="document.InsertForm.submit()">
This way there is no other user intervention needed.

And you should be good to go.

Carrzkiss
0
 

Author Comment

by:slegy
ID: 23860716
Thank you. I believe I understand what you mean. That is the direction I was trying to head yesterday. Another stumbling block I ran into was doing a request on a field from a dropdown list. I couldn't see how to get the request working for those.
0
 

Author Comment

by:slegy
ID: 23862755
Dropdown list is not a problem. I'm planning to validate the fields in the first form and simply display the results in the second. Now for the hard part. Will keep you updated.
0
 

Author Comment

by:slegy
ID: 23884350
I tried this and it seems to work. However, before we end this, can you explain when the submit takes place. When I've done onload in the past, the action occurs when the page is loaded. In this case, the submit can't take place until the validation is complete. In the testing I've done it appears that it takes place immediately.
 
0
 

Author Closing Comment

by:slegy
ID: 31546980
Thank you so much for all your time and input. By combining your suggestions with what I learned testing, I have multiple pages very close to working. I apologize for my utter confusion in the beginning.
0
 
LVL 31

Expert Comment

by:Wayne Barron
ID: 23893432
You are welcome.
Have a good one.

Carrzkiss


Author Comments:
Thank you so much for all your time and input. By combining your suggestions with what I learned testing, I have multiple pages very close to working. I apologize for my utter confusion in the beginning.
0
 
LVL 54

Expert Comment

by:b0lsc0tt
ID: 23900081
Your welcome!  I'm glad I could help.  Thanks for the grade, the points and the fun question.
bol
0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

I found this questions asking how to do this in many different forums, so I will describe here how to implement a solution using PHP and AJAX. The logical flow for the problem should be: Write an event handler for the first drop down box to get …
This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
The viewer will receive an overview of the basics of CSS showing inline styles. In the head tags set up your style tags: (CODE) Reference the nav tag and set your properties.: (CODE) Set the reference for the UL element and styles for it to ensu…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
Suggested Courses
Course of the Month20 days, 2 hours left to enroll

873 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question