PDA

View Full Version : مشکل خبر نامه



ghanbarloo
سه شنبه 03 مرداد 1391, 11:49 صبح
سلام به دوستان
من یه خبر نامه دارم که مشکلاتی داره که دوستان فرمودند اینجا مطرح کنم .
من می خواهم افرادی که ایمیلشونو وارد میکنن یه لینک تایید به ایمیلشون ارسال بشه
که این انجام میشه
و یه لینکی تو ایمیل باشه که وقتی کلیک کردن ایمیلشون تایید بشه .
حالا ایمیل می ره
اما وقتی رو لینک داخل ایمیل کلیک میشه تو دیتابیسه اکتیو نمیشه

فایل فرم صفحه اولیه برای دریافت ایمیل از کاربر



<html>

<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Join to Us...</title>
</head>

<body>
<p style="text-align: right;"><strong>* توجه: پر کردن فیلدهای به رنگ <span style="color: #f00;">قرمز</span> الزامی و پر کردن سایر فیلدها اختیاری می باشد.</strong></p>
<div style="text-align: justify;"><form style="font-family: Tahoma; font-size: 12px;" dir="rtl" action="send.php" method="post">
<table width="100%" border="0" cellspacing="5" cellpadding="5">
<tbody>
<tr>
<td colspan="3"><strong>اطلاعات هویتی:</strong></td>
</tr>
<tr>
<td colspan="3"><strong>الف - حقیقی</strong></td>
</tr>
<tr>
<td style="color: #c00;" width="27%">نام</td>
<td colspan="2"><input type="text" name="Name" /></td>
</tr>
<tr>
<td style="color: #c00;">ایمیل</td>
<td colspan="2"><input type="text" name="Email" /></td>
</tr>
<tr>
<td colspan="2" align="middle"><input type="reset" value="پاک کردن" /></td>
<td width="65%"><input style="text-align: center;" onMouseOver="if(name.value=='' || first.value==''||kod.value==''||mobile.value=='' ||sabet.value=='' ||email.value==''||user.value==''||pass.value==''| |r_pass.value=='') alert(' لطفا رکورد های ستاره دار را پر نمایید. '); " type="submit" value="ارسال" /></td>
</tr>
</tbody>
</table>
</form></div>
<p style="text-align: justify;">&nbsp;</p>
</body>

</html>

فایل دوم برای send.php



<?php
include("config.php");
//Check The Form is Submitted!?2- چک کنيم ببينيم که کاربر از طريق فرم وارد اين صفحه شده يا نه همين طوري آدرس زده و اومده تو ...

if(!isset($_POST['Name']))
exit();

$Name = $_POST['Name'];
$Email = $_POST['Email'];

//Trim the Strings...4- براي اين که فضاهاي خالي (Space) که کاربر در ابتدا و انتها وارد کرده از بين برود از تابع trim استفاده مي کنيم.

$Name = trim($Name);
$Email = trim($Email);
//Check Empty Email Addr...5- بررسي مي کنيم که کاربر حتما ايميل را وارد کرده باشد (چون در اين برنامه نام مهم نيست اون رو چک نمي کنيم)

if(empty($Email))
die("Please Enter your Email Address!");
//Set The special HTML Characters 2 HTML Codes 6- جايگزيني کاراکتر هاي خاص HTML با مقدار نمايشي آن (اين کار براي اينه که کاربر نتونه کد HTMl و يا JavaScript به برنامه ما تزريق کنه)

$Name = htmlspecialchars($Name);


//Remove Slashes...از داخل نام کاربر کاراکتر ' را حذف ميکنيم که توي کار با ديتابيس دچار مشکل نشويم...
$Name = str_replace("'", "", $Name);


//Convert Email Address to Lower Case حروف آدرس ايميل را به حروف کوچک تبديل ميکنيم تا همه جا يکدست باشه...
$Email = strtolower($Email);


//Check For Valid Email Address Expression9- بررسي ميکنيم که آدرس ايميل کاربر از نظر عبارتي درست هست يا نه ... (بعدا يه جلسه مفصل در موردش توضيح مي دم)

if(!preg_match("/^[\.A-z0-9_\-]+[@][A-z0-9_\-]+([.][A-z0-9_\-]+)+[A-z]{2,4}$/", $Email))
die("Invalid Email Address!");




/*Check Exist...10 - بررسي مي کنيم که ايميلي که کاربر وارد کرده قبلا در ديتابيس ذخيره شده يا نه ...

$Sql = "SELECT COUNT(*) FROM `user`
WHERE `email` = '$Email'";

//Connect to database...
connect();

$Result = mysql_query($Sql) or die(mysql_error() . "<br>SQL: " . $Sql);
if(mysql_result($Result, 0) > 0 )
die("This Email Address already Exist!");

*/
//Create A Random Security Code...11- يه کد امنيتي توليد مي کنيم تا کاربر بوسيله اون بتونه عضويت خودش رو فعال کنه

$RandomNum = rand(0, 9999);
$SecCode = md5($RandomNum);

//Calculate The Today Date...تاريخ امروز
$Today = date("Ymd");

$sql="INSERT INTO user (name,email,active,join_date,sec_code)
VALUES

( '$Name','$Email', '0', '$Today', '$SecCode')";
if (!mysql_query($sql,$con))
{
die('Error: ' . mysql_error());
}
echo "با تشکر از شما ";

mysql_close($con);
//<!-- Start of Mail Body
$MailBody = '
Salam dooste aziz,
Az in ke dar khbar nameye ma ozv shodehid kheyli mamnoonim.
lotfan baraye faal shodan acount khod bar rooye link zir click nemayeed

http://www.yazahra135.ir/Active.php?Email='. $Email .'&SecCode='. $SecCode .'

Ba tashakor,
Movafagh bashid.';

// End of Mail Body-->

mail($Email , "Active your acount", $MailBody);

?>



فایل Active.php برای اکتیو کردن



<?
//Active.php
include("config.php");

//Check The Link is Correct
if(!isset($_GET['Email']) && !isset($_GET['SecCode']))
exit();


//Set The variables...
$Email = $_GET['Email'];
$SecCode = $_GET['SecCode'];

//Update The Acount ...
$Sql = "UPDATE user
SET
active = '1'
WHERE
email = '$Email'

";

//Connect to database...
connect();

//Execute The SQL...
$Result = mysql_query($Sql) or die(mysql_error() . "<br>SQL: " . $Sql);

//Check Affected Rows...
if(mysql_affected_rows() == 1)
die("Your acount successfully activated!");
else
die("No acounts activated!");


?>


البته من در آدرس زیر این فرم رو گذاشتم
http://www.yazahra135.ir/

colors
سه شنبه 03 مرداد 1391, 12:45 عصر
درود

ظاهرا مشکلی نیست. ولی کلا این الگوریتمش اشتباه هست. مثلا الان این SecCode چکاری انجام میده؟؟ هیچ.

در ضمن امنیتی هم نداره و میشه به راحتی با ایمیل هر کسی عضو شد.
من یه نمونه ساده میزارم و کار دیتابایش با خودتون.


این بخش عضویت

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Register</title>
</head>

<body dir="rtl">
<form action="register.php" method="post">
<table width="0" border="1" align="center" cellpadding="10" cellspacing="1">
<tr>
<td>نام</td>
<td><input name="name" type="text" /></td>
</tr>
<tr>
<td>ایمیل</td>
<td><input name="email" type="text" /></td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input name="" type="submit" value="ارسال" /></td>
</tr>
</table>
</form>
</body>
</html>

اینم صفحه register.php

<?php

######################
## CONNECT TO DATABASE
######################

if(isset($_POST['name']) && $_POST['name']!=''){
if(isset($_POST['email']) && $_POST['email']!=''){
$name = mysql_real_escape_string($_POST['name']);
$email = mysql_real_escape_string($_POST['email']);

if(filter_var($email, FILTER_VALIDATE_EMAIL)){
#############################################
## چک کردن ایمیل برای اینکه قبلا ثبت نشده باشه
#############################################

// تولید کد تصادفی
$SecCode = '';
for($i = 0; $i < 10; $i++){
$SecCode .= rand(0 , 500);
}
$SecCode = md5($SecCode);

// درج کاربر در دیتابایس
$sql = "INSERT INTO `user`(`id`, `name`, `email`, `seccode`, `active`) VALUES (NULL, '$name', '$email', '$SecCode', '0')";
$query = mysql_query($sql);

if($query){
$email_content = 'Salam,
http://www.yazahra135.ir/Active.php?Email='.$email.'&SecCode='.$SecCode.',
Bye...';
#######################
## ارسال ایمیل به کاربر
#######################
}
else{
exit('<h1>Error! 4</h1>');
}
}
else{
exit('<h1>Error! 3</h1>');
}
}
else{
exit('<h1>Error! 2</h1>');
}
}
else{
exit('<h1>Error! 1</h1>');
}

?>


تقریبا یه همچنین چیزی هم برای صفحه Active.php

<?php

######################
## CONNECT TO DATABASE
######################

if(isset($_GET['Email']) && $_GET['Email']!=''){
if(isset($_GET['SecCode']) && $_GET['SecCode']!=''){
$email = mysql_real_escape_string($_GET['Email']);
$SecCode = mysql_real_escape_string($_GET['SecCode']);

if(filter_var($email, FILTER_VALIDATE_EMAIL)){
#############################################
## چک کردن ایمیل برای اینکه قبلا ثبت نشده باشه
#############################################


// جستجوی کاربر برای صحت ایمیل و کد فعالسازی
$sql = "SELECT * FROM `user` WHERE `email` = '$email' AND `seccode` = '$SecCode' AND `active` = '0';";
$query = mysql_query($sql);

if(mysql_num_rows($query)===1){
// مقدار فیلد اکتیو کابر رو 1 میکنیم و ادامه ...
}
else{
// کاربری یا این مشخصات وجود ندارد
}
}
else{
exit('<h1>Error! 3</h1>');
}
}
else{
exit('<h1>Error! 2</h1>');
}
}
else{
exit('<h1>Error! 1</h1>');
}

?>

ببخشید چون شرایطش نیست نتونستم تست کنم ولی این الگوریتم مناسبه و فکر نکنم کدها مشکلی داشته باشه.
بخش های دیتابایس رو خودت ویرایش کن و ...

سوالی بود بپرس با دوستان جواب میدیم

desatir7316
سه شنبه 03 مرداد 1391, 13:07 عصر
http://net.tutsplus.com/tutorials/php/how-to-implement-email-verification-for-new-members/

ایجا یه نمونه رو کامل درست کرده
یه سر بزن

ghanbarloo
سه شنبه 03 مرداد 1391, 13:36 عصر
با تشکر از شما
این یک پروژه ساده هستش و امنیت زیاد مهم نیست

desatir7316
سه شنبه 03 مرداد 1391, 14:08 عصر
سلام
یه چیزی آماده کردم که خیلی سادس و فقط خواستم منظور رو برسونم
البته اون لینکی که اونجا گذاشتم خیی خوب گفته، یه نگاهی بهش بنداز:
این جدولم:
CREATE TABLE IF NOT EXISTS `news` (
`username` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`security` varchar(255) NOT NULL,
`enable` tinyint(1) DEFAULT '0'
) ENGINE=MyISAM

فایل index.html یا index.php

<html>
<form action="register.php" method="get">
name:<br/>
<input type="text" name="usrename"/>
<br/>
email:<br/>
<input type="text" name="email"/>
<br>
<input type="submit" value="register"/>

</form>

اینم register.php : البته من این برنامه رو سیستم خودم تست کردم، توی این فایل به جای اون دستور چاپ یه ایمیل بفرست:

<?php
echo "welcom";
mysql_connect("localhost","root","");
mysql_select_db("ali");
$name=$_GET['usrename'];
$email=$_GET['email'];
$pass=md5($name);
$sql="insert into news values('".$name."','".$email."','".$pass."','0');";
mysql_query($sql);


echo '<a href="activate.php?username='.$name.'&email='.$email.'">click here</a>';

?>


اینم activate.php:


<?php
$username=$_GET['username'];
$email=$_GET['email'];
$pass=md5($username);

mysql_connect("localhost","root","");
mysql_select_db("ali");
$sql="update news set enable='1' where username='".$username."' and email='".$email."' and security='".$pass."';";

$result=mysql_query($sql);
if (mysql_affected_rows()==1)
die("hesabe shoma faAl shod");

echo "error";
?>


سعی کردم خیلی ساده باشه به خاطر همین خیلی از چیزها داخلش لحاظ نشده و فقط یه ثبت نام و فعال سازی داره
ا
موفق باشی