paint-brush
Python میں ایک محفوظ فارم بنا کر ای میل سپیم سے بچیں۔ کی طرف سے@tom2
336 ریڈنگز
336 ریڈنگز

Python میں ایک محفوظ فارم بنا کر ای میل سپیم سے بچیں۔

کی طرف سے Rutkat11m2024/09/04
Read on Terminal Reader

بہت لمبا؛ پڑھنے کے لئے

ایک درست ای میل ایڈریس براہ راست مواصلت قائم کرنے، لیڈز پیدا کرنے، سیلز حاصل کرنے، آن لائن کمیونٹیز کے لیے نجی دعوت نامے وغیرہ کا ایک گیٹ وے ہے۔ آپ کی ایپ اور خدمات۔ ہم موجودہ Python ماڈیولز استعمال کرنے جا رہے ہیں جو صارف کے ان پٹ کو صاف کرنے، تصدیقی لنک تیار کرنے، اور ڈیٹا بیس کے ساتھ بات چیت کو آسان بناتے ہیں۔
featured image - Python میں ایک محفوظ فارم بنا کر ای میل سپیم سے بچیں۔
Rutkat HackerNoon profile picture

ایک درست ای میل ایڈریس براہ راست مواصلت قائم کرنے، لیڈز پیدا کرنے، سیلز حاصل کرنے، آن لائن کمیونٹیز کے لیے نجی دعوت نامے وغیرہ کے لیے ایک گیٹ وے ہے۔ اسے معمولی نہ سمجھیں کیونکہ سوشل میڈیا بدل رہا ہے۔ ٹیک میں ارتقاء کے ذریعے، ای میل اب بھی جڑنے کا آزمائشی اور صحیح طریقہ ہے۔ ہم چیزوں کو سادہ رکھیں گے نہ کہ شروع سے کوڈ کیونکہ Python کے پاس موجودہ ماڈیولز ہیں جو آپ کو کوڈنگ کو تیز کرنے میں مدد کرتے ہیں۔


میرے پاس گاہک مجھ سے اپنی مصنوعات کی تشہیر کے لیے ای میل سائن اپ فارم بنانے کے لیے کہتے ہیں، لیکن ان میں سے کوئی بھی صارف 3rd پارٹی آف دی شیلف سروس کے لیے ماہانہ فیس ادا نہیں کرنا چاہتا تھا، اس لیے میں نے حسب ضرورت رابطہ فارم بنا کر ان کے پیسے بچائے کہ وہ ہمیشہ کے لیے استعمال کر سکتے ہیں۔ میں آپ کو ایسا کرنے میں مدد کر سکتا ہوں چاہے وہ آپ کے سٹارٹ اپ، کلائنٹ، مارکیٹنگ کے مقاصد، یا سب سے بہتر، سپیم کو کم کرنے کے لیے ہو۔


یہ ان تمام لوگوں کے لیے ہے جو Python میں کوڈ سیکھنا چاہتے ہیں اور خاص طور پر ان ابتدائی افراد کے لیے مفید ہے جو حفاظتی خصوصیات پر غور نہیں کر سکتے جیسے کہ صارف کے ان پٹ کو فلٹر کرنا، ای میل پتوں کی تصدیق کرنا، اور ای میل ڈبل آپٹ ان۔ اس ٹیوٹوریل میں، ہم مراحل 1-3 کا احاطہ کرتے ہیں:


  1. ایک درست ای میل ایڈریس کے لیے صارف کے ان پٹ کو فلٹر کرنا
  2. ڈبل آپٹ ان سائن اپ کریں۔
  3. بوٹ/سپیم کی روک تھام


ہمیں آپ کی ایپ اور سروسز تک رسائی حاصل کرنے کے لیے فریق ثالث کی سروسز جیسے Auth0، Facebook یا Google کے استعمال پر انحصار کرنے کی ضرورت نہیں ہے جو آپ کو کسی بھی وقت بند کر سکتی ہیں یا آپ کے ڈیٹا کا اشتراک کر سکتی ہیں۔ اپنا ایپ ڈیٹا اپنا رکھیں!


شروع کرتے ہوئے، آپ کو Python میں کچھ تجربہ ہونا چاہیے کیونکہ ہم فلاسک فریم ورک کو MySQL ڈیٹا بیس کے ساتھ استعمال کرنے جا رہے ہیں ۔ یہ ورڈپریس، سب سے زیادہ مقبول CMS استعمال کرنے سے زیادہ مزہ (شاید) ہونے والا ہے۔ آپ کو کچھ ورڈپریس پلگ ان کے لیے ادائیگی کرنا پڑے گی جو ایک مفت فلاسک ایکسٹینشن کے برابر ہے۔ میں نے پہلے ورڈپریس (PHP) پر بنایا ہے اور ویب ایپس کے لیے Python Flask کو ترجیح دیتا ہوں حالانکہ ورڈپریس ویب ایپس بنانے کی بہت صلاحیت رکھتا ہے۔


ہم موجودہ Python ماڈیولز استعمال کرنے جا رہے ہیں جو صارف کے ان پٹ کو صاف کرنے، تصدیقی لنک تیار کرنے، اور ڈیٹا بیس کے ساتھ بات چیت کو آسان بناتے ہیں۔


ہر کوڈ کے ٹکڑوں کی وضاحت کی جائے گی اور کوڈ میں کچھ تبصرے شامل ہوں گے۔ اگر آپ نے صارف کی رجسٹریشن نہیں بنائی ہے یا آپ کو اندرونی کام کا علم نہیں ہے، تو میں آپ کے لیے تفصیلات بیان کروں گا، اور پھر آپ حتمی کوڈ کو آخر میں دیکھ سکتے ہیں (آگے نہ جائیں)۔


یہاں ان خصوصیات کا خلاصہ ہے جسے ہم نافذ کریں گے جیسا کہ پہلے پیراگراف میں بتایا گیا ہے:


  1. ریگولر ایکسپریشن یا فلاسک ایکسٹینشن کا استعمال کرتے ہوئے صارف کے ان پٹ سٹرنگ کو پارس کرکے ایک درست ای میل ایڈریس چیک کیا جا سکتا ہے۔ ہم بے ترتیب متن یا SQL انجیکشن قسم کے ہیکس کی اجازت نہیں دیں گے۔


  2. ڈبل آپٹ ان طریقہ کے لیے وصول کنندہ سے آپ کو ان کے ان باکس میں توثیق کا لنک حاصل کرکے انہیں ای میل کرنے کی اجازت دینے کی ضرورت ہوتی ہے۔ یہ بنیادی طور پر کسی اور کو آپ کا ای میل پتہ استعمال کرنے سے روکنے کے لیے استعمال کیا جاتا ہے۔ یہ جانچنے والے صارفین کو بھی روکتا ہے جو صرف سائن اپ کرتے ہیں اور اپنے اکاؤنٹس کو چھوڑ دیتے ہیں۔


  3. بوٹ کی روک تھام ایک پوشیدہ فیلڈ کے ساتھ کی جا سکتی ہے جو صارف کو نہیں دکھائی جاتی ہے لیکن عام طور پر کمزور سائن اپ فارمز کے لیے بوٹس کے ذریعے خود بخود بھر جاتی ہے، لیکن یہ تیسری پارٹی کی سروس سے "کیپچا" کی طرح قابل اعتماد نہیں ہے۔


آئیے کوڈنگ شروع کریں۔ ایک ورکنگ ڈائرکٹری بنائیں:

 mkdir signup cd signup


python3 -m venv signup یا conda create -n double-opt-contact python3 استعمال کرتے ہوئے اپنا Python ماحول بنائیں۔ میں کونڈا کو ترجیح دیتا ہوں، اور اگر آپ مزید جاننا چاہتے ہیں، تو آپ میرا Python ماحولیات کا مضمون پڑھ سکتے ہیں۔


درج ذیل انحصار انسٹال کریں:
pip flask flask-mail secure SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python bleach

متبادل کے طور پر، آپ کی requirements.txt فائل میں وہی انحصار درج ہو سکتا ہے اور pip install -r requirements.txt چلائیں


مندرجہ ذیل انحصار کے ساتھ app.py فائل بنائیں:


 from flask import Flask, render_template, request, url_for, redirect, flash from flask_mail import Mail, Message from datetime import datetime from flask_sqlalchemy import SQLAlchemy from sqlalchemy.sql import func from itsdangerous import URLSafeTimedSerializer, SignatureExpired import secrets import bleach


ایپ آبجیکٹ کو ڈیفالٹ ٹیمپلیٹ فولڈر لوکیشن کے ساتھ شروع کریں:

 app = Flask(__name__, template_folder='templates')


ان لائنوں کا استعمال کرتے ہوئے اپنا سرور کنفیگریشن ڈیٹا درج کریں:

 secret = secrets.token_urlsafe(32) app.secret_key = secret app.config['SECRET_KEY'] = secret # auto-generated secret key # SQLAlchemy configurations app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqlconnector://admin:user@localhost/tablename' # Email configurations app.config['MAIL_SERVER'] = 'smtp.example.com' app.config['MAIL_PORT'] = 465 #check your port app.config['MAIL_USERNAME'] = '[email protected]' app.config['MAIL_PASSWORD'] = 'your_password' app.config['MAIL_USE_TLS'] = True app.config['MAIL_USE_SSL'] = False db = SQLAlchemy(app) mail = Mail(app) sserialzer = URLSafeTimedSerializer(app.config['SECRET_KEY']) #set secret to the serliazer


بالآخر، آپ کو اپنی تشکیل کی معلومات .env فائل میں ہونی چاہیے۔


صارفین کو ذخیرہ کرنے کے لیے ہمیں ایک MySQL ڈیٹا بیس کی ضرورت ہوگی جو دستی طور پر یا Python کوڈ کے ذریعے بنایا جا سکتا ہے۔ سیکھنے کے عمل کے حصے کے طور پر، آپ کمانڈ لائن کا استعمال کرتے ہوئے یا with app.app_context() db_create_all() Python's کا استعمال کرتے ہوئے درج ذیل کوڈ درج کر سکتے ہیں۔


توثیق شدہ فیلڈ ٹوکن سٹرنگ کے لیے ہے جو ڈبل آپٹ ان تکنیک کی اجازت دیتا ہے۔

 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(120) NOT NULL UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, validated BOOLEAN DEFAULT FALSE );


اگلا سیکشن SQLAlchemy کے ORM ڈھانچے کو استعمال کرتا ہے تاکہ آپ کے ڈیٹا بیس سے استفسار کیا جا سکے۔ نوٹ کریں کہ کلاس کا نام آپ کے ڈیٹا بیس ٹیبل کے نام سے مماثل ہونا چاہیے، بصورت دیگر، آپ کو ایک خرابی ملے گی۔ db.model آپ کے ٹیبل کی ترتیبات کی نمائندگی کرتا ہے جس میں کالم کا نام، اس کی قسم، لمبائی، کلید، اور null قدر شامل ہیں:


 class User(db.Model): id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), unique=True, nullable=False) created_at = db.Column(db.DateTime, server_default=db.func.now()) validated = db.Column(db.Boolean, default=False)


اگر آپ نے پہلے سے ہی MySQL ڈیٹا بیس ٹیبل کو دستی طور پر نہیں بنایا ہے، تو آپ اسے اس فلاسک کوڈ کے ساتھ براہ راست class User کوڈ بلاک کے بعد کر سکتے ہیں:

 # Create the database table with app.app_context(): db.create_all()


اب، ہم بیک اینڈ کوڈ داخل کرتے ہیں جو کہ 2 صفحات/روٹس (انڈیکس، سائن اپ)، ای میل پیغام، اور تصدیق ہے۔ سائن اپ صفحہ میں GET/POST طریقے شامل ہیں جو فارم کو جمع کرنے کی اجازت دیتے ہیں۔ bleach آبجیکٹ ایک Python ایکسٹینشن ہے جو سیکیورٹی کو یقینی بنانے اور نقصان دہ اسکرپٹس کو کم کرنے کے لیے صارف کے ان پٹ کو صاف کرتی ہے۔ پھر sserializer تصدیقی لنک کو ای میل کرنے کے لیے ایک وقتی ٹوکن تیار کرتا ہے۔


 @app.route('/') def index(): return '<h1>Index page</h1>' @app.route('/signup', methods=['GET', 'POST']) def signup(): if request.method == 'POST': email = bleach.clean(request.form.get('email')) # Insert user into the database new_user = User(email=email) try: db.session.add(new_user) db.session.commit() except Exception as e: print(f"Error occurred saving to db: {e}") # Send confirmation email token = sserialzer.dumps(email, salt='email-confirm') msg = Message('Confirm your Email', sender='[email protected]', recipients=[email]) link = url_for('confirm_email', token=token, _external=True) msg.body = f'Your link is {link}' try: mail.send(msg) except Exception as e: print(f"Error occurred sending message: {e}") flash("Error occurred sending message!") return render_template('signup.html') flash('A confirmation email has been sent to your email address.', 'success') return redirect(url_for('index')) return render_template('signup.html')


HTML سائن اپ فارم شامل کرنے سے پہلے، آئیے ڈبل آپٹ ان فیچر کی توثیق کے لیے روٹ شامل کرکے بیک اینڈ کو مکمل کریں۔ یہ راستہ s متغیر کا استعمال کرتا ہے جو ہم نے پہلے بنایا تھا جو وقت کے لحاظ سے حساس، خفیہ ٹوکن تیار کرتا ہے۔ دیکھیں تفصیلات کے لیے دستاویزات


زیادہ سے زیادہ عمر لنک کی میعاد ختم ہونے سے پہلے سیکنڈ ہے، لہذا اس صورت میں، صارف کے پاس اپنے ای میل ایڈریس کی تصدیق کے لیے 20 منٹ ہیں۔


 @app.route('/confirm_email/<token>') def confirm_email(token): try: email = sserialzer.loads(token, salt='email-confirm', max_age=1200) # Token expires after 1 hour except SignatureExpired: return '<h1>The token is expired!</h1>' # Update field in database user = User.query.filter_by(email=email).first_or_404() user.validated = True db.session.commit() return '<h1>Email address confirmed!</h1>'


اب، ہر جگہ مرکزی بیان کے لیے جو ازگر کو اسکرپٹ پر عمل درآمد کرنے کے لیے کہتا ہے اگر فائل کو براہ راست عمل میں لایا جا رہا ہے (ایک درآمد شدہ ماڈیول کے برخلاف):

 if __name__ == '__main__': app.run()


اس سے پہلے کہ ہم اس بیک اینڈ کوڈ کو مکمل کریں، ہمیں صارف کے ان پٹ کے لیے اب بھی فرنٹ اینڈ ایچ ٹی ایم ایل کی ضرورت ہے۔ ہم اسے فلاسک کے بلٹ ان جنجا ٹیمپلیٹ کے ساتھ کرنے جا رہے ہیں۔ templates/signup.html کے نام سے ایک فائل بنائیں جو app.py میں آپ کے پہلے بنائے گئے راستے کے نام سے مماثل ہو۔ پہلے سے طے شدہ طور پر، Jinja html فائلوں کے لیے ڈائریکٹری /templates استعمال کرتا ہے۔ آپ اس ترتیب کو تبدیل کر سکتے ہیں، لیکن اس ٹیوٹوریل کے لیے، ہم ایپ کی /templates ڈائریکٹری استعمال کرنے جا رہے ہیں۔

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Email Sign Up</title> </head> <body> <h1>Sign Up</h1> <form action="{{ url_for('signup') }}" method="POST"> <input type="email" name="email" placeholder="Enter your email" required> <input type="submit" value="Sign Up"> </form> {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} <ul> {% for category, message in messages %} <li>{{ message }}</li> {% endfor %} </ul> {% endif %} {% endwith %} </body> </html>


جب آپ فلاسک کمانڈ کو ڈیبگنگ کو فعال کرتے ہوئے چلاتے ہیں تو آپ کا کوڈ اس وقت سے کام کرنا چاہیے۔ یہ آپ کو کمانڈ لائن کے ساتھ ساتھ براؤزر ونڈو میں کسی بھی غلطی کو دیکھنے کی اجازت دے گا۔


 flask --app app.py --debug run


اپنے براؤزر کو کمانڈ لائن (لوکل ہوسٹ) میں دکھائے گئے ڈومین پر کھولیں اور انڈیکس پیج کو رینڈر کرنا چاہیے۔ تصدیقی لنک حاصل کرنے کے لیے ایک درست ای میل ایڈریس کا استعمال کرتے ہوئے فارم جمع کرانے کی کوشش کریں۔ لنک حاصل کرنے کے بعد، یہ http://localhost:5000/confirm_email/InRvbUByYXRldG91cmd1aWRlcy5jb20i.ZteEvQ.7o1_L0uM9Wl8uii7KhJdiWAH کی طرح نظر آنا چاہیے، آپ اس کی پیروی کر سکتے ہیں اور یہاں دکھائے گئے ای میل ایڈریس کو حاصل کر سکتے ہیں: valid


 @app.route('/confirm_email/<token>') def confirm_email(token): try: email = sserializer.loads(token, salt='email-confirm', max_age=1200) # Token expires after 1 hour except SignatureExpired: return '<h1>Oops, the token expired!</h1>' # Update field in database user = Users.query.filter_by(email=email).first_or_404() user.validated = True try: db.session.commit() except Exception as e: print(f"Error occurred saving to db: {e}") return '<h1>Email address confirmed!</h1>'


یہ راستہ آپ کو پہلے بھیجے گئے ٹوکن سٹرنگ کو قبول کرتا ہے اور اسے چیک کرتا ہے کہ آیا یہ متعلقہ ڈیٹا بیس کے اندراج سے میل کھاتا ہے۔ اگر ایسا ہوتا ہے، تو یہ validated فیلڈ کو True میں اپ ڈیٹ کر دیتا ہے، اور آپ یہ جان کر آرام کر سکتے ہیں کہ آپ کے سائن اپ فارم کو ترک نہیں کیا گیا تھا۔


یہ ایک اہم قدم ہے جو تمام کامیاب کاروبار اپنے رجسٹریشن سسٹم میں استعمال کرتے ہیں اور اب آپ کے پاس بھی ہے۔ لیکن انتظار کریں، کیا ہوگا اگر ہمیں بوٹ اٹیک ان کی توثیق کیے بغیر بے ترتیب ای میل پتوں کو جمع کرواتے ہیں؟ تب آپ کے پاس بیکار اندراجات سے بھرا ہوا ایک گندا ڈیٹا بیس ہوگا۔ آئیے اس کی روک تھام کریں!


بوٹ حملوں کو روکنے یا کم از کم ایڈوانس کو کم کرنے کے لیے، آپ اپنا وقت خرچ کرنے والا حل تیار کر سکتے ہیں، بشمول ایک IP محدود کرنے والا جس کے لیے ان میموری ڈیٹا بیس جیسے Redis کی ضرورت ہوتی ہے، یا آپ تیسری پارٹی کی سروس استعمال کر سکتے ہیں جیسے کہ گوگل کا کیپچا یا hCaptcha.


اپنے ٹیوٹوریل میں، ہم شامل کریں گے۔ hcaptcha کا مفت منصوبہ . اس تحریر کے وقت، گوگل کا کیپچا مفت نہیں ہے اور hcaptcha ہے۔ اپنی سائٹ کے لیے یہ کام کرنے کے لیے، آپ کو کیپچا سے API کلید حاصل کرنے کے لیے ان کے ساتھ رجسٹر کرنے کی ضرورت ہے۔


ہمیں نئی ضروریات کی ضرورت ہے لہذا انہیں انسٹال کریں:
pip install flask-hcaptcha requests


توثیق کے لیے hcaptcha پر ای میل ایڈریس بھیجنے کے لیے درخواستیں درکار ہیں۔ کلید حاصل کریں، اور hcaptcha کی جاوا اسکرپٹ فائل کو اپنے HTML سائن اپ فارم کے ساتھ مربوط کریں۔ فائل کو اپنے HTML صفحہ کے سر پر اور اپنی سائٹ کی کلید کو اپنے فارم میں شامل کریں:


 <head> ... <script src="https://hcaptcha.com/1/api.js" async defer></script> </head> <body> ... <form action="{{ url_for('signup') }}" method="POST"> <input type="email" name="email" placeholder="Enter your email" required> <input type="submit" value="Sign Up"> <div class="h-captcha" data-sitekey="b62gbcc-5cg2-41b2-cd5a-de95dd1eg61h" data-size="compact"></div> </form>


اس کوڈ میں سائٹ کی کلید ایک مثال ہے۔ آپ کو مفت پلان سے اپنی ضرورت ہوگی۔ یہ سائٹ کلید آپ کے فارم کی توثیق کرتی ہے اور اسپام بوٹس کی ایک جامع فہرست کے ساتھ سائٹ وزیٹر کا معائنہ کرتی ہے جسے hcaptcha کے ذریعے جانا جاتا ہے۔


اس کے بعد، app.config آبجیکٹ میں hcaptcha کی خفیہ کلید (سائٹ کی نہیں) شامل کرنے کے لیے اپنی app.py فائل میں ترمیم کریں، اور اسے اپنے ڈیٹا بیس میں محفوظ کرنے سے پہلے hcaptcha پر جواب پوسٹ کریں۔


 app.config['HCAPTCHA_SECRET_KEY'] = 'your-secret-hcaptcha-key' ... @app.route("/signup", methods=['GET', 'POST']) def signup(): if request.method == 'POST': email = bleach.clean(request.form.get('email')) hcaptcha_response = request.form.get('h-captcha-response') # Verify hCaptcha response payload = { 'secret': app.config['HCAPTCHA_SECRET_KEY'], 'response': hcaptcha_response } try: response = requests.post('https://hcaptcha.com/siteverify', data=payload, timeout=10) result = response.json() except requests.exceptions.RequestException as e: print(f"Request failed: {e}") if not result.get('success'): flash('CAPTCHA validation failed, please try again.', 'danger') ... # Insert user into the database new_user = Users(email=email)


ایک بار یہ ہو جانے کے بعد، آپ کے سائن اپ فارم میں hcaptcha آئیکن دکھائی دے گا، اور اسے کسی بھی سپیم کو روکنے کے لیے فعال ہونا چاہیے۔ اب، آپ کے پاس اپنی نئی ایپ کے لیے زیادہ مضبوط فارم ہے۔


اگر آپ کو کسی غلطی کا سامنا کرنا پڑتا ہے یا آپ کو کوڈ میں ٹائپنگ کی غلطی ہوتی ہے، تو آپ مکمل شدہ کوڈ کو چیک کر سکتے ہیں my github.com


اگر آپ مزید چاہتے ہیں تو تبصرہ کریں۔