उस SQL इंजेक्शन को ठीक करें
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string($_POST['password']);
$sql = "INSERT INTO table1 VALUES ('username','password');
// You must quote your $vars ^ ^ ^ ^ like this
// or syntax errors will occur and the escaping will not work!.
ध्यान दें कि डेटाबेस में अनएन्क्रिप्टेड पासवर्ड संग्रहीत करना एक प्रमुख पाप है।
इसे ठीक करने के तरीके के बारे में नीचे देखें।
ट्रिगर पैरामीटर की अनुमति नहीं देते हैं
आप केवल उन मानों तक पहुंच सकते हैं जिन्हें आपने अभी तालिका में डाला है।
इन्सर्ट ट्रिगर में एक डमी तालिका है new
इसके लिए।
डिलीट ट्रिगर में एक डमी टेबल है old
हटाए जाने वाले मान देखने के लिए।
अपडेट ट्रिगर में old
both दोनों हैं और new
.
इसके अलावा आप किसी बाहरी डेटा तक नहीं पहुंच सकते।
DELIMITER $$
//Creates trigger to insert into table1 ( logs ) the userid and patientid ( which has to come from php )
CREATE
TRIGGER ai_table1_each AFTER INSERT ON `baemer_emr`.`table1`
FOR EACH ROW
BEGIN
INSERT INTO table2 VALUES (NEW.idn, NEW.username, NEW.patientid);
END$$
समाधान
ब्लैकहोल तालिका बनाएं।
ब्लैकहोल तालिकाएं कुछ भी संग्रहीत न करने के लिए, उनके अस्तित्व का एकमात्र कारण प्रतिकृति उद्देश्यों के लिए है और इसलिए आप उन्हें ट्रिगर संलग्न कर सकते हैं।
CREATE TABLE bh_newusers (
username varchar(255) not null,
password varchar(255) not null,
idn integer not null,
patient_id integer not null,
user_id integer not null) ENGINE = BLACKHOLE;
इसके बाद ब्लैकहोल तालिका में डेटा डालें और ट्रिगर का उपयोग करके इसे संसाधित करें।
CREATE
TRIGGER ai_bh_newuser_each AFTER INSERT ON `baemer_emr`.bh_newuser
FOR EACH ROW
BEGIN
DECLARE newsalt INTEGER;
SET newsalt = FLOOR(RAND()*999999);
INSERT INTO users (username, salt, passhash)
VALUES (NEW.username, newsalt, SHA2(CONCAT(newsalt, password), 512));
INSERT INTO table2 VALUES (NEW.idn, NEW.username, NEW.patient_id);
END$$
ट्रिगर पर नोट्स
आपको कभी भी पासवर्ड को डेटाबेस में स्पष्ट रूप से संग्रहीत नहीं करना चाहिए।
हमेशा उन्हें सबसे सुरक्षित हैश फ़ंक्शन का उपयोग करके नमकीन हैश के रूप में संग्रहीत करें (वर्तमान में SHA2 जिसकी लंबाई 512 कुंजी लंबाई के साथ है) , जैसा कि ट्रिगर में दिखाया गया है।
आप यह देखने के लिए परीक्षण कर सकते हैं कि किसी के पास सही पासवर्ड है या नहीं:
SELECT * FROM user
WHERE username = '$username' AND passhash = SHA2(CONCAT(salt,'$password'),512)
लिंक
http://dev.mysql .com/doc/refman/5.0/hi/blackhole-storage-engine.html
http://dev.mysql.com /doc/refman/5.0/hi/create-trigger.html
MySQL में हैशेड पासवर्ड स्टोर करना
"बॉबी टेबल्स" से SQL इंजेक्शन कैसे होता है XKCD कॉमिक वर्क?