Block Uploads of Adult or Nude Images using PHP.
Wall Script
Follow Me:
Sunday, January 12, 2014

Block Uploads of Adult or Nude Images using PHP.

I found an interesting and useful class file in phpclasses.org, that helps to detect image nudity based on skin pixel score developed by Bakr Alsharif from Egypt. I had integrated this with my previous tutorial Ajax image upload with Jquery and PHP, sure this code helps you to block adult or nudity images.

Block Uploads of Adult or Nude Images using PHP.



Download Script     Live Demo

Sample database design for Users.

Users
Contains user details username, password and email etc.
CREATE TABLE `users` (
`uid` int(11) AUTO_INCREMENT PRIMARY KEY,
`username` varchar(255) UNIQUE KEY,
`password` varchar(100),
`email` varchar(255) UNIQUE KEY
)

Sample values.
INSERT INTO `users`
(`uid`, `username`, `password`, `email`)
VALUES
('1', '9lessons', MD5('password'), 'srinivas@9lessons.info');

Javascript Code
$("#photoimg").on('change',function(){})- photoimg is the ID name of INPUT FILE tag and $('#imageform').ajaxForm() - imageform is the ID name of FORM. While changing INPUT it calls FORM submit without refreshing page using ajaxForm() method. Uploaded images will <i>prepend</i> inside <i>#preview</i> tag.
<script type="text/javascript" src="http://ajax.googleapis.com/
ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="jquery.wallform.js"></script>
<script type="text/javascript">
$(document).ready(function()
{

$('#photoimg').on('change', function()
 {
var A=$("#imageloadstatus");
var B=$("#imageloadbutton");

$("#imageform").ajaxForm({target: '#preview',
beforeSubmit:function(){
A.show();
B.hide();
},
success:function(){
A.hide();
B.show();
},
error:function(){
A.hide();
B.show();
} }).submit();
});

});
</script>
Here hiding and showing #imageloadstatus and #imageloadbutton based on form upload submit status.

index.php
Contains simple PHP and HTML code. Here $session_id=1 means user id session value.
<?php
include('db.php');
session_start();
$session_id='1'; // User login session value
?>
<div id='preview'>
</div>
<form id="imageform" method="post" enctype="multipart/form-data" action='ajaximage.php'>
Upload image: 
<div id='imageloadstatus' style='display:none'><img src="loader.gif" alt="Uploading...."/></div>
<div id='imageloadbutton'>
<input type="file" name="photoimg" id="photoimg" />

</div>
</form>


ajaximage.php
Contains PHP code. This script helps you to upload images into uploads folder. Image file name rename into timestamp+session_id.extention
<?php
include('db.php');
session_start();
$session_id='1'; // User session id
$path = "uploads/";

function getExtension($str)
{
$i = strrpos($str,".");
if (!$i)
{
return "";
}
$l = strlen($str) - $i;
$ext = substr($str,$i+1,$l);
return $ext;
}

$valid_formats = array("jpg", "png", "gif", "bmp","jpeg","PNG","JPG","JPEG","GIF","BMP");
if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST")
{
$name = $_FILES['photoimg']['name'];
$size = $_FILES['photoimg']['size'];
if(strlen($name))
{
$ext = getExtension($name);
if(in_array($ext,$valid_formats))
{
if($size<(1024*1024)) // Image size max 1 MB
{
//---Image Filter Code
require_once('class.ImageFilter.php');
$filter = new ImageFilter;
$score = $filter->GetScore($_FILES['photoimg']['tmp_name']);
if(isset($score))
{
if($score >= 60) // Score value If more than 60%, it consider as adult image. 
{
echo "Image scored ".$score."%, It seems that you have uploaded a nude picture :-(";
}
else
{
//---Image Filter Code 
$actual_image_name = time().$session_id.".".$ext;
$tmp = $_FILES['photoimg']['tmp_name'];
if(move_uploaded_file($tmp, $path.$actual_image_name))
{
mysqli_query($connection,"UPDATE users SET profile_image='$actual_image_name' WHERE uid='$session_id'");
echo "<img src='uploads/".$actual_image_name."' class='preview'>";
}
else
echo "failed";
//---Image Filter Code 
}
}
//---Image Filter Code 
}
else
echo "Image file size max 1 MB";
}
else
echo "Invalid file format..";
}
else
echo "Please select image..!";
exit;
}
?>

db.php
Database configuration file, just modify database credentials.
<?php
error_reporting(0);
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'username');
define('DB_PASSWORD', 'password');
define('DB_DATABASE', 'database');
$connection = @mysqli_connect(DB_SERVER,DB_USERNAME,DB_PASSWORD,DB_DATABASE);
?>

35 comments:

  1. nice ,very nice...

    ReplyDelete
  2. Nice integration. I am sad though. This has blocked a small baby's photo. :(

    ReplyDelete
  3. Interesting script here, from the image filter class it seems you can use it for much more than just nude picture. Cool.

    ReplyDelete
  4. Blocks only color images, tested it with some black and white and passed all.

    ReplyDelete
  5. It dosnt allow faces eighter.

    ReplyDelete
  6. Nice but not enough! Based on skin color. It seems we can change the score value. How about BW pictures? Or portrait photos?

    Useful link and documents
    An Algorithm for Nudity Detection
    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.96.9872&rep=rep1&type=pdf

    Nude.JS
    https://github.com/pa7/nude.js/blob/master/nude.js

    ReplyDelete
  7. good article as always :)

    ReplyDelete
  8. It's working pretty good but not perfectly..some nude pics r getting uploaded with out showing any error message..but still impressive...

    ReplyDelete
  9. This is very good script while image uploading to validate nudity basically for images.

    ReplyDelete
  10. very nice. liked it. ty.

    ReplyDelete
  11. Please change the score value 40 to 60 in download script.

    if($score >= 40)

    to

    if($score >= 60)

    ReplyDelete
  12. Being able to blur unwanted images is cool idea!

    ReplyDelete
  13. I've tested the online demo and the code allowed my upload attempt of one nude image they wasn't blocked or blured or anything in the image, the script is working(online)?
    i've used color image.
    i will try it locally, looks good script
    i will try it localy.

    ReplyDelete
  14. do you have any idea about securing image?
    what if user upload some malicious php script and they changed its extensions before upload.

    ReplyDelete
  15. do you have any idea about securing image?
    what if user upload some malicious php script and they changed its extensions before upload.

    ReplyDelete
  16. That is an execellent tutorial but i just want to know that if there is such a class which can detect the nudity of the video file instead of image file.

    ReplyDelete
  17. working! well i'm taking back my last comment!

    ReplyDelete
  18. yup.. useful share.Its a common problem in a family who use internet in home.
    Nice sharing

    ReplyDelete
  19. The code works perfectly fine at localhost. However the same code at the server seems like stuck into an infinite for loop and I just see the loading image.

    Any quick help Srinivas Tamada?

    ReplyDelete
  20. That Great Way and very nice Sri
    Great info thank you !

    ReplyDelete
  21. nice..but with some minor glitches. (mostly) gray pictures were considered as nude.

    ReplyDelete
  22. really a great post. thanks for sharing this great post

    ReplyDelete
  23. Great script! I like the concept but before reading others' comments. I feared it would have issues with portraits, but together with other validation checks, or even administrator intervention, it would be excellent.
    As for user being able to upload malicious script by changing file extension, use file mime type for validation. Eg.
    if ($sourceFile_type == 'application/octet-stream'){ -- File is executed, deny upload -- }
    if ($sourceFile_type == 'image/jpeg'){ -- File is GENUINE JPEG, Allow upload -- }
    User would not be able to fool php to upload any format other than what you accept.

    ReplyDelete
  24. Can this be made into a WordPress plugin ?

    ReplyDelete
  25. Thank you for this code..im creating social network application...its very useful..

    ReplyDelete
  26. Does anyone have a script which can block Malware, Virus and corrupt jpeg image from uploading on your server.?

    ReplyDelete
  27. For corrupt image, u may check for file size like if ($imgfileSize == "0"){ ...Uploaded file corrupted or missing } though this wouldn't detect an image that is partially corrupted or whose data string is truncated. A partially corrupted file may b complicated at times coz it may b fine apart from having a potion of img replaced by plain color (uniform pixels) which to software cld b the same as the sky, or a plain wall so this may require human discretion to verify.

    ReplyDelete
  28. It is better to leave a link of php author in a matter of respect.

    ReplyDelete
  29. I tested this with photos of different skin tone, and the darker the person the more it made it through. I also tested this with a photo of an Egyptian desert and it was blocked.

    ReplyDelete
  30. i have many erros like this ......
    Notice: imagecolorat(): 605,539 is out of bound .......

    ReplyDelete