Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

PHP MySQL ट्रिगर - ट्रिगर करने के लिए चर कैसे पास करें?

उस 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 कॉमिक वर्क?



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP पीडीओ में क्वेरी सफलतापूर्वक निष्पादित होने पर कैसे बताना है?

  2. प्रपत्र और प्रदर्शन परिणामों के साथ mysqli तालिका खोजें

  3. Mysql के लिए ओपन सोर्स ईआर डायग्रामिंग टूल

  4. सशर्त विभाजन परिवर्तन:SQL सर्वर से Oracle और MySQL डेटाबेस में डेटा निर्यात करें

  5. MySQL लॉजिकल ऑपरेटर्स