{"id":337,"date":"2025-11-04T22:44:00","date_gmt":"2025-11-05T03:44:00","guid":{"rendered":"https:\/\/www.jaysonbrush.com\/?p=337"},"modified":"2026-02-04T22:53:15","modified_gmt":"2026-02-05T03:53:15","slug":"improving-plex-movie-poster-display","status":"publish","type":"post","link":"https:\/\/www.jaysonbrush.com\/index.php\/2025\/11\/04\/improving-plex-movie-poster-display\/","title":{"rendered":"Improving the Plex Movie Poster Display"},"content":{"rendered":"\n<p class=\"lead\">I forked the popular Plex Movie Poster Display project to address security vulnerabilities that made it risky to expose on a home network. Here&#8217;s what I changed and why it matters.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Background<\/h2>\n\n\n\n<p><a href=\"https:\/\/github.com\/MattsShack\/Plex-Movie-Poster-Display\">Matt&#8217;s Plex Movie Poster Display<\/a> is a great project that shows currently playing media on a dedicated display. When nothing is playing, it cycles through random posters from your unwatched library. I use it with a <a href=\"\/raspberry-pi-digital-signage\/\">Raspberry Pi kiosk<\/a> in my home theater.<\/p>\n\n\n\n<p>The original project works well, but it had security issues that concerned me\u2014even for an internal application. Credentials stored in plaintext, no session management, and no CSRF protection are habits that shouldn&#8217;t exist in any codebase.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Security Improvements<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Bcrypt Password Hashing<\/h3>\n\n\n\n<p><strong>Before:<\/strong> Passwords stored in plaintext in the config file.<\/p>\n\n\n\n<p><strong>After:<\/strong> Passwords are hashed using bcrypt. Even if someone accesses your config file, they won&#8217;t see the actual password.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Session Timeout<\/h3>\n\n\n\n<p><strong>Before:<\/strong> Sessions never expired.<\/p>\n\n\n\n<p><strong>After:<\/strong> Automatic logout after 30 minutes of inactivity. If you forget to log out of the settings panel, you&#8217;re not left exposed indefinitely.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CSRF Protection<\/h3>\n\n\n\n<p><strong>Before:<\/strong> Forms had no protection against cross-site request forgery.<\/p>\n\n\n\n<p><strong>After:<\/strong> All forms include CSRF tokens, preventing malicious sites from submitting requests on your behalf.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Secure Session Handling<\/h3>\n\n\n\n<p><strong>Before:<\/strong> Basic session management with no security considerations.<\/p>\n\n\n\n<p><strong>After:<\/strong> Proper session initialization, regeneration on login, and complete destruction on logout.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Token Validation<\/h3>\n\n\n\n<p><strong>Before:<\/strong> Plex token was used without validation.<\/p>\n\n\n\n<p><strong>After:<\/strong> Token is validated before the display loads, preventing errors and potential information leakage.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why This Matters<\/h2>\n\n\n\n<p>&#8220;It&#8217;s just an internal tool&#8221; is how security vulnerabilities become habits. Every project\u2014regardless of where it runs\u2014should follow security best practices:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Never store passwords in plaintext<\/li>\n<li>Always implement session timeouts<\/li>\n<li>Protect forms against CSRF<\/li>\n<li>Validate all inputs and tokens<\/li>\n<\/ul>\n\n\n\n<p>These aren&#8217;t just rules for production applications. They&#8217;re habits that should be automatic.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Get the Fork<\/h2>\n\n\n\n<p>The secured version is available on GitHub: <a href=\"https:\/\/github.com\/jaysonbrush\/Plex-Movie-Poster-Display\">jaysonbrush\/Plex-Movie-Poster-Display<\/a><\/p>\n\n\n\n<p>Installation is the same as the original\u2014just clone, configure, and deploy. If you&#8217;re running this on a Raspberry Pi kiosk, check out my <a href=\"\/raspberry-pi-digital-signage\/\">digital signage guide<\/a> for the full setup.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I forked the popular Plex Movie Poster Display project to address security vulnerabilities that made it risky to expose on a home network. Here&#8217;s what I changed and why it matters. Background Matt&#8217;s Plex Movie Poster Display is a great project that shows currently playing media on a dedicated display. When nothing is playing, it [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_links_to":"","_links_to_target":""},"categories":[30],"tags":[],"class_list":["post-337","post","type-post","status-publish","format-standard","hentry","category-projects"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/posts\/337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/comments?post=337"}],"version-history":[{"count":1,"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/posts\/337\/revisions"}],"predecessor-version":[{"id":338,"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/posts\/337\/revisions\/338"}],"wp:attachment":[{"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/media?parent=337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/categories?post=337"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jaysonbrush.com\/index.php\/wp-json\/wp\/v2\/tags?post=337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}