Archive
License Plate #API available in #Canada with VehicleRegistrationAPI.ca

Canada has a population of 38 million, with a car ownership ratio of 87%, meaning an estimated 33 million cars drive on Canada’s streets, and we’ve just launched an API that will allow business users determine the Make, Model, VIN , Fuel, Transmission, and other technical details from the license plate of the vehicle.
This API can be used for many different scenarios such as;
- Auto Insurance: Faster and externally verified customer onboarding. Less customer-drop off while entering their vehicle data. Customers are more likely to know their own license plate, than their own VIN number. Plus you can be sure that the customer is not entering misleading information about their vehicle.
- Car parts: Less mis-ordered parts, and added confidence in the order process for consumers. Customers can get their vehicle details incorrect, or ask you to order parts that are not suitable for their vehicle. Instead of wasting time and money returning incorrect parts to suppliers, using a vehicle license plate lookup can help ensure you are buying the correct parts, first time round. It also helps boost consumer confidence in the order process, they know they are buying a part specifically for THEIR car, not just a part that hopefully will fit!
- Second hand car sales: Make it easy for sellers to quickly add their vehicle to your sales portal. If you are tracking more visitors to your “sell your car” page, than actually list a car for sale, then you have a customer drop off. A few percentage points is always unavoidable, but if you’re loosing 10%, 20%, 50% of potential sellers because you are not capturing information from them in an engaging way?, use this API to engage with sellers, and be the first to list their vehicle for sale and earn your commission.
Go to https://www.vehicleregistrationapi.ca/ to read more.
Car registration plates in Canada use the /CheckCanada endpoint and return the following information:
- Make / Model
- VIN Number
- Body / Trim
- Transmission
- Fuel
Both a License plate and a State are required, where the state is a two letter code as follows;
| Alberta | AB |
| British Columbia | BC |
| Manitoba | MB |
| New Brunswick | NB |
| Newfoundland and Labrador | NL |
| Nova Scotia | NS |
| Northwest Territories | NT |
| Nunavut | NU |
| Ontario | ON |
| Prince Edward Island | PE |
| Quebec | QC |
| Saskatchewan | SK |
| Yukon | YT |
Sample Registration Number:
CKST441 (ON)
Sample Json:
{
“Description”: “Toyota C-HR”,
“RegistrationYear”: “2020”,
“CarMake”: {
“CurrentTextValue”: “Toyota”
},
“CarModel”: {
“CurrentTextValue”: “C-HR”
},
“MakeDescription”: {
“CurrentTextValue”: “Toyota”
},
“ModelDescription”: {
“CurrentTextValue”: “C-HR”
},
“ImageUrl”: “http://vehicleregistrationapi.ca/image.aspx/@VG95b3RhIEMtSFI=”,
“Body”: “Sport Utility”,
“Transmission”: “Automatic CVT”,
“Drive”: “FWD”,
“Trim”: “”,
“VIN”: “JTNKHMBX8L1063053”,
“Engine”: “2.0L L4 DOHC 16V”,
“Fuel”: “Gasoline”
}
#OpenSource list of disposable temporary email providers.

We’ve just compiled a list of 35,000 temporary email domains, with their associated MX-Records (Mail Exchange servers) and IP addresses associated with the MX-Records. This should allow users to not only block known temporary email address domains, but to discover future domains. It’s easier to register a new domain than to get a new IP address and Mail Exchanger.
You can download this file at GITHUB here; https://github.com/infiniteloopltd/TempEmailDomainMXRecords
TempEmailDomainMXRecords
A CSV of temporary email domains with their associated MX Records, in the format
| Domain | MX Record | IP |
|---|---|---|
| tempemail.biz | mx001.tempemail.biz | 78.46.205.76 |
| tempemail.co.za | park-mx.above.com | 103.224.212.34 |
| tempmail.de | tempmail.de | 85.25.13.241 |
| temp-mail.de | tempmail.de | 85.25.13.241 |
| temp-mail.org | mx.yandex.net | 77.88.21.249 |
| temp-mail.ru | mx.yandex.net | 77.88.21.249 |
| tempmaildemo.com | mxlb.ispgateway.de | 80.67.18.126 |
| tempmailer.com | tempmailer.com | 91.250.86.53 |
| tempmailer.de | tempmailer.de | 91.250.86.53 |
| temporarymailaddress.com | temporarymailaddress.com | 37.97.167.105 |
Where Domain is a domain name associated with a temporary email address such as abc123@tempemail.biz the MX record is a Mail-exchange server associated with that domain, and the IP is the IP of the Mail-exchange server.
Blocking user registrations if temporary email addresses are used can be risky, you can end up blocking a legitimate user.
If you block emails using the domain listed in the domain column, then it is very likely the email is temporary, but fresh “disposable” domains will not be discovered.
If you block emails using a domain that uses the same mail exchanger as the mx-record listed in the “MX column” then this is highly risky, since many legitimate russian users use “mx.yandex.net”, (yandex being the russian equivalent of Google). However patterns of dispostable emails can be discovered and blocked on a case by case basis.
This is an open-source list and we do invite users to contribute by raising pull requests. Please give credit to our work, if you use it. https://www.infiniteloop.ie/
Open Source multilingual #CookieBanner script for #Bootstrap

Under Article 5 Paragraph 3 of the EU ePrivacy Directive (Directive 2009/136/EC) and respective implementations of the Directive into national law of the EU member states, the setting of individual cookies on the user’s terminal equipment that are not strictly necessary for the functioning of the website is only allowed if the user has given his or her prior consent.
Which translated into normal-speak, is that you should ask your users to consent to cookies before you place them on your user’s browser.
While we develop this for our own website, we’ve open-sourced the work, to invite others to perfect, what we’re working on.
Please feel free to Fork, or submit a pull request at https://github.com/infiniteloopltd/CookieBanner if you want to suggest changes or improvements.
Supports the following languages;
English, Czech, Danish, German, Greek, Spanish, Estonian, Finnish, French, Hebrew, Croatian, Hungarian, Islandic, Italian, Latvian, Norwegiam, Dutch, Portuguese, Russian, Slovak, Slovenian, and Ukrainian
With automatic browser-language detection.
Automatically translate RESX Resource files using #Azure Cognitive Translator in C#

You should always have your RESX files manually translated by a professional translator, but if you’re in a hurry and quality is less important than speed, then you can use an automated translator. But be warned, you could be saying silly text on your website.
So, given a source, English text Resx, and an output file, we’ll say in Russian, we can define our main method as follows;
static void Main(string[] args)
{
var inputFile = @"C:\Users\fiach\Desktop\Strings.en-NZ.resx";
var outputFile = @"C:\Users\fiach\Desktop\Strings.ru-RU.resx";
var inputXml = File.ReadAllText(inputFile);
var xDoc = new XmlDocument();
xDoc.LoadXml(inputXml);
var dataNodes = xDoc.SelectNodes("//data");
foreach (XmlNode dataNode in dataNodes)
{
var english = dataNode.SelectSingleNode("value").InnerText;
Console.WriteLine(english);
var russian = Translate(english, "en", "ru");
Console.WriteLine(russian);
dataNode.SelectSingleNode("value").InnerText = russian;
}
File.WriteAllText(outputFile, xDoc.InnerXml);
}
Then, we implement the Translate method as follows;
public static string Translate(string text, string fromLanguage, string toLanguage)
{
try
{
const string strKey = "**************";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 |
SecurityProtocolType.Tls |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls12;
var url = string.Format("https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&to={0}&from={1}", toLanguage, fromLanguage);
var wc = new WebClient();
wc.Headers["Ocp-Apim-Subscription-Key"] = strKey;
wc.Headers["Ocp-Apim-Subscription-Region"] = "westeurope";
wc.Encoding = Encoding.UTF8;
var jPost = new[] { new { Text = text } };
var post = JsonConvert.SerializeObject(jPost, Newtonsoft.Json.Formatting.Indented);
wc.Headers[HttpRequestHeader.ContentType] = "application/json";
var json = "";
try
{
json = wc.UploadString(url, "POST", post);
}
catch (WebException exception)
{
string strResult = "";
if (exception.Response != null)
{
var responseStream = exception.Response.GetResponseStream();
if (responseStream != null)
{
using (var reader = new StreamReader(responseStream))
{
strResult = reader.ReadToEnd();
}
}
}
throw new Exception(strResult);
}
var jResponse = JArray.Parse(json);
var translation = jResponse.First["translations"].First["text"].ToString();
return translation;
}
catch
{
return text;
}
}
You also need the Newtonsoft.JSON Nuget package for this, and an API key too!
Automatically add #Sedo verification to a batch of domain names using #NameCheap #API

If you are listing domains on Sedo, it’s likely that you have a number of domains, and perhaps instead of going through the process of manually adding the CNAME record to every domain, you can use NameCheap’s API in C# to automatically add CNAME records.
This is a follow-on to the previous blog post, shown below; Classes mentioned in this post will not be repeated, so you should follow this first;
Given a list of domains in a text file (one domain per line), add this to the project with the build action “copy always”.
var domains = File.ReadAllLines("domainList.txt");
foreach (var domain in domains)
{
Console.WriteLine(domain);
var domainTld = Regex.Match(domain, @"\.\w+$").Value;
var domainWithoutTld = domain.Replace(domainTld, "");
domainTld = domainTld.Substring(1);
var hosts = GetHostsFromDomain(domainWithoutTld, domainTld);
Thread.Sleep(TimeSpan.FromSeconds(1));
hosts.Add(new HostRecord { Name = "***ID***", Type = "CNAME", Value = "verify.sedo.com" });
Thread.Sleep(TimeSpan.FromSeconds(1));
SetHostRecords(domainWithoutTld, domainTld, hosts);
Thread.Sleep(TimeSpan.FromSeconds(1));
}
Where evidently ***ID*** is replaced with your own personal ID from Sedo. The one second delays are to help prevent throttling, which the NameCheap API uses to prevent abuse.
And, if you’re interested, this is the list of domains that is going on sale;
webserverdown.com
vatapi.co.uk
universaltravelsearch.com
u2fapi.com
tweetjs.com
tempemailaddress.com
resxtranslate.com
printfromwindowsphone.com
printfromipad.com
outsourcetranslation.com
omadataobjects.com
listoftaxis.info
listofpubs.info
listofhotels.info
listofhauliers.info
listofestateagents.info
listofdevelopers.info
listofcardealers.info
listofbanks.info
javatiger.com
installipa.com
gotoeuro.net
freetextuk.com
freebiesms.com
freebiebitcoin.com
electoralrollapi.com
domaindeflect.com
dns-js.com
derrycreativescollective.com
createfreeapp.com
burnersms.com
airportdelays.org
User Registration Form .com – A #Javascript library to handle user registration and login.

Every website nowadays has a login and register page, and as a developer this boilerplate code takes up time, and gets little credit. Using this JavaScript library, you can manage users, and associate data with your users that will be persisted remotely, all without any server-side coding. It’s secure, fast, and simple to use – and above all it’s free.
User Registration Form.com is a JavaScript library that you can drop into a page that will perform basic user login / registration and allow you store data to associate with that user. It also has a password reset functionality, to allow your users reset their password if they forget it.
Quick Start
Include a reference to our JS library in the head of your page:
<script src="https://userregistrationform.com/user.js"></script>
To handle a new user registration, use this code
user.apiKey = "1A6F4B67DB0937D50386054DE40AA767";
user.email = "you@company.com";
user.password = "a-strong-password";
user.register().then(() => {
// This happens after a successful login
location.href = "Dashboard.html#" + user.id;
}).catch(() => {
// This happens if the registration fails.
alert("register failed");
});
To handle a user login, use this code:
user.apiKey = "1A6F4B67DB0937D50386054DE40AA767";
user.email = "you@company.com";
user.password = "a-strong-password";
user.login().then(() => {
// This happens after a successful login
location.href = "Dashboard.html#" + user.id;
}).catch(() => {
// This happens if the login fails
alert("login failed");
});
You can also perform a user login using the user id alone, as follows:
user.apiKey = "1A6F4B67DB0937D50386054DE40AA767";
user.id = "{user id here}";
user.login().then(() => {
// user is now logged in
}).catch(() => {
alert("Login failed");
});
Once logged in you can store data pertaining to the user by setting the “data” property as follows:
user.data = "Anything";
Although persisting data for a user is fast, it’s not instant, so you shouldn’t navigate away from the page until the data is saved, you can check for this by using the code;
user.data = "Anything";
user.onSetData = () => {
// Safe to leave the page now.
};
Please be aware that if you intend to store personally identifiable information in the data field, you must comply with GDPR. You must let your users know that their data is being stored with Infinite Loop Development Ltd, and your users must give informed consent for this. Your data will be deleted if you do not follow GDPR guidelines.
FAQs:
Add Email verification
If you need your users to verify their email address before having full access to your system, then you can do this in conjunction with an email library such as SMTPJS.COM
The flow would be as follows;
- User Registers
- After registration, an email is sent with a link containing the user.id
- On visiting this url, your page sets user.data to “verified” and then to the dashboard
- User Logs in
- If the user.data is not set to “verified”, then access is denied, otherwise the user is sent to the dashboard.
Add a password reset
There is no way to recover a lost password, but you can ask a user to reset his/her own password. You will need a means to send email, and we recommend SMTPJS.COM for this.
The flow would be as follows;
- User requests a password reset
- An email is sent to the email address of the user with a link to a password reset page.
- On the password reset page, the following code is executed;
async function reset() {
user.apiKey = "1A6F4B67DB0937D50386054DE40AA767";
user.email = "you@company.com";
user.password = "new-password";
try {
await user.resetPassword();
alert("password reset ok");
} catch (e) {
alert("password reset failed");
}
}
List all users
On an admin page of your website, you can list all the users of under your account, by calling the following code:
async function list() {
user.apiKey = "1A6F4B67DB0937D50386054DE40AA767";
user.password = "**root password here**";
try {
var list = await user.list();
alert(JSON.stringify(list));
} catch (e) {
alert("list failed");
}
}
Since your root password is visible on this page, you should make sure that your admin page is not accessible to unauthorized visitors. The user list returned will contain all user ids, user email, and user data. If needed, you can assume the identity of one of your users by using the user id provided in the return data.
Connect a user with Shopping cart, CMS system, product X
This system is designed to be flexible enough, such that you can store any data you need regarding a user (up to 8Kb of data). Instead of storing plain text, like the examples above, you can also store JSON, so that you can represent a Shopping basket of products, or a rich CMS user profile with name, address and contact details. The user ID is always represented by a GUID (Genuinely unique Identifier), so it is statistically impossible for there to be an overlap between the ID returned by User.js and any other system. Although we’re unlikely to be able to offer free advice on how to connect this system to your Product X, it’s beyond the remit of our support for this free software. If you would like to sponsor the development of a feature, please contact us.
Asynchronous Pre-Request script in #Postman

A Pre-request script in Postman allows you to dynamically change the request body based on any JavaScript function you provide, this sometimes is done to dynamically calculate HMACs in the request, such that you don’t have to manually calculate it before every request.
However, it’s not obvious how to create an asynchronous pre-request script, that is one that does not return instantly, but has to wait for some external factor (i.e. a HTTP Request), before completing the main request.
Here is the simple example, where we want to inject the user’s IP address into the HTTP request body before sending; as follows –
new Promise(resolve =>
pm.sendRequest("http://checkip.amazonaws.com/",function(e, r){
pm.request.body.update(JSON.stringify(r.text()));
resolve();
})
);
And, the main request will not execute until the promise returned in the pre-request script is resolved.
Firewall rules to allow internal connection to #AWS Elastic IP

This is probably a very specific problem, that I’m not sure that many people will have, but I’ll share the problem and solution here, since it’s not very obvious.
Given a piece of software, with a config file containing a DSN. I want the DSN to be the same on Dev as on Production, so that there are no “Works on my machine” errors.
My server on AWS has an Elastic IP, and a windows firewall to permit remote access to limited IP addresses to the Database port.
On Dev, we point the DSN to the Elastic IP, and all is good. On Prod, the same Elastic IP times out. — help!!
SQLCMD LOCALHOST -> Works
SQLCMD PRIVATE IP -> Works
SQLCMD ELASTIC IP -> Times out (only on same machine)
Obviously “LOCALHOST” and “PRIVATE IP” are not going to work from DEV.
So, the solution; Add the ELASTIC IP into the Scope on the Firewall !!
Comparing #OCR services on #handwritten text.
| 1 | Filename | Image | Tesseract | OCR.SPACE | Azure | IRON OCR | AWS Texttract | AWS Textract (DDT) | |
|---|---|---|---|---|---|---|---|---|---|
| 2 | 1457617912-CROP.jpg | 1FTME1HL84DA439N | 1FTNELGLRDATNG | 1FT 4L87DA73914 | 1FT4L87DA73914 | ||||
| 3 | 1457617924-CROP.jpg | MGPWUEWLML | DLEPLLL1R29LDSL | LD4GP4412R296096 | LD4GP4412R296096 | ||||
| 4 | 1457638629-CROP.jpg | 2STME20U071MEM | JTNCR2000776480GL | ||||||
| 5 | 1457643042-CROP.jpg | 5H63H5H8SFHTFM | SHEKHSHESTMTHY | BHGGKSH85FM7499 | BHGGKSH85FM7499 | ||||
| 6 | 1457670471-CROP.jpg | JNFML3WFNSWSS3 | IN4 | IN4. | |||||
| 7 | 1457670537-CROP.jpg | LNEPALBAPEMWM | ()VE-IV 1 | ANDPALZAPLENZFRST | LNPAL3, | LNPAL3, | |||
| 8 | 1457677623-CROP.jpg | TUBM1FXMGW1AG1 | TTRMEX1WUS1720S | JTJBMTEXIH5176297 | JTJBMTEXIH5176297 | ||||
| 9 | 1457677635-CROP.jpg | MJHSHGB91 | JTTTRMTEXHES17963932 | JTJ8M7FX1H5176397 | JTJ8M7FX1H5176397 | ||||
| 10 | 1457734011-CROP.jpg | FWHATSGSGCMDWW | 9UUASCSATATL | 1944A86509ALY7 | 1944A86509ALY7 | ||||
| 11 | EASY-CROP.jpg | WAUDH74F16N117113 | WAUDH74F16N117113 | WAUDH74F16N117113 | WAUDH74F16N117113 | WAUDH74F16N117113 | WAUDH74F16N117113 |
Given 10 images, 9 containing handwritten text, 1 containing printed text, I ran these through five different OCR services to compare accuracy. Each one could correctly interpret the printed text, but the handwritten text was not accurately recognised by any service, except for AWS Textract.
There were a few “didn’t run” contenders, because I couldn’t get their API to work in the time I allotted myself (one hour). Which were FileStack, Mindee, and Google Cloud Vision. These may have returned better results but the APIs were too convolute to run a simple test.
First up is Tesseract, which was some software running locally, with the following additional parameters,
-psm 8 -c tessedit_char_whitelist=ABCDEFGHJKLMNPRSTUVWXYZ0123456789
What does this mean. Well – the text are handwritten VIN numbers, which do not include the letters O, I and Q because these are too similar to numbers, and the text was in uppercase, and one word.
Tesseract made a good attempt, and fared very well against commercial offerings, but in effect, it was wrong on each example apart from the printed text.
OCR.SPACE is a free OCR API, and was easy to get started with; You should get your own API key, but this key is free, so I don’t care if it’s public
private static string OcrSpace(string imageFileLocation)
{
var postData = "apikey=b8fd788a8b88957";
postData += "&url=" + HttpUtility.UrlEncode(imageFileLocation);
const string strUrl = "https://api.ocr.space/parse/image";
var web = new WebClient();
web.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");
var json = "";
try
{
json = web.UploadString(strUrl, postData);
}
catch (WebException ex)
{
var resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
Console.WriteLine(resp);
}
var jParsed = JObject.Parse(json);
var result = jParsed["ParsedResults"].FirstOrDefault();
return result["ParsedText"] + "";
}
This code takes in an image URL and returns text – very simple, but it returns an empty string when it fails to recognise, so it was one of the worst performers.
Microsoft Azure computer vision was pretty useless too with handwritten text. Returning either nothing or complete garbage. Although it was very fast.
private static string Azure(string imageFileLocation)
{
const string strUrl = "https://westeurope.api.cognitive.microsoft.com/vision/v1.0/ocr?language=unk&detectOrientation=true";
var wc = new WebClient();
wc.Headers["Ocp-Apim-Subscription-Key"] = "**REDACTED**";
var jPost = new { url = imageFileLocation };
var post = JsonConvert.SerializeObject(jPost, Formatting.Indented);
var json = wc.UploadString(strUrl, "POST", post);
var jObject = JObject.Parse(json);
var output = "";
foreach (var region in jObject["regions"])
{
foreach (var line in region["lines"])
{
foreach (var word in line["words"])
{
output += word["text"] + " ";
}
output += Environment.NewLine;
}
}
return output.Trim();
}
IRON OCR is also based on tesseract, and preformed similarly to the local Tesseract version. Very easy to use, but comes with a price tag. Not having to upload the image to temporary storage is a plus.
private static string ironOCR(string filename)
{
var engine = new IronTesseract
{
Configuration =
{
WhiteListCharacters = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789",
}
};
var Result = engine.Read(filename).Text;
return Result;
}
The winning service that I tried was AWS textract, and I tested it using their online demo:
https://eu-west-1.console.aws.amazon.com/textract/home?region=eu-west-1#/demo
Here is the equivalent code;
private static string Textract(string filename)
{
var readFile = File.ReadAllBytes(filename);
var stream = new MemoryStream(readFile);
var client = new AmazonTextractClient();
var ddtRequest = new DetectDocumentTextRequest
{
Document = new Document
{
Bytes = stream
}
};
var detectDocumentTextResponse = client.DetectDocumentText(ddtRequest);
var words = detectDocumentTextResponse.Blocks
.Where(b => b.BlockType == BlockType.WORD)
.Select(b => b.Text)
.ToArray();
var result = string.Join("", words);
return result;
}
#Ajax #Proxy add HTTP proxy support to Ajax requests with AjaxProxy.com

This is a new tool that developers can add to their toolbelt. AjaxProxy.com transparently permits the use of HTTP proxies from JavaScript Ajax requests. It also bypasses CORS restrictions, to help with accessing services not designed for direct consumption from client-side JavaScript.
AjaxProxy.com
What is it
If you need to use a HTTP Proxy with Ajax, this polyfill library will allow you to specify a HTTP proxy to be used with Ajax requests. This could be useful to ensure that your Ajax requests come from a fixed IP address.
Quickstart
Step 1;
Add the library AjaxProxy.js from the following URL
<script src=”https://www.ajaxproxy.com/js/ajaxproxy.js”><script>
Step 2;
Before any Ajax requests are made, call
ajaxProxy.init();
Step 3:
Define your Proxy server as follows;
ajaxProxy.proxy.url = “http://<your proxy>”;
ajaxProxy.proxy.credentials.username = “<proxy username>”;
ajaxProxy.proxy.credentials.password = “<proxy password>”;
Step 4:
If you are using JQuery, then modify your $.Ajax to add
headers: ajaxProxy.proxyHeaders()
Such as like follows;
$.ajax({
type: “GET”,
url: “https://ICANHAZIP.COM”,
headers: ajaxProxy.proxyHeaders(),
dataType: “text”
}).done (function (data) {
console.log(data);
});
If you are using plain XHR requests, then add xhr.addProxyHeaders();
Such as shown below;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState === 4 && this.status === 200) {
console.log(this.responseText);
}
};
xhr.open(“GET”, “https://ICANHAZIP.COM”, true);
xhr.addProxyHeaders();
xhr.send();
Step 5:
If you run your code, then the request should be proxied through your proxy server.
Under the hood.
What is happening? In effect, this goes through two levels of proxies, first your request is sent to an AWS Lambda function, which checks for the following http request headers;
X-target : The destination URL
X-proxy : The proxy HTTP Address
X-proxy-username: The proxy username
X-proxy-password: The proxy password
Please note that if your proxy is limited by IP address, then this technique will not work, since the egress IP for the AWS Lambda function is dynamic. You will need a proxy that is either open (not advised), or restricted by username and password.
The AWS Lambda function will then make a connection to your proxy server, and supply it with the original destination URL, and will pass through other common headers such as the Content-Type and Authorization headers.
Additional security
Using the technique above, your proxy username and password will be visible to anyone who can view the source of your website. If you have an intranet, and trust your users, then this may be fine, however, we do recommend taking the following security step;
You can encrypt your proxy username and password by calling:
ajaxProxy.Encrypt(“password”);
Which will return a string such as follows
:ENCRYPTED:H20n0hTqmOduBYNOatwApO1almPAr/ue
You can pass this string in place of the username and/or password and the script will do the decryption under the hood.
There is no public method to reverse this encryption, so it is not possible for an attacker to reverse engineer your password without stealing our private keys, which we keep secret.
Additions / Requests
This library has been offered for free, it was developed for internal use, but we are offering it to the public out of goodwill and public service. Please do not abuse this service, we will throttle requests from excessive usage.
If you would like an addition to this software, or need help with your specific application, then we may be able to help. However, nothing in this life is for free, so we do invite you to sponsor this project, if you would like an addition or change made to it.
We can supply source code if required, under NDA, please contact us for more information.