Cluesheet - Tips for PHP Developers compiled by Trevor Lowing
special thanks to:

Security
- Do use PDO parameters over SQL values to avoid SQL injection.
- Do use htmlspecialchars/htmlentities and/or strip_tags to escape html and JavaScript to avoid XSS exploits.
- Do use sessions and secure sockets to prevent session hijacking. Use md5 checksums to validate session ids. Store a special token md5(uniqueid(rand(),time)) in the session and bump it against a hidden field in the post form. eg. $_SESSION["token"]===$FORM["token"].
- Do use escapeshellarg/escapeshellcmd for calling exec to avoid command injection.
- Do remove linebreaks from incoming headers to prevent early header termination and injection. Fixed >PHP5.1
- Use md5 checksum on serialized values and sessionid to validate integrity.
- Use === to verify input values to ensure type matching.
- Do use security through obsurity:
- ini_set("display_errors",false);
- ini_set("log_errors",true);
- ini_set("error_log","path/to/php.log");
- ini_set("session.save_path","path/above/www"); or "mm" session module or store in a sqllite db
- php.ini expose_php=off
- php.ini register_globals=off
- Apache servertokens=prod
- Use session_regenerate for any user privledge escalation in application.
- Use secure sockets SSL for commerce transactions.
Performance
- Do use single quotes over double quotes.
- Do use switch over lots of if statements
- Do avoid testing loop conditionals with function tests every iteration eg. for($i=0;i<=count($x);$i++){...
- Do use foreach for looping collections/arrays.
- PHP4 items are byval
- >PHP5 items are byref
- Do consider using the Singleton Method when creating complex PHP classes.
- Do use POST over GET for all values that will wind up in the database for TCP/IP packet performance reasons.
- Do use ctype_alnum,ctype_alpha and ctype_digit over regular expression to test form value types for performance reasons.
- Do use full file paths in production environment over basename/fileexists/open_basedir to avoid performance hits for the filesystem having to hunt through the file path. Once determined, serialize and/or cache path values in a $_SETTINGS array. $_SETTINGS["cwd"]=cwd(./);
- Do use require/include over require_once/include_once to ensure proper opcode caching.
- Do use tmpfile or tempnam for creating temp files/filenames
- Do use a proxy to access web services (XML or JSOM) on foreign domains using XMLHTTP to avoid cross-domain errors. eg. foo.com<-->XMLHTTP<-->bar.com
- Do use error_reporting (E_ALL); during debug.
- Do set Apache allowoverride to "none" to improve Apache performance in accessing files/directories.
- Do use a fast fileserver for serving static content (thttpd). static.mydomain.com, dynamic.mydomain.com
- Do serialize application settings like paths into an associative array and cache or serialize that array after first execution.
- Do use PHP output control buffering for page caching of heavilty accessed pages
- Do use PDO prepare over native db prepare for statements. mysql_attr_direct_query=>1
- Do NOT use SQL wildcard select. eg. SELECT *
- Do use database logic (queries, joins, views, procedures) over loopy PHP.
- Do use shortcut syntax for SQL insers if not using PDO parameters parameters. eg. INSERT INTO MYTABLE (FIELD1,FIELD2) VALUES (("x","y"),("p","q"));
Tools
New Technologies/Techniques
Speakers/Sites/Blogs/Lectures