Jag har säkrat en beloppssträng på detta sätt Det finns fortfarande möjlighet att hitta på bus eftersom tal inte är inneslutna av '. Säg att du har en SQL-fråga som ser ut såhär: <b>För MySQL klarar väl flera frågor separerade med ;?</b> så vänta nu, det är alltså farligt att göra som jag gjort här då? lösningen är alltså att jag måste konvertera till ett tal? Du behöver inte konvertera, kontrollera bara med IsNumeric funktionen att det är ett numeriskt värde före du använder dig av den. Konverteringsfunktionenrna använder aktuell inställd decimalseparator, vilket för svenska är komma och punkt för engelska. tack. Jag hade redan hunnit göra i ordning det med IsNumeric (hoppas det är säkert...) med en tjusig liten felhanterare som skickar tillbaka användaren och highlightar fältet (belopp )som behöver fyllas i rätt, annars hade ju detta varit ett smidigare sätt, att bara kasta ett konverteringsfel om någon försöker tönta sig med inmatningen... Okej, så jag har testat detta med Val() men det verkar som att den funktionen inte finns i VB Script - tänkte du på PHP? Lösningen får bli så här:sträng säker?
var_belopp=Replace(request.form("belopp"),"\","")
var_belopp=Replace(var_belopp,"'","")
var_belopp=Replace(var_belopp,",",".")
fick lite konstiga fel när jag försökte omvandla den till decimaltal eller valuta så jag struntade i det, så här fungerar den i alla fall. Jag undrar bara - om man skriver in bokstäver eller annat tjohej i formulärfältet belopp, då kan ju inte MySQL lägga in det som valuta i databasen, och genererar följdaktligen ett felmeddelande, men är strängen ändå säker? Eller kan man manipulera den så att den kan ställa till med olika rackartyg?Sv: sträng säker?
"INSERT INTO tabell (fält1) VALUES (" & tal & ")"
Om användaren då matar in "0); DROP TABLE tabell;" som accetperas av din kontroll blir resultatet såhär:
"INSERT INTO tabell (fält1) VALUES (0); DROP TABLE tabell;)"
För MySQL klarar väl flera frågor separerade med ;?
/JohanSv:sträng säker?
Inte när man använder funktionerna i PHP. Vet inte om det är en generell säkerhetsåtgärd i C-API:t.
När man kör från MySQL-konsollen eller skriptfiler går det däremot.Sv: sträng säker?
Någon som förstår varför CCur() och CDbl() struntar blankt i punkten/kommat?Sv:sträng säker?
Sv:sträng säker?
Om du har sveksa så ger dig:
Dim Value
Value = CCur("10,01")
Ett värde som är av variant men har undertypen Currency med värdet 10,01.
Om du sedan försöker gör det till en sträng så använder den åter igen inställd decimalseparator.
Dim Value
Dim SQL
Value = CCur("10,01")
SQL = "INSERT INTO TableName (Col) VALUES (" & Value & ")"
Så kommer det att ge sql strängen:
INSERT INTO TableName (Col) VALUES (10,01)
Vilket databasen kommer klaga på. Den tror att du skickar med två värden: 10 och 1.
Ett decimaltal måste alltså ha punkt som decimalseparator i SQL satsen:
INSERT INTO TableName (Col) VALUES (10.01)
Vad du vill göra är att låda användaren mata in tal så som användaren är van vid gör att sedan införa det med ett punkt.
Val() funktionen använder altid punkt som decimalseparator.
Därför borde:
Dim Value
Dim SQL
Value = Val(Replace("10,01", ",", "."))
SQL = "INSERT INTO TableName (Col) VALUES (" & Replace(Value, ",", ".") & ")"
Fungera oavsett decimalseparator eller ge ett fel om man skickar in något annat än ett tal.
MEn ett ADODV.Command objekt slipper du denna problematik med decimalseparator.
Sv: sträng säker?
tack för att du bemödar dig att förklara hur det hela fungerar/varför man behöver Val() istället för den lokalbundna cCur().Sv:sträng säker?
Sv: sträng säker?
belopp=Replace(request.form("belopp"),".",",")
belopp=CDbl(belopp)
belopp=Replace(belopp,",",".")
känns lite omständigt, men vad gör man... och om jag skall köra den med en brittisk Lcid antar jag att jag bara kan skippa den första raden för där använder de ju punkt, då borde väl datorn fatta ändå... eller ja, eftersom MySql och deras Lcid vill ha samma så går det väl bra att använda CCur() där då...