
fred at redhotpenguin
Dec 6, 2011, 11:09 AM
Post #6 of 16
(985 views)
Permalink
|
|
Re: Is it me or is mod_perl extremely dangerous?
[In reply to]
|
|
(cc'ing mod_perl list) On Tue, Dec 6, 2011 at 5:35 AM, Desilets, Alain <Alain.Desilets [at] nrc-cnrc> wrote: > Thx to Fred, Andre and Jon for answering. BTW: I hope I didn't offend anyone. What I really meant was: No offense taken at all. Welcome to mod_perl! > > "Is it me or is mod_perl *much more slippery than standard CGI*?" > > I know that there are lots of folks out there using mod_perl, so I assume it can be used in a safe way. I am just trying to figure out where the slippery patches are, and how easy it will be to slip on them for me, my team, my external collaborators, and even writers of CPAN modules. > > The last point is important. Fred wrote: > > " Most developers find it useful to use CPAN modules which are generally high quality." > > That's what I do also. In fact, I don't think I have ever used a third party module that wasn't from CPAN, and they are, as you say, generally high quality. > > However, even those high quality CPAN modules can fall flat on their face when they are used in contexts that they weren't designed for. For example, I recently discovered that several CPAN modules cannot be used safely in a multithreaded or forked environment. Some of them fail "nicely" (i.e. they KNOW they aren't supposed to be used in this kind of environment and tell you at run time), but others just crash the process upon spawning a new fork or thread, and leave you with no indication as to what caused this. I am concerned that similar issues might arise when using certain CPAN modules in a mod_perl context. > > --- > Question: Is this something that has been known to happen (CPAN modules that don't work well in mod_perl), and if so, how common is it? > --- > > Coming back to where the slippery patches are. Initially, it looked to me that the main thing to watch out for was global variables. By this, I mean variables that can be seen from anywhere in the code. I was OK with that, because I never use global variables, and I have taught everyone in my team to stay away from them. Also, I don't see global variables being used in CPAN modules. > > But after doing a couple experiments, I now realize that package variables are also unsafe in a mod_perl environment. Although I try to avoid them, I don't consider package variables to be "sloppy". Even though they are public and can be seen outside of the package, they can only be seen by those files which actually load the package. So, I am a bit more uncomfortable with that particular slippery patch, because I know that I and some of my team members use package variables occasionally. I also see lots of CPAN modules that use them as well. > > One thing that I think will greatly mitigate the risk for us is that we use Test Driven Development, and have PerlUnit tests for every class in our application. This forces us to write our classes that don't assume they will be used in a single CGI script call context. That's because the tests process instantiated and uses a the class several times in a number of tests and scenarios. But I think this will only help to a point. It's one thing to have a process that runs dozens of tests on a class, but it's a completely different thing to have a process which uses that class to execute thousands of requests per day, and which stays up and running for months at a time. > > I guess the only way to find out whether mod_perl works for us is to try it, while keeping the door for going back to standard CGI in case our app is too brittle for it. > > Time to buy a mod_perl cookbook I guess ;-). > > Again, thx for your useful answers. > > Alain > > -----Original Message----- > From: Fred Moyer [mailto:fred [at] redhotpenguin] > Sent: Monday, December 05, 2011 4:45 PM > To: Desilets, Alain > Cc: mod_perl list > Subject: Re: Is it me or is mod_perl extremely dangerous? > > On Mon, Dec 5, 2011 at 1:06 PM, Desilets, Alain > <Alain.Desilets [at] nrc-cnrc> wrote: >> I'm a complete newbie to mod_perl, and after reading the following >> documentation: >> >> http://perl.apache.org/docs/1.0/guide/porting.html >> >> I am scared witless by the fact that many variables don't get reinitialized >> between calls to the CGI scripts. >> >> Particularly scary is the example provided on that page, where the >> authentication status is stored in a global variable that doesn't get >> reinitialized. In that example, if Joe logs into the system, and Jane then >> runs the script, she can get access to the system also without every logging >> in, because Joe's authentication status is still there. YIKES! > > If you read through the entire example, you will see the point of the > example is to show what can happen from bad programming. > > "Because of sloppy programming, a global variable was not reset at the > beginning of the program and voila, you can easily peek into someone > else's email! Here is an example of sloppy code" > >> But I'm not convinced, because package variables are not reinitialized >> either! > > "The solution is trivial--reset $authenticated to 0 at the beginning > of the program." > >> But... we don't have control over how third party modules were implemented, >> and we use A LOT OF THEM. So I am still very concerned about that, because >> we could end up using a third party module that makes use of package >> variables in a way that is not mod_perl friendly. > > You're always free to write your own modules which you have complete > control over. Most developers find it useful to use CPAN modules > which are generally high quality. > > >> Am I being too conservative here, or am I right to be that nervous? > > I do not think you are justified in stating that mod_perl is > 'extremely dangerous'. > > >> What precautions can we take to prevent this sort of thing from happening? > > If you are just starting out with mod_perl, I would skip over the > porting documentation and go straight to the mod_perl2 specific > documentation. I would also suggest reviewing the following links for > mod_perl development best practices > > http://perl.apache.org > > http://www.modperlcookbook.org/ > > http://modperlbook.org/
|