Saturday, August 16, 2008

Filter bad language with Delphi / Pascal...

This has been adapted from a ISAPI web application. The first step is to fill a TStringList with a list of bad words, or even characters that you don't want to save into your database.

I've call my StringList BWSL. After initializing the StringList, and adding the words, loop through and see if any of the words you've added are present.

If they are, redirect, or use other handling depending on the type of application you're writing. My form element on the calling web page is in the variable "Tag"

EXAMPLE:


---------------------------------------------------------------------------------
for I:=0 to BWSL.Count-1 do
if pos (BWSL.Strings[I], LowerCase(tag)) > 0 then begin
Response.SendRedirect(Request.ScriptName+'/BadRequest?Bid=6&Extra=The_Word,_Character,_or_Phrase,_' + BWSL.Strings[I] +'_is_Prohibited.');
Exit;
end;
---------------------------------------------------------------------------------

Friday, August 15, 2008

Keep an eye open with Netstat Steps to secure your windows web server


For those of you running your own servers, with all the illegal hacking activity, it's a good idea to keep your eyeballs peeled to your open connection with netstat or a similar utility.

It's fairly easy to track an ip address with website services, such as the one here » Ip Look up.

I keep a utility on my desktop that monitors the flow of traffic through my NIC. when this stays lit for extended periods, it mean non-stop traffic. Now sense I'm a website publisher that earns revenue from his websites, you'd normally think that that was a good thing. Of course if you notice twenty or more open pipes from the same IP address, it certainly could indicate trouble. If that IP address is coming from China, then well it's really up in the air.

What to do???

Well for on thing you can take every precaution that you can to secure your server. Now I run a Windows server, so I started off by hardening my machine with what the operating system offers. Closing unused ports, turning off unneeded and dangerous services. You can learn how to do some of this over at Gibson Research.

Second you have to have a firewall. I have a good one, and allow only port 80 traffic inbound.

Third you download IISLOCKDOWN. You can use this to configure IIS to be a ton more secure.

Fourth you can set up IPSEC. For the novice user, IPSEC can be a bit daunting. Don't worry there are plenty of tutorials like this one to get you started. It's well worth all the trouble to set things up to be as bullet proof as you can. This still will not prevent bots, or other people from sending a lot of traffic to your port eighty. So in IPSEC configure a rul that will block users by IP address, and as you find suspicious IP addresses in your logs, or with netstat, block them.

It's every webmaster's responsibility to run as secure a server as they have the power to. Fortunately there are many resources devoted to this topic, it just takes a little time. (And effort!)

Thursday, August 14, 2008

Use Crystal Reports in Delphi ISAPI Web Application

Well obviously, you may have tried to use the VCL component, and cashed and burned repeatedly. I took my a long time to properly integrate Crystal reports with an Isapi application through delphi. After literally weeks of research in 2004 I was able to properly utilize almost all of Crystal's functionality inside an ISAPI.

Why am I just now writing about this? Well.. As time rolls on, the technology is still viable. Especially if you have a tone of Crystal reports you'd like your users to be able to download in .Doc or .PDF formats.

Here Goes...

Import the Crystal Reports type library, save it as CRAXDRT_TLB; (into new unit) This would apply to Crystal Reports version 9. Don't forget to add the "cr" in front of the object names!!!


Here's the source code example: Please forgive any poor formatting on my part I wrote an automated .Pas to HTML conversion program, in about ten minutes, and right now it's imperfect. So I will work on that program as I continue to post Delphi Tips. Thanks and enjoy.

PLEASE LEAVE ME A COMMENT IF YOU LIKE!


---------------------------------------------------------------------------------
procedure TWebModule1.WebModule1WaExportReportAction(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var CrReport : Report;
NewStream : TStream;
TheReportType :CRExportFormatType;
S, TheCType : String;
begin
try


//For Initilization purposes only

TheReportType:= CRAXDRT_TLB.crEFTPortableDocFormat;

//End Initialization

////Use the value of a web page radio button to determine the type of export ////the users desires.

If TheButtonVal='PDF' then begin
TheReportType:= CRAXDRT_TLB.crEFTPortableDocFormat;
TheCType:='application/pdf'
end;
If TheButtonVal='DOC' then begin
TheReportType:= CRAXDRT_TLB.crEFTWordForWindows;
TheCType:='application/doc'
end;
If TheButtonVal='XLS' then begin
TheReportType:= CRAXDRT_TLB.crEFTExcel80;
TheCType:='application/xls'
end;
If TheButtonVal='RTF' then begin
TheReportType:= CRAXDRT_TLB.crEFTExactRichText;
TheCType:='application/rtf'
end;

///You could use the actual report name added to a select element using ///Delphi's ///FindFiles...
CrReport := Application1.OpenReport('DirectoryName\'+TheReportName);

CrReport.DiscardSavedData;
CrReport.EnableParameterPrompting:=False;
CrReport.DisplayProgressDialog:=False;
if TheButtonVal='PDF' then
CrReport.ExportOptions.PDFExportAllPages;

if CrReport.ParameterFields.Count=1 then
CrReport.ParameterFields.Item[1].AddCurrentValue(Code1);
////Depending upon any parameter values the Report uses and how they are //configured, these lines could change.
if CrReport.ParameterFields.Count=2 then begin
CrReport.ParameterFields.Item[1].AddCurrentValue(Code2);
CrReport.ParameterFields.Item[2].AddCurrentValue(Code3);
end;
CrReport.ExportOptions.FormatType :=TheReportType ;
CrReport.ExportOptions.DestinationType :=CRAXDRT_TLB.crEDTDiskFile;

/////Give the created report a destination on disk, and name
CrReport.ExportOptions.DiskFileName :=

CrReport.Export(False);

NewStream:=TFileStream.Create(the name you created above),
fmOpenRead and fmShareDenyWrite);
Response.ContentStream:=NewStream;
//IMPORTANT
Response.ContentType:=TheCType;
Response.SetCustomHeader('content-disposition', 'attachment; filename=YourShortFileName));
Except
Response.SendRedirect('Your Error Handling Page')
end;
end;
---------------------------------------------------------------------------------

Tuesday, August 12, 2008

How To "Really" Make Application Splash Screen in Delphi



Anybody else think Zarco Gajic is an idget sometimes? No seriously, I AM KIDDING. However, after looking at his how to create a splash screen in Delphi code, I realized to really make a cool splash screen in Delphi... something else would be needed.

This article will accomplish three things.

1. It will provide you code on how to prevent your application from running more than one instance.

2. It will create a splash screen that will show during your applications start up.

3. It will animate into view (fade) the splash screen. This effect although simple really adds "Splash" to your Delphi splash screen.

To Begin »

First those of you who are unfamiliar with how to view the source of your .EXE or Delphi project file simply right click in the Delphi project manager on the .exe and select view source.

That will open up the project source id the IDE editor window. Take a look at how your current source is laid out. It will appear similar to that below. Below is the full source code you will need to create the three effects outlined above.

You'll obviously need to create a new form and name it FrmSplash. Remove it from the available forms section via Projects » Options » Forms.

You'' also need to add "Windows", "Dialogs" & "Forms" if not present in the source's USES clause. Follow the code and it will dress up your Delphi application in a nice way.


-------------------------------------------------------------------------------------
program xyz;

uses
Windows,
Forms,
Dialogs,
MdiUnit in 'MdiUnit.pas' {FrmMain},

{$R *.res}

var
MyProgramNameMutex: Thandle;
I : Integer;

begin
MyProgramNameMutex:=CreateMutex(nil, False, 'MyProgramNameMutex');
if WaitForSingleObject (MyProgramNameMutex, 0) <> Wait_TimeOut then
begin
Application.Initialize;
Application.Title := 'My Program Name';
//Create Splash Screen

with TFrmSplash.Create(nil) do

try
Show;
Update;

// AnimateWindow(Handle, 1000, AW_HIDE Or AW_BLEND); Lame Code that don't work!~
for I := 0 to 255 do begin
AlphaBlendValue := I;
Sleep(10);
Application.ProcessMessages;
end;
Application.CreateForm(TFrmMain, FrmMain);

finally
Free;

end;
Application.Run;
end

else begin
MessageDlg(Application.Title+' is already running!!!', mterror, [mbok], 0);
Application.BringToFront;
Application.RestoreTopMosts;
end;
end.

-------------------------------------------------------------------------------------

Monday, August 11, 2008

Wikipedia full of spam YUM!


Yep. Wikipedia is full of spam at least on the entry for freight payment service that I started years ago. Apparently users from Data2Logistics added a link inside along with a snippet. Since they provide freight payment service, how is this not SPAM? Tell me again, HOW IS THIS NOT SPAM?

Another reason wikipedia is full of crap. I used to be the webmaster for the Logistics Group, who also provided freight payment services. I didn't add our url to the entry, simply created to ORIGINAL entry, and linked to it from our site. Pretty smart way back in the day like five years ago.

Luckily the Wikipedia entry for freight payment service still comes up BEHIND my website: http://www.freightpayment.net. » BlogSwallow I say!

Friday, August 8, 2008

Yep! Cuil Still Sucks

Cuil claims to index more pages than most other search engines. However, most of the top result are crap pages, and old pages at that. I mean with developers supposedly coming out of the Google camp to open this dog of a search engine, you think they would at least rank new content first.

When your site comes up first (in every other search engine that means anything) "Except CUIL", you know that anchor phrase you've been diligently linking with since time began... it's time to just quietly close your index, or do something to improve very quickly.

It also pretty much means that it (CUIL) doesn't factor in backlinks at all. Quality results are what is sorely lacking from Cuil and it takes more to run a search engine than sheer volume of index. I don't mind the layout, I don't mind the weird images that sometimes pop up, but when a snippet thief or a directory listing comes up before your own site, there's a fundamental flaw in the way Cuil indexes, and outputs top results.

Improvements are always possible, but heck, my internal site search displays better results than cuil does. Or course I am using DELPHI!