Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

Îåêßíçóå áðü ôï ìÝëïò xakou. Τελευταία δημοσίευση από το μέλος xakou στις 15-08-2009, 20:54. Υπάρχουν 7 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-08-2009, 19:03 53050

    πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

    Καλησπέρα,

    το πρόβλημα που αντιμετωπίζω είναι στην αναζήτηση όταν υπάρχουν ελληνικοί χαρακτήρες.

    Και για να γίνω πιο συγκεκριμένος δείτε το παρακάτω.

     

    Εστω ότι το perifoxh.Text είναι "Ελλάδα"

    .....

    targetURL = "~/results.aspx?"

    targetURL &= "perioxh=" & Server.UrlEncode(perioxh.Text)

    Response.Redirect(targetURL)

    στον browser url φαίνεται κάπως έτσι perioxh=%ce%9f%ce%bb%

    .....

     

    Στην επόμενη σελίδα, results.aspx, έχω :

    .....

    If Request.QueryString("perioxh") <> "" Then

    SqlDataSource1.SelectCommand = SqlDataSource1.SelectCommand & " and region='" &  Request.QueryString("perioxh") & "'"

    .....

     

    Αυτό που καταλαβαίνω είναι ότι ναι μεν κάνει κωδικοποίηση τα ελληνικά, αλλά δεν τα κάνει αποδικωδικοποίηση.

    Τοπικά με το vwd 2008 δεν έχω πρόβλημα, Online έχω Sad

     

  •  12-08-2009, 20:09 53051 σε απάντηση της 53050

    Απ: πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

    φτού!!!!!

    Αυτό το Ν με έφαγε 3 ώρες Angry

     

    If Request.QueryString("perioxh") <> "" Then

    SqlDataSource1.SelectCommand = SqlDataSource1.SelectCommand & " and region=N'" &  Request.QueryString("perioxh") & "'"

  •  12-08-2009, 21:28 53052 σε απάντηση της 53051

    Απ: πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

    Αν θέλεις να εξετάσεις με δική σου αποκλειστικά ευθύνη πόσο ευάλωτος σε SQL Injections είναι τέτοιος κώδικας, δοκίμασε να δώσεις ως input στη φόρμα (όχι από κώδικα, από τον browser σαν κανονικός χρήστης) για περιοχή το:

    '; DROP DATABASE; --


  •  12-08-2009, 23:26 53053 σε απάντηση της 53052

    Απ: πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

    nullvoid:
    Αν θέλεις να εξετάσεις με δική σου αποκλειστικά ευθύνη πόσο ευάλωτος σε SQL Injections είναι τέτοιος κώδικας, δοκίμασε να δώσεις ως input στη φόρμα (όχι από κώδικα, από τον browser σαν κανονικός χρήστης) για περιοχή το:

    '; DROP DATABASE; --


     

    Ενδιαφέρον! Αλλά έχω λάθη:

    • όταν δίνω '; DROP DATABASE; --  (με 2 --) έχω το μήνυμα λάθους :

    Incorrect syntax near ';'.

    • όταν δίνω '; DROP DATABASE;  έχω το μήνυμα λάθους :

    Incorrect syntax near ';'.
    Unclosed quotation mark after the character string ' and s9='ORDER BY TablNAME.extra3'

     

    Αλλά όπως και να χει , είδα πως χτυπάει error.

    Το ζήτημα είναι πως θα προστατέψω τα text-boxes από τέτοιου είδους "καταχωρήσεις";

    Να βάλω validator για τα ' (μονά εισαγωγικά) σε κάθε textbox ;

  •  13-08-2009, 16:26 53055 σε απάντηση της 53053

    Απ: πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

    Ο σωστός τρόπος είναι να μην συνθέτεις το query σου προσθέτοντας τα strings αλλά να χρησιμοποιείς κάποιο command αντικείμενο που να δέχεται παραμέτρους. Αυτό θα φροντίσει να κάνει escape όλους τους επικίνδυνους χαρακτήρες. Τα ακριβή αντικείμενα που εμπλέκονται στην λύση του προβλήματος εξαρτώνται από την τεχνική με την οποία συνδέεσαι στη βάση. Για παράδειγμα αν χρησιμοποιούσες ADO.NET κώδικα θα χρειαζόσουν την κλάση DbCommand.
  •  15-08-2009, 12:10 53073 σε απάντηση της 53055

    Απ: πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

    Ωραία το έχω μετατρέψει σε parameterized query και το

    If Request.QueryString("perioxh") <> "" Then

    SqlDataSource1.SelectCommand = SqlDataSource1.SelectCommand & " and region=N'" &  Request.QueryString("perioxh") & "'"

    έγινε κάπως έτσι:

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionStringMark %>"

    SelectCommand="select * FROM demotable where region=@perioxh and extra='2' ">

     <SelectParameters>

    <asp:QueryStringParameter Name="perioxh" QueryStringField="perioxh" Type="String" />

     

    To πρόβλημα είναι ότι το @perioxh ΔΕΝ το πέρνει σαν nvarchar και δεν μου βγάζει τα σωστά αποτελέσματα όταν η @perioxh είναι στα Ελληνικά (αν κάνω αναζήτη greece δεν έχω πρόβλημα, αν κάνω αναζήτηση Ελλαδα τότε δεν το εμφανίζει).

    Δοκίμασα να το κάνω SelectCommand="select * FROM demotable where region=Ν'@perioxh' and extra='2' "> άλλά δεν έπαιξε...

    Παρακαλώ για τη βοήθεια σας.

     

     

  •  15-08-2009, 19:24 53077 σε απάντηση της 53073

    Απ: πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

    xakou, υποψιάζομαι ότι τώρα ξεκίνησες και με ASP.NET αλλά και με ADO.NET. Ο αρχικός σου κώδικας θα ήταν κυριολεκτικά τρομακτικός αν τον έβλεπα σε εμπορική εφαρμογή ή σε web site. Περνάς παραμέτρους στο URL όπου μπορεί οποιοσδήποτε να τις παραποιήσει, δεν κάνεις κανένα έλεγχο ότι η παράμετρος είναι αυτό που περιμένεις, μετά κολλάς την παράμετρο στο query string. Με τον τρόπο αυτό είσαι ορθάνοιχτος ακόμα και στο απλούστερο SQL Injection attack.
    Μην ξεχνάς ότι το Internet είναι γεμάτο scripts που μπορεί να τρέξει ο κάθε άσχετος για να βρει ευάλωτα sites.

    Θα σου πρότεινα να μάθεις μία τεχνολογία τη φορά. Αν προσπαθήσεις να μάθεις ταυτόχρονα και το SqlDataSource και πως δουλεύει το ADO.NET θα μπλεχτείς άσχημα (όπως ήδη συμβαίνει). Αυτή τη στιγμή υποψιάζομαι ότι τα λάθη που αφορούν το ASP.NET νομίζεις ότι αφορούν το ADO.NET και το αντίστροφο. Τα parameterized queries δουλεύουν. Το ίδιο και το SQL Data Source. Δοκίμασε πρώτα να γράψεις ένα σωστό SqlCommand, μετά δοκίμασε να φτιάξεις ένα SqlDataSource ΧΩΡΙΣ QueryStringParameter για να δεις πως δουλεύει το ADO.NET. Αυτό απλά για να βεβαιωθείς ότι δεν υπάρχουν φαντάσματα.

    Μετά, πρόσεξε πως περνάς την παράμετρο. Από τη στιγμή που δεν είναι δυνατόν να περάσουν τα Ελληνικά στο URL θα γίνουν encode. Αν περάσει την encoded παράμετρο όπως είναι, δεν θα έχεις αποτελέσματα. Η παράμετρος θα πρέπει να γίνει decode. Αν το SqlDataSource δεν έχει κάποια παράμετρο η οποία να ενεργοποιεί το decoding θα πρέπει να το κάνεις μόνος σου.

    Επίσης, να επαναλάβω για Νοστή φορά ότι οι ερωτήσεις πρέπει να γίνονται στο κατάλληλο φόρουμ. Αν όχι τίποτε άλλο, όταν σκέφτεσαι που να κάνεις την ερώτηση την καταλαβαίνεις καλύτερα. Είχε καμμία σχέση η ερώτηση σου με WinForms και desktop development? Καμμία. Έχει όμως σχέση με ASP.NET και ADO.NET. Εκεί πρέπει να κάνεις την ερώτηση και σε αυτή την κατεύθυνση πρέπει να ψάξεις για την απάντηση.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  15-08-2009, 20:54 53078 σε απάντηση της 53077

    Απ: πρόβλημα στην αναζήτηση ελληνικών στη ΒΔ

    Παναγιώτης Καναβός:

    xakou, υποψιάζομαι ότι τώρα ξεκίνησες και με ASP.NET αλλά και με ADO.NET. Ο αρχικός σου κώδικας θα ήταν κυριολεκτικά τρομακτικός αν τον έβλεπα σε εμπορική εφαρμογή ή σε web site. Περνάς παραμέτρους στο URL όπου μπορεί οποιοσδήποτε να τις παραποιήσει, δεν κάνεις κανένα έλεγχο ότι η παράμετρος είναι αυτό που περιμένεις, μετά κολλάς την παράμετρο στο query string. Με τον τρόπο αυτό είσαι ορθάνοιχτος ακόμα και στο απλούστερο SQL Injection attack.
    Μην ξεχνάς ότι το Internet είναι γεμάτο scripts που μπορεί να τρέξει ο κάθε άσχετος για να βρει ευάλωτα sites.

    Θα σου πρότεινα να μάθεις μία τεχνολογία τη φορά. Αν προσπαθήσεις να μάθεις ταυτόχρονα και το SqlDataSource και πως δουλεύει το ADO.NET θα μπλεχτείς άσχημα (όπως ήδη συμβαίνει). Αυτή τη στιγμή υποψιάζομαι ότι τα λάθη που αφορούν το ASP.NET νομίζεις ότι αφορούν το ADO.NET και το αντίστροφο. Τα parameterized queries δουλεύουν. Το ίδιο και το SQL Data Source. Δοκίμασε πρώτα να γράψεις ένα σωστό SqlCommand, μετά δοκίμασε να φτιάξεις ένα SqlDataSource ΧΩΡΙΣ QueryStringParameter για να δεις πως δουλεύει το ADO.NET. Αυτό απλά για να βεβαιωθείς ότι δεν υπάρχουν φαντάσματα.

    Μετά, πρόσεξε πως περνάς την παράμετρο. Από τη στιγμή που δεν είναι δυνατόν να περάσουν τα Ελληνικά στο URL θα γίνουν encode. Αν περάσει την encoded παράμετρο όπως είναι, δεν θα έχεις αποτελέσματα. Η παράμετρος θα πρέπει να γίνει decode. Αν το SqlDataSource δεν έχει κάποια παράμετρο η οποία να ενεργοποιεί το decoding θα πρέπει να το κάνεις μόνος σου.

    Επίσης, να επαναλάβω για Νοστή φορά ότι οι ερωτήσεις πρέπει να γίνονται στο κατάλληλο φόρουμ. Αν όχι τίποτε άλλο, όταν σκέφτεσαι που να κάνεις την ερώτηση την καταλαβαίνεις καλύτερα. Είχε καμμία σχέση η ερώτηση σου με WinForms και desktop development? Καμμία. Έχει όμως σχέση με ASP.NET και ADO.NET. Εκεί πρέπει να κάνεις την ερώτηση και σε αυτή την κατεύθυνση πρέπει να ψάξεις για την απάντηση.

    Παναγιώτη έχεις δίκιο, είμαι καινούργιος στην ASP.NET και ADO.NET . Διάβασα για sql injection attacts και για αυτό αλλάζω τον κώδικα. Σαν ερώτηση βέβαια πάνω σε αυτό πως μπορεί ο hacker να βρει το όνομα του table και να το κάνει drop ;

    Δγλαδή αν κατάλαβα καλά μου λες από το παρακάτω να βγάλω το QueryStringParameter ; Δεν πρέπει να δηλωθεί η μεταβλητή @perioxh ;

    <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConnectionStringMark %>"

    SelectCommand="select * FROM demotable where region=@perioxh and extra='2' ">

     <SelectParameters>

    <asp:QueryStringParameter Name="perioxh" QueryStringField="perioxh" Type="String" />

     

    (στην παράγραφο σου 3 δεν πήγα ακόμα)

    Αν νομίζεις πως πρέπει να μετακινηθεί το θέμα σε παρακαλώ κάντο. Μην ξεχνάς πως είμαι αρχάριος όπως λέω και παραπάνω και κάνω ΑΠΕΙΡΑ λάθη. Πολλές φορές εμένα δεν με βοηθάνε και πολύ τα λόγια ή οι χαρακτηρισμοί. Πολύ σωστά αυτά που λες παραπάνω, αλλά θα προτιμούσα να δω και λίγο κώδικα για να το καταλάβω καλύτερα.

     

    Περιμένω με αγωνία την απάντηση σου, γιατί έχω μπλοκάρει...

     

     

    edit-------------------------

    περνάω την παράμετρο με query string από την 1 σελίδα στη 2 endcoded

     

    Dim targetURL As String

    targetURL = "~/results.aspx?"

    targetURL &= "perioxh=" & Server.UrlEncode(perioxh.Text) 

    Response.Redirect(targetURL)

    Μήπως πρέπει να κάνω πρώτα decode όπως λες παραπάνω; Πως το κάνω;

     

     

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems