هوش مصنوعی کد یک افزونهی کوچک وردپرس را در چند ثانیه مینویسد. مشکل سرعت نیست؛ مشکل این است که کد تولیدشده معمولاً کار میکند و همین آدم را گول میزند. فرم ذخیره میشود، جعبه نمایش داده میشود، و کسی نمیبیند که nonce بررسی نشده یا خروجی بدون escape چاپ میشود.
در این راهنما یک افزونهی واقعی و کوچک را قدمبهقدم میسازیم: جعبهی «یادداشت داخلی» در صفحهی ویرایش نوشته که فقط ویراستاران میبینند.
کار را چطور برای هوش مصنوعی تعریف کنیم؟#
کار را در یک جملهی دقیق بنویسید: چه کاری، برای چه کسی، کجا و در چه محیطی. هر ابهامی که بگذارید، مدل با حدس پر میکند.
«یک افزونه برای مدیریت یادداشتها بنویس» ده تصمیم را به مدل واگذار میکند. بهجایش این چهار مورد را روشن کنید:
- کار دقیق: یک جعبهی متنی در ستون کناری ویرایش نوشته که محتوایش در متای همان نوشته ذخیره شود.
- چه کسی: فقط کاربرانی که اجازهی ویرایش همان نوشته را دارند.
- کجا نه: هیچجای سایت عمومی نمایش داده نشود.
- محیط: نسخهی وردپرس و PHP سایت، که در «ابزارها ← سلامت سایت» پیدا میشود.
اگر کار بیش از یک جمله توضیح لازم دارد، آن را به چند مرحله بشکنید.
چه پرامپتی کد امنتر میدهد؟#
پرامپتی که قیدهای امنیتی را صریح نام ببرد. مدل بهطور پیشفرض کوتاهترین کد کارا را مینویسد و نکتههای امنیتی را همیشه خودش اضافه نمیکند.
اصول کلی این نوع درخواست در پرامپتنویسی برای کار فنی آمده؛ این نمونهی مخصوص وردپرس است:
یک افزونهی تکفایلی وردپرس بنویس، برای PHP نسخهی ۸ به بالا.
کار: یک متاباکس «یادداشت داخلی» در ستون کناری ویرایش نوشتهها
که متن را در متای _dg_internal_note ذخیره کند.
قیدها:
- فقط از توابع و قلابهای خود وردپرس استفاده کن.
- فرم nonce داشته باشد و هنگام ذخیره بررسی شود.
- پیش از ذخیره، دسترسی edit_post برای همان نوشته بررسی شود.
- ورودی با wp_unslash و تابع sanitize مناسب پاک شود.
- هر خروجی با تابع escape مناسب چاپ شود.
- همهی نامها با پیشوند dg_ شروع شوند.
بعد از کد، در چند خط بگو هر بخش چه میکند.خط آخر را جا نیندازید. اگر توضیح مدل با کد نخواند، یعنی جایی اشتباه است.
کد خروجی را چطور بخوانیم؟#
کد را پیش از اجرا بخوانید و چهار نقطهی امنیتی را در آن پیدا کنید: nonce، بررسی دسترسی، پاکسازی ورودی و escape خروجی. اگر یکی نبود، کد آماده نیست.
دو تعریف کوتاه: nonce در وردپرس توکن موقتی است که ثابت میکند درخواست از فرم خود سایت و از طرف همان کاربر آمده است. escape یعنی خنثیکردن نویسههای خطرناک پیش از چاپ، تا متن بهجای کد اجرا نشود.
خروجی خوب برای پرامپت بالا چیزی شبیه این است:
<?php
/**
* Plugin Name: DG Internal Note
* Requires PHP: 8.0
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
add_action( 'add_meta_boxes', 'dg_internal_note_add_box' );
function dg_internal_note_add_box(): void {
add_meta_box( 'dg_internal_note', 'یادداشت داخلی', 'dg_internal_note_render', 'post', 'side' );
}
function dg_internal_note_render( WP_Post $post ): void {
wp_nonce_field( 'dg_internal_note_save', 'dg_internal_note_nonce' );
$note = get_post_meta( $post->ID, '_dg_internal_note', true );
echo '<textarea name="dg_internal_note" rows="4" class="widefat">';
echo esc_textarea( (string) $note );
echo '</textarea>';
}
add_action( 'save_post_post', 'dg_internal_note_save' );
function dg_internal_note_save( int $post_id ): void {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
return;
}
if ( ! isset( $_POST['dg_internal_note_nonce'] ) ) {
return;
}
$nonce = sanitize_text_field( wp_unslash( $_POST['dg_internal_note_nonce'] ) );
if ( ! wp_verify_nonce( $nonce, 'dg_internal_note_save' ) ) {
return;
}
if ( ! current_user_can( 'edit_post', $post_id ) ) {
return;
}
$note = isset( $_POST['dg_internal_note'] )
? sanitize_textarea_field( wp_unslash( $_POST['dg_internal_note'] ) )
: '';
update_post_meta( $post_id, '_dg_internal_note', $note );
}چیزهایی که باید در همین کد ببینید:
wp_nonce_fieldدر فرم وwp_verify_nonceهنگام ذخیره، با نام action یکسان.current_user_can( 'edit_post', $post_id )یعنی اجازه برای همین نوشته، نه یک نقش کلی.wp_unslashپیش از پاکسازی، چون وردپرس دادهی$_POSTرا اسلشدار میکند.esc_textareaبرای داخل textarea؛ برای ویژگی HTML بایدesc_attrباشد و برای متن معمولیesc_html.- کلید متا با خط زیر شروع شده تا در جعبهی «زمینههای دلخواه» دیده نشود.
اگر افزونه نباید بعد از حذف چیزی در دیتابیس جا بگذارد، یک فایل uninstall.php کنارش بگذارید:
<?php
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
exit;
}
delete_post_meta_by_key( '_dg_internal_note' );ساختار کامل افزونه و قلابها را در ساخت افزونهی وردپرس از صفر آوردهایم.
چکلیست هشتموردی بازبینی#
این هشت مورد را خطبهخط در کد پیدا کنید؛ نبودن هر کدام از ردیف دوم به بعد یعنی کد آمادهی نصب نیست.
| مورد | دنبال چه بگردید |
|---|---|
| جلوگیری از اجرای مستقیم | بررسی ABSPATH در ابتدای فایل |
| nonce | ساخت در فرم، بررسی هنگام ذخیره |
| بررسی دسترسی | current_user_can با قابلیت درست |
| پاکسازی ورودی | wp_unslash و بعد تابع sanitize_* مناسب |
| escape خروجی | esc_html، esc_attr، esc_url و مانند آنها |
| پایگاه داده | $wpdb->prepare برای هر کوئری که ورودی دارد |
| مسیر AJAX یا REST | nonce و permission_callback درست |
| نامگذاری | پیشوند یکتا برای تابع، متا و گزینه |
میتوانید از یک گفتگوی تازه هم بخواهید کد را با همین جدول بازبینی کند، ولی بازبین هم خطا میکند؛ حد و مرزش را در بازبینی کد با هوش مصنوعی نوشتهایم.
افزونه را چطور بیخطر آزمایش کنیم؟#
روی یک کپی از سایت، با حالت اشکالزدایی روشن و با چند آزمون عمدی. هیچوقت اولین اجرا روی سایت اصلی نباشد.
- در
wp-config.phpسایت آزمایشی،WP_DEBUGوWP_DEBUG_LOGرا روشن کنید. - افزونه را فعال کنید و یک نوشته را همراه یادداشت ذخیره کنید.
- صفحه را دوباره باز کنید و ببینید یادداشت سر جایش است.
- متنی شامل یک تگ مثل
<b>ذخیره کنید؛ تگ باید حذف شود و بقیهی متن سالم بماند. - با کاربری وارد شوید که اجازهی ویرایش نوشتهی دیگران را ندارد و ببینید نمیتواند یادداشت آنها را عوض کند.
- فایل
wp-content/debug.logرا نگاه کنید؛ هیچ هشداری نباید آنجا باشد. - افزونه را حذف کنید و ببینید متاها پاک شدهاند.
اگر خطایی دیدید، متن کامل خطا را همراه کد به همان گفتگو بدهید، نه فقط جملهی «کار نمیکند».
هوش مصنوعی در کد وردپرس کجا اشتباه میکند؟#
بیشتر در جاهایی که کد بدون آنها هم کار میکند: امنیت، توابع قدیمی و نامهایی که وجود ندارند.
- تابع منسوخ: مدل از کدهای قدیمی اینترنت یاد گرفته و گاهی تابعی پیشنهاد میکند که مدتهاست جایگزین دارد.
- اعتماد به
is_admin(): این تابع فقط میگوید درخواست مربوط به بخش مدیریت است، نه اینکه کاربر مدیر است. - nonce نیمهکاره: فیلد در فرم هست ولی هنگام ذخیره بررسی نمیشود.
- کوئری خام: چسباندن مستقیم ورودی به SQL بهجای
$wpdb->prepare. - escape در جای اشتباه: قاعده ساده است؛ هنگام ذخیره پاکسازی، هنگام نمایش escape.
- تابع ساختگی: هر تابع ناآشنا را در مرجع رسمی توسعهدهندگان وردپرس جستجو کنید.
پیش از نصب روی سایت اصلی، چکلیست امنیت وردپرس را هم مرور کنید. هر افزونهی تازه، هر قدر کوچک، سطح حمله را بزرگتر میکند.
کی نباید با هوش مصنوعی افزونه ساخت؟#
وقتی پای پول، حساب کاربری یا دادهی شخصی در میان است. برای اینها افزونهی شناختهشده و نگهداریشده نصب کنید یا برنامهنویس بگیرید:
- پرداخت و هر چیزی که با پول سروکار دارد
- ثبتنام، ورود و مدیریت کاربران
- آپلود فایل از طرف بازدیدکننده
- ذخیرهی اطلاعات شخصی مشتری
دلیلش ساده است: کدی که خودتان نگه میدارید بهروزرسانی امنیتی خودکار ندارد. برای کارهای کوچک و تککاره اما، همانطور که در هوش مصنوعی در وردپرس گفتیم، هوش مصنوعی واقعاً وقت صرفهجویی میکند.
این موضوع به کجا میرود؟#
ابزارها از «چت و کپیکردن کد» بهسمت دستیارهایی میروند که خودشان فایلها را تغییر میدهند، دستور اجرا میکنند و نتیجه را میبینند. سرعت ساختن بیشتر میشود؛ مسئولیت بازبینی همچنان با شماست.
برای آماده شدن:
- خواندن کد PHP و شناختن توابع امنیتی وردپرس را یاد بگیرید؛ این مهارت کهنه نمیشود.
- همیشه یک سایت آزمایشی آماده داشته باشید.
- کد افزونههایتان را در یک مخزن git نگه دارید تا هر تغییر قابلبرگشت باشد.
خلاصه#
- کار را در یک جمله تعریف کنید و نسخهی وردپرس و PHP را بگویید.
- nonce، بررسی دسترسی، پاکسازی ورودی و escape خروجی را صریح در پرامپت بخواهید.
- کد را با چکلیست خطبهخط بخوانید؛ کار کردن دلیل امن بودن نیست.
- اول روی سایت آزمایشی با
WP_DEBUGروشن امتحان کنید. - برای پرداخت، ورود کاربر و آپلود فایل، کد تازه با هوش مصنوعی نسازید.