PDA

View Full Version : سوال: یک مشکل عجیب با این کارکتر



yasgig
سه شنبه 12 بهمن 1389, 19:42 عصر
با سلام
من یه سیستم وبلاگ دارم و وقتی کاربرا میخواهند قالب وبلاگ خودشون رو ویرایش کنند اگر ' در داخل کدهاشون باشه وقتی که ویرایش زده میشه به بانک اطلاعاتی وارد نمیشه و قالب وبلاگ ویرایش نمیشه.آیا این از تنظیمات سرور هست؟با تگ " هم replace کردم و سپس وارد بانک کردم و کار کرد ولی اینجوری یه مشکل دیگه پیش میاد.اگر از سرور هست لطفا بگید تا ویرایش کنم.
با تشکر

AmirHarirbafan
سه شنبه 12 بهمن 1389, 21:05 عصر
این مشکل اصلا عجیب نیست و در واقع روش کد نویسی شما اشتباه است.
به احتمال زیاد کد شما این جوری بوده.


"UPDATE tblBlog SET blogContent = ' " + $txtBlog + " ' WHERE ID ='" + $ID+"'"
حالا اگه کاربر داخل textbox مقدار زیر رو وارد کنه چی میشه.

'; DELETE FROM tblBlog; UPDATE tblBlog SET blogContent = '
دستوری اس کیو الی که در نهایت ایجاد میشه و اجرا میشه به این صورت خواهد بود


UPDATE tblBlog SET blogContent = ' ';
DELETE FROM tblBlog;
UPDATE tblBlog SET blogContent = ' ';
همونجور که میبینید، کاربر تونست به راحتی دستور SQL خودشو وارد برنامه ی شما بکنه و با اجرا شدن اون، کل اطلاعات جدول پاک خواهد شد.
شما برای جلوگیری از این کار باید شما از تابع mysql_real_escape_string استفاده نمایید.
به این صورت :




"UPDATE tblBlog SET blogContent = ' " + mysql_real_escape_string($txtBlog)
+ " ' WHERE ID ='" + $ID+"'"

yasgig
سه شنبه 12 بهمن 1389, 21:39 عصر
این مشکل اصلا عجیب نیست و در واقع روش کد نویسی شما اشتباه است.
به احتمال زیاد کد شما این جوری بوده.


"UPDATE tblBlog SET blogContent = ' " + $txtBlog + " ' WHERE ID ='" + $ID+"'"
حالا اگه کاربر داخل textbox مقدار زیر رو وارد کنه چی میشه.

'; DELETE FROM tblBlog; UPDATE tblBlog SET blogContent = '
دستوری اس کیو الی که در نهایت ایجاد میشه و اجرا میشه به این صورت خواهد بود


UPDATE tblBlog SET blogContent = ' ';
DELETE FROM tblBlog;
UPDATE tblBlog SET blogContent = ' ';
همونجور که میبینید، کاربر تونست به راحتی دستور SQL خودشو وارد برنامه ی شما بکنه و با اجرا شدن اون، کل اطلاعات جدول پاک خواهد شد.
شما برای جلوگیری از این کار باید شما از تابع mysql_real_escape_string استفاده نمایید.
به این صورت :




"UPDATE tblBlog SET blogContent = ' " + mysql_real_escape_string($txtBlog)
+ " ' WHERE ID ='" + $ID+"'"

خیر به این ربطی نداره چون من کدی نمی نویسم که به همین راحتی بشه Sql injection کرد.فکر کنم مشکل از سرور باشه چون توی سرور قبلی این مشکل وجود نداشت.

yasgig
سه شنبه 12 بهمن 1389, 23:41 عصر
الان کوئری من اینه:

if (@mysql_query("update blogs set theme='$tcode' where usern='$blogid'"))
و محتوای قالب فرضا این باشه:

<script language="javascript">
function GetBC(lngPostid)
{
strUrl="http://yasgig.ir/blog/commenting/?blogid=" +strBlogId + "&postid=" + lngPostid + "&timezone=" + intTimeZone ;
strResult ="<a href=\"javascript:void(0)\" onclick=\"javascript:window.open('" + strUrl + "','yasgig_comments','status=yes,scrollbars=yes,too lbar=no,menubar=no,location=no ,width=500px,height=500px')\" >" + strResult + " </a>" ;
document.write ( strResult ) ;
}
</script>
وقتی این محتوای قالب پست میشه وارد بان نمیشه ولی وقتی ' برداشته میشه به بانک وارد میشه.در ضمن محتوای قالب توسط یک textarea و یه فرم به همون صفحه پست میشه.

eshpilen
چهارشنبه 13 بهمن 1389, 10:46 صبح
شما باید محتوای متغییرها را قبل از اجرای کوئری، Escape کنید.
این روش نه تنها برای جلوگیری از Sql injection، بلکه خیلی وقتها برای صحیح بودن سینتاکس کوئری ساخته شده، ضروری است.
میتوانید از تابع mysql_real_escape_string برای این کار استفاده کنید.
البته چنانچه مقدار متغییرهای شما از یکی از منابع Get/Post/Cookie حاصل میشود، باید قبل از این کار فعال بودن magic_quotes را چک کنید و عمل مناسب را بر مبنای آن انجام دهید. مثالی که در رفرنس تابع mysql_real_escape_string در این زمینه آمده است، کاملا قابل استفاده میباشد:

function quote_smart($value)
{
// Stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Quote if not a number or a numeric string
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
یعنی شما از این تابع بجای استفادهء مستقیم از mysql_real_escape_string استفاده میکنید.
ضمنا مشاهده میشود که کد بالا کار افزودن علامت نقل قول تکی قبل و بعد از مقدار را هم انجام میدهد، بنابراین باید علامتهای نقل قول محصور کنندهء متغییرها را از کوئری خود حذف کنید.
یعنی بطور مثال به اینصورت:

if (@mysql_query("update blogs set theme=$tcode where usern=$blogid"))

yasgig
چهارشنبه 13 بهمن 1389, 11:23 صبح
شما باید محتوای متغییرها را قبل از اجرای کوئری، Escape کنید.
این روش نه تنها برای جلوگیری از Sql injection، بلکه خیلی وقتها برای صحیح بودن سینتاکس کوئری ساخته شده، ضروری است.
میتوانید از تابع mysql_real_escape_string برای این کار استفاده کنید.
البته چنانچه مقدار متغییرهای شما از یکی از منابع Get/Post/Cookie حاصل میشود، باید قبل از این کار فعال بودن magic_quotes را چک کنید و عمل مناسب را بر مبنای آن انجام دهید. مثالی که در رفرنس تابع mysql_real_escape_string در این زمینه آمده است، کاملا قابل استفاده میباشد:

function quote_smart($value)
{
// Stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
}
// Quote if not a number or a numeric string
if (!is_numeric($value)) {
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}
یعنی شما از این تابع بجای استفادهء مستقیم از mysql_real_escape_string استفاده میکنید.
ضمنا مشاهده میشود که کد بالا کار افزودن علامت نقل قول تکی قبل و بعد از مقدار را هم انجام میدهد، بنابراین باید علامتهای نقل قول محصور کنندهء متغییرها را از کوئری خود حذف کنید.
یعنی بطور مثال به اینصورت:

if (@mysql_query("update blogs set theme=$tcode where usern=$blogid"))
آقا خدا اموات شما رو بیامرزه.گزینه Magic Quotes Gpc رو تو سرور فعال کردم و درست شد بدون اینکه توی کدهام تغییراتی انجام بدم.حتما توی سرور قبلی هم فعال بوده به همین دلیل این مشکل پیش نمیومد.ممنون از همه.

eshpilen
چهارشنبه 13 بهمن 1389, 11:41 صبح
فعال کردن Magic Quotes روش خوبی نیست. برنامهء شما باید تاحد ممکن مستقل از تنظیمات سرور باشه و حداقلش باید موقعی که تنظیمات لازم برقرار نیست تشخیص بده و با یک پیام خطای روشن از کار کردن سر باز بزنه. این مورد هم که خیلی ساده هست و با اون تابع براحتی حل میشه. so use it

yasgig
چهارشنبه 13 بهمن 1389, 13:10 عصر
من با روشهایی که شما گفتید که قبل از ارسال کوئری انجام بدم رو هم انجام دادم و تونستم به بانک وارد کنم ولی در مقابل خطای دیگری در نمایش وبلاگها به وجود اومد و تگهایی که باید تغییراتی روش انجام نمیشد هم عوض میشن و وبلاگها به مشکل برمیخورند.