یک مسئلهء دیگه که اینجا مطرح نشده Header Injection هست.
خیلی افراد از این نوع اطلاع ندارن؛ چیزهایی مثل SQL Injection خیلی معروف و شناخته شده هستن، اما این یکی چون کمتر پیش میاد و زیاد سر و صدایی نمیکنه خیلی ها ازش اطلاع ندارن.
این نوع حمله در پی اچ پی (البته لزوما ربطی به زبان خاصی نداره و در هر زبان دیگری هم میتونه پیش بیاد) اغلب در صفحاتی مثل Contact و یا هر صفحه ای که بهرحال اطلاعاتی رو از کاربر گرفته و ایمیل میکنه پیش میاد. اما نه در همهء این صفحات. مشکل وقتی ممکنه پیش بیاد که از پارامتر هدرهای اضافی تابع mail بطور مثال (هر تابع دیگری هم میتونه باشه!)، برای ارسال هدری که وابستگی به مقدار پر شده توسط کاربر داره استفاده میکنیم.
بطور مثال وقتی فرم شما یک قسمت برای پر کردن آدرس ایمیل فرستنده داره و شما این آدرس رو در هدر From ایمیل قرار میدید، تا بطور مثال در نرم افزارهای میل کلاینت (وبی و غیروبی) بطور خودکار اون آدرس بتونه برای Reply انتخاب بشه.
در این حالت شما اگر از این نوع حمله که بسیار ساده و بدون هیچ ابزار و دستکاری خاصی هم میتونه انجام بشه اطلاع نداشته باشید، فرم ایمیل شما میتونه توسط سوء استفاده کننده برای ارسال ایمیل به آدرس یا آدرسهای دلخواهش استفاده بشه. توجه کنید که این ایمیلها از سایت و آدرس شما برای شخص ثالث فرستاده میشه!
تازه فرستادن یک ایمیل متنی، کمترین حالت سوء استفاده از این فرمها هست که امکانش صددرصد و بسیار راحته.
یک نمونه از چنین کدی رو براتون میذارم:
mail(
$info_emails['admin'],
$_POST['subject'],
$_POST['message'],
//Additional headers parameter
(
($_POST['from'])?
"From: Contact form <{$_POST['from']}>":
'From: Contact form <admin@example.com>'
).
"\r\nCc: {$info_emails['cpanel']}, {$info_emails['yahoo']}\r\nContent-type: text/plain; charset=utf8",
//Additional headers parameter
"-f{$info_emails['return']}"
)
در اینجا $_POST['from'] نقطهء آسیب پذیر/ورودی کاربر هست.
چون دیگه وقت ندارم فورا راه حل رو قرار میدم:
if($_POST['from'] and (strpos(urldecode($_POST['from']), "\n")!==false or strpos(urldecode($_POST['from']), "\r")!==false))
exit('<center><h3 style="color: red">Header injection attempt detected!<br />Your message is not sent.</h3></center>');
باید این کد رو قبل از اون کد قبلی قرار بدید تا درصورت شناسایی این حمله، برنامه با پیغام مناسب (بری دماغ سوختگی طرف!! البته شوخی میکنم.) خارج بشه.
----------------
راستی برای تست کار کردن این کد، در فیلد مورد نظر (From) توالی کاراکترهای %0A و/یا %0D رو همراه هر اطلاعات دلخواه دیگری وارد کنید؛ برنامه باید حمله رو شناسایی کنه.
البته اگر درست یادم باشه و کاراکترهای مورد استفاده در حمله رو درست ذکر کرده باشم (توجه کنید که کد شناسایی حمله صحیحه، ولی کاراکترها به احتمال زیاد درستن).