CherryPy তে Input Validation এবং Sanitization খুবই গুরুত্বপূর্ণ, কারণ এটি আপনার অ্যাপ্লিকেশনকে নিরাপদ রাখে এবং অবাঞ্ছিত বা ক্ষতিকর ইনপুট থেকে রক্ষা করে। যখন আপনি ব্যবহারকারীর ইনপুট গ্রহণ করেন, তখন আপনি নিশ্চিত হতে চান যে ইনপুটটি সঠিক, বৈধ এবং নিরাপদ। Input Validation ইনপুটের সঠিকতা পরীক্ষা করে এবং Sanitization ইনপুটকে পরিষ্কার করে, যাতে ক্ষতিকর ডেটা (যেমন SQL ইনজেকশন, XSS ইত্যাদি) অ্যাপ্লিকেশন দ্বারা প্রক্রিয়াকৃত না হয়।
এখানে CherryPy তে ইনপুট ভ্যালিডেশন এবং স্যানিটাইজেশন করার বিভিন্ন উপায় আলোচনা করা হবে।
1. Input Validation
Input Validation হল একটি প্রক্রিয়া যেখানে আপনি নিশ্চিত হন যে ব্যবহারকারী দ্বারা সরবরাহ করা ইনপুট সঠিক এবং প্রত্যাশিত ফর্ম্যাটে আছে। উদাহরণস্বরূপ, একটি ইমেইল ইনপুট চেক করতে হবে যে এটি একটি বৈধ ইমেইল ঠিকানা কিনা।
উদাহরণ: Input Validation
import cherrypy
import re
class MyApp:
@cherrypy.expose
def index(self):
return """
<html><body>
<form method="POST" action="/submit">
Name: <input type="text" name="name"><br>
Email: <input type="text" name="email"><br>
<input type="submit" value="Submit">
</form>
</body></html>
"""
@cherrypy.expose
def submit(self, name, email):
# ইনপুট ভ্যালিডেশন
if not name or not email:
return "Name and email are required!"
# ইমেইল ভ্যালিডেশন
email_regex = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if not re.match(email_regex, email):
return "Invalid email format!"
return f"Hello {name}, your email is {email}"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
ব্যাখ্যা:
- ইমেইল ভ্যালিডেশন:
re.matchদিয়ে ইমেইল ফরম্যাট চেক করা হয়। - নাম এবং ইমেইল চেক: যদি ইনপুট ফাঁকা থাকে, তাহলে ত্রুটি বার্তা রিটার্ন করা হয়।
2. Sanitization
Sanitization হল একটি প্রক্রিয়া যেখানে আপনি ইনপুট থেকে নিরাপত্তাজনিত বিপদ (যেমন স্ক্রিপ্ট ইঞ্জেকশন) পরিস্কার করেন। এটা নিশ্চিত করে যে ব্যবহারকারীর ইনপুটে কোনও ক্ষতিকর কোড নেই, যা অ্যাপ্লিকেশনকে বা অন্যান্য ব্যবহারকারীদের ক্ষতি করতে পারে।
উদাহরণ: Input Sanitization
import cherrypy
import html
class MyApp:
@cherrypy.expose
def index(self):
return """
<html><body>
<form method="POST" action="/submit">
Name: <input type="text" name="name"><br>
Message: <textarea name="message"></textarea><br>
<input type="submit" value="Submit">
</form>
</body></html>
"""
@cherrypy.expose
def submit(self, name, message):
# ইনপুট স্যানিটাইজেশন
name = html.escape(name) # HTML escape ইনপুট
message = html.escape(message)
# নাম এবং বার্তা স্যানিটাইজ করার পর রিটার্ন
return f"Hello {name}, your message is: {message}"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
ব্যাখ্যা:
- HTML Escape:
html.escapeব্যবহার করা হয়েছে, যা ব্যবহারকারীর ইনপুট থেকে HTML স্পেশাল ক্যারেক্টার (যেমন<,>,&) স্যানিটাইজ করে। এটি XSS আক্রমণ প্রতিরোধ করতে সাহায্য করে।
3. শুধু নিরাপদ ক্যারেক্টার গ্রহণ
কিছু ক্ষেত্রে, আপনি শুধুমাত্র নির্দিষ্ট ক্যারেক্টার গ্রহণ করতে চাইতে পারেন, বিশেষত যখন আপনি ফর্ম বা URL প্যারামিটার গ্রহণ করেন।
উদাহরণ: শুধুমাত্র নিরাপদ ক্যারেক্টার গ্রহণ
import cherrypy
import re
class MyApp:
@cherrypy.expose
def index(self):
return """
<html><body>
<form method="POST" action="/submit">
Phone Number: <input type="text" name="phone"><br>
<input type="submit" value="Submit">
</form>
</body></html>
"""
@cherrypy.expose
def submit(self, phone):
# ফোন নম্বর ভ্যালিডেশন
if not re.match(r'^\+?[0-9]*$', phone):
return "Invalid phone number. Only numbers and optional '+' sign are allowed!"
return f"Your phone number is: {phone}"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
ব্যাখ্যা:
- ফোন নম্বর ভ্যালিডেশন: এখানে শুধুমাত্র সংখ্যাগুলি এবং একটি ঐচ্ছিক '+' সাইন অনুমোদিত। অন্যান্য অক্ষর গ্রহণ করা হবে না।
4. SQL ইনজেকশন প্রতিরোধ
SQL ইনজেকশন প্রতিরোধ করতে, ব্যবহারকারী ইনপুটকে স্যানিটাইজ করা অপরিহার্য। সাধারণত, আপনি SQL ইনজেকশন প্রতিরোধ করতে parameterized queries বা ORM ব্যবহার করেন।
উদাহরণ: SQL ইনজেকশন প্রতিরোধ
import cherrypy
import sqlite3
class MyApp:
@cherrypy.expose
def index(self):
return """
<html><body>
<form method="POST" action="/submit">
Username: <input type="text" name="username"><br>
<input type="submit" value="Submit">
</form>
</body></html>
"""
@cherrypy.expose
def submit(self, username):
# ইনপুট স্যানিটাইজেশন
username = username.strip() # অতিরিক্ত স্পেস মুছে ফেলা
# SQL ইনজেকশন প্রতিরোধ: parameterized query ব্যবহার
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
cursor.execute("SELECT * FROM users WHERE username=?", (username,))
result = cursor.fetchone()
if result:
return f"User found: {result}"
else:
return "User not found!"
if __name__ == '__main__':
cherrypy.quickstart(MyApp())
ব্যাখ্যা:
- Parameterized Queries: SQL ইনজেকশন থেকে রক্ষা করতে, ডেটাবেসের সাথে যোগাযোগের সময় প্যারামিটারাইজড কুয়েরি ব্যবহার করা হয়। এটি ব্যবহারকারীর ইনপুটকে সঠিকভাবে স্যানিটাইজ করে।
CherryPy তে Input Validation এবং Sanitization গুরুত্বপূর্ণ সিকিউরিটি প্র্যাকটিস, যা অ্যাপ্লিকেশনকে নিরাপদ এবং নির্ভরযোগ্য করে তোলে। ইনপুট ভ্যালিডেশন নিশ্চিত করে যে ব্যবহারকারী সঠিক এবং প্রত্যাশিত ডেটা প্রদান করছে, এবং স্যানিটাইজেশন নিশ্চিত করে যে ইনপুটে কোনও ক্ষতিকর কোড বা স্ক্রিপ্ট নেই যা আপনার অ্যাপ্লিকেশনকে বিপদে ফেলতে পারে। এই দুটি টুল ব্যবহার করে আপনি CherryPy অ্যাপ্লিকেশনকে আরও নিরাপদ করতে পারেন।
Read more