1. PHP Application Security Checklist: 
  2. BASIC 
  3. □  Strong passwords are used. 
  4. □  Passwords stored safely. 
  5. □  register_globals is disabled. 
  6. □  Magic quotes is disabled. 
  7. □  display_errors is disabled. 
  8. □  Server(s) are physically secure. 
  9. INPUT 
  10. □  Input from $_GET, $_POST, $_COOKIE, and $_REQUEST is considered tainted. 
  11. □  Understood that only some values in $_SERVER and $_ENV are untainted. 
  12. □  $_SERVER[‘PHP_SELF’] is escaped where used. 
  13. □  Input data is validated. 
  14. □  \0 (nullis discarded in input. 
  15. □  Length of input is bounded. 
  16. □  Email addresses are validated. 
  17. □  Application is aware of small, very large, zero, and negative numbers. Sci. notation too. 
  18. □  Application checks for invisible, look-alike, and combinining characters. 
  19. □  Unicode control characters stripped out when required. 
  20. □  Outputted data is sanitized. 
  21. □  User-inputted HTML is santized with HTMLPurifier. 
  22. □  User-inputted CSS is sanitized using a white-list. 
  23. □  Abusable properties (position, margin, etc.) are handled. 
  24. □  CSS escape sequences are handled. 
  25. □  JavaScript in CSS is discarded (expressions, behaviors, bindings). 
  26. □  URLs are sanitized and unknown and unwanted protocols are disallowed. 
  27. □  Embedded plugins are restricted from executing JS. 
  28. □  Embedded plugin files (Flash movies) are embedded in a manner so that only the intended plugin is loaded. 
  29. □  The application uses a safe encoding. 
  30. □  An encoding is specified using a HTTP header. 
  31. □  Inputted data is verified to be valid for your selected encoding if using an unsafe encoding. 
  32. FILE UPLOADS 
  33. □  Application verifies file type. 
  34. □  User-provided mime type value is ignored. 
  35. □  Application analyzes the content of files to determine their type. 
  36. □  It is understood that a perfectly valid file can still contain arbritrary data. 
  37. □  Application checks the file size of uploaded files. 
  38. □  MAX_FILE_SIZE is not depended upon. 
  39. □  File uploads cannot “overtake” available space
  40. □  Content is checked for malicious content. 
  41. □  Application uses a malware scanner (if req.). 
  42. □  Uploaded HTML files are displayed securely. 
  43. □  Uploaded files are not moved to a web-accessible directory. 
  44. □  Extensive path checks are used when serving files. 
  45. □  Uploaded files are not served with include(). 
  46. □  Uploaded files are served as an p_w_upload using the Content-Disposition header. 
  47. □  Application sends the X-Content-Type-Options: nosniff header. 
  48. □  Files are not served as “application/octet-stream”, “application/unknown”, or “plain/text” unless necessary. 
  49. DATABASE 
  50. □  Data inserted into the database is properly escaped or parameterized/prepared statements are used. 
  51. □  addslashes() is not used. 
  52. □  Application does not have more privileges to the database than necessary. 
  53. □  Remote connections to the database are disabled if they are unnecessary. 
  54. SERVING FILES 
  55. □  User input is not directly used in a pathname. 
  56. □  Directory traversal is prevented. 
  57. □  Null (\0) in paths filtered. 
  58. □  Application is aware of “:” 
  59. AUTHENTICATION 
  60. □  Bad password throttling. 
  61. □  CAPTCHA is used. 
  62. □  SSL used to prevent MITM. 
  63. □  Passwords are not stored in a cookie. 
  64. □  Passwords are hashed. 
  65. □  Per-user salts are used. 
  66. □  crypt() is used with sufficient number of rounds. 
  67. □  MD5 is not used. 
  68. □  Users are warned about obvious password recovery questions. 
  69. □  Account recovery forms do not reveal email existence. 
  70. □  Pages that send emails are throttled. 
  71. SESSIONS 
  72. □  Sessions only use cookies. (session.use_only_cookies) 
  73. □  On logout, session data is destroyed. 
  74. □  Session is recreated on authorization level change. 
  75. □  Sites on the same server use different session storage dirs. 
  76. 3RD-PARTIES 
  77. □  CSRF issues are prevented with tokens/keys. 
  78. □  Referrers are not relied upon. 
  79. □  Pages that perform actions use POST. 
  80. □  Important pages (logout, etc.) are protected. 
  81. □  Your pages are not written in a way (i.e. JSON, JS-likewhere they can be included and read on a remote website successfully. 
  82. □  Aware that Flash can bypass referrer checks to load p_w_picpaths and sound files. 
  83. □  The following things will not reveal significant information if included remotely: 
  84. □  Images. 
  85. □  Pages that take a longer time to load
  86. □  CSS files. 
  87. □  Existence or ordering of frames. 
  88. □  Existence of a JS variable. 
  89. □  Detected visit of a URL. 
  90. □  Inclusion of your website in an inline frame with JS disabled does not reveal a threat. 
  91. □  Application uses frame bursting code and sends the X-Frame-Options header. 
  92. MISCELLANEOUS 
  93. □  A cryptographically secure PRNG is used for secret randomly-generated IDs (activation links, secret IDs, etc.). 
  94. □  Suhosin is installed or you are not using rand() or mt_rand() for this. 
  95. □  Anything that consumes a lot of resources should be throttled and limited. 
  96. □  Pages that use 3rd-party APIs are throttled. 
  97. □  You did not create your own encryption algorithm. 
  98. □  Arguments to external programs (i.e. exec()) are validated. 
  99. □  Generic internal and external redirect pages are secured. 
  100. □  Precautions taken against the source code of your PHP pages being shown due to misconfiguration. 
  101. □  Configuration and critical files are not in a web-accessible directory. 
  102. □  PHP streams are filtered. 
  103. □  Access to files is not restricted by hiding the files. 
  104. □  Remote files not included with include(). 
  105. SHARED HOSTING 
  106. □  Using a secure shared host where users cannot access the files of other users. 
  107. □  Aware that fellow shared hosting users: 
  108. □  Can, if on the same IP address, issue requests against your site with XMLHttpRequest in IE6. 
  109. □  Can access your website from 127.0.0.1 or ::1. 
  110. □  Can host a server on the same IP address. 
  111. □  Are not “remote” as far as your DB is concerned. 
  112. □  Session & file upload directories are not shared.