Cursor rule
.cursor/rules/javascript-security-logging-monitoring-failures.mdcDetect and prevent security logging and monitoring failures in JavaScript applications as defined in OWASP Top 10:2021-A09
Cursor rules
Quality
40/100
Scores the file, not the repository.Length
2,210 words
1 headings · 16 code blocksRepository
86
— · pushed 280 days agoLast changed
3 days ago
First indexed 3 days ago.12345# JavaScript Security Logging and Monitoring Failures (OWASP A09:2021)67<rule>8name: javascript_security_logging_monitoring_failures9description: Detect and prevent security logging and monitoring failures in JavaScript applications as defined in OWASP Top 10:2021-A091011actions:12 - type: enforce13 conditions:14 # Pattern 1: Missing Error Logging15 - pattern: "(?:try\\s*{[^}]*}\\s*catch\\s*\\([^)]*\\)\\s*{[^}]*})(?![^;{]*(?:console\\.(?:error|warn|log)|logger?\\.(?:error|warn|log)|captureException))"16 message: "Error caught without proper logging. Implement structured error logging for security events."1718 # Pattern 2: Sensitive Data in Logs19 - pattern: "console\\.(?:log|warn|error|info|debug)\\s*\\([^)]*(?:password|token|secret|key|credential|auth|jwt|session|cookie)"20 negative_pattern: "\\*\\*\\*|redact|mask|sanitize"21 message: "Potential sensitive data in logs. Ensure sensitive information is redacted before logging."2223 # Pattern 3: Missing Authentication Logging24 - pattern: "(?:login|signin|authenticate|auth)\\s*\\([^)]*\\)\\s*{[^}]*}"25 negative_pattern: "(?:log|audit|record|track)\\s*\\("26 message: "Authentication function without logging. Log authentication attempts, successes, and failures."2728 # Pattern 4: Missing Authorization Logging29 - pattern: "(?:authorize|checkPermission|hasAccess|isAuthorized|can)\\s*\\([^)]*\\)\\s*{[^}]*}"30 negative_pattern: "(?:log|audit|record|track)\\s*\\("31 message: "Authorization check without logging. Log access control decisions, especially denials."3233 # Pattern 5: Insufficient Error Detail34 - pattern: "(?:console\\.error|logger?\\.error)\\s*\\([^)]*(?:error|err|exception)\\s*\\)"35 negative_pattern: "(?:error\\.(?:message|stack|code|name)|JSON\\.stringify\\(error\\)|serialize)"36 message: "Error logging with insufficient detail. Include error type, message, stack trace, and context."3738 # Pattern 6: Missing Security Event Logging39 - pattern: "(?:bruteForce|rateLimit|block|blacklist|suspicious|anomaly|threat|attack|intrusion|malicious)"40 negative_pattern: "(?:log|audit|record|track|monitor|alert|notify)"41 message: "Security event detection without logging. Implement logging for all security-relevant events."4243 # Pattern 7: Inconsistent Log Formats44 - pattern: "console\\.(?:log|warn|error|info|debug)\\s*\\("45 negative_pattern: "JSON\\.stringify|structured|format"46 message: "Inconsistent log format. Use structured logging with consistent formats for easier analysis."4748 # Pattern 8: Missing Log Correlation ID49 - pattern: "(?:api|http|fetch|axios|request)\\s*\\([^)]*\\)"50 negative_pattern: "(?:correlationId|requestId|traceId|spanId|context)"51 message: "API request without correlation ID. Include correlation IDs in logs for request tracing."5253 # Pattern 9: Missing High-Value Transaction Logging54 - pattern: "(?:payment|transaction|order|purchase|transfer|withdraw|deposit)\\s*\\([^)]*\\)"55 negative_pattern: "(?:log|audit|record|track)"56 message: "High-value transaction without audit logging. Implement comprehensive logging for all transactions."5758 # Pattern 10: Client-Side Logging Issues59 - pattern: "(?:window\\.onerror|window\\.addEventListener\\s*\\(\\s*['\"]error['\"])"60 negative_pattern: "(?:send|report|log|capture|track)"61 message: "Client-side error handler without reporting. Implement error reporting to backend services."6263 # Pattern 11: Missing Log Levels64 - pattern: "console\\.log\\s*\\("65 negative_pattern: "logger?\\.(?:error|warn|info|debug|trace)"66 message: "Using console.log without proper log levels. Implement a logging library with appropriate log levels."6768 # Pattern 12: Missing Monitoring Integration69 - pattern: "package\\.json"70 negative_pattern: "(?:sentry|newrelic|datadog|appinsights|loggly|splunk|elasticsearch|winston|bunyan|pino|loglevel)"71 file_pattern: "package\\.json$"72 message: "No logging or monitoring dependencies detected. Consider adding a proper logging library and monitoring integration."7374 # Pattern 13: Missing Log Aggregation75 - pattern: "(?:docker-compose\\.ya?ml|\\.env|\\.env\\.example|Dockerfile)"76 negative_pattern: "(?:sentry|newrelic|datadog|appinsights|loggly|splunk|elasticsearch|logstash|fluentd|kibana)"77 file_pattern: "(?:docker-compose\\.ya?ml|\\.env|\\.env\\.example|Dockerfile)$"78 message: "No log aggregation service configured. Implement centralized log collection and analysis."7980 # Pattern 14: Missing Health Checks81 - pattern: "(?:express|koa|fastify|hapi|http\\.createServer)"82 negative_pattern: "(?:health|status|heartbeat|alive|ready)"83 message: "Server without health check endpoint. Implement health checks for monitoring service status."8485 # Pattern 15: Missing Rate Limiting Logs86 - pattern: "(?:rateLimit|throttle|limiter)"87 negative_pattern: "(?:log|record|track|monitor|alert|notify)"88 message: "Rate limiting without logging. Log rate limit events to detect potential attacks."8990 - type: suggest91 message: |92 **JavaScript Security Logging and Monitoring Best Practices:**9394 1. **Structured Error Logging:**95 - Use structured logging formats (JSON)96 - Include contextual information with errors97 - Example:98```javascript99 try {100 // Operation that might fail101 processUserData(userData);102 } catch (error) {103 logger.error({104 message: 'Failed to process user data',105 error: {106 name: error.name,107 message: error.message,108 stack: error.stack109 },110 userId: userData.id,111 context: 'user-processing',112 timestamp: new Date().toISOString()113 });114 // Handle the error appropriately115 }116```117118 2. **Sensitive Data Redaction:**119 - Redact sensitive information before logging120 - Use dedicated functions for sanitization121 - Example:122```javascript123 function redactSensitiveData(obj) {124 const sensitiveFields = ['password', 'token', 'secret', 'creditCard', 'ssn'];125 const redacted = { ...obj };126127 for (const field of sensitiveFields) {128 if (field in redacted) {129 redacted[field] = '***REDACTED***';130 }131 }132133 return redacted;134 }135136 // Usage137 logger.info({138 message: 'User login attempt',139 user: redactSensitiveData(userData),140 timestamp: new Date().toISOString()141 });142```143144 3. **Authentication Logging:**145 - Log all authentication events146 - Include success/failure status147 - Example:148```javascript149 async function authenticateUser(username, password) {150 try {151 const user = await User.findOne({ username });152153 if (!user) {154 logger.warn({155 message: 'Authentication failed: user not found',156 username,157 ipAddress: req.ip,158 userAgent: req.headers['user-agent'],159 timestamp: new Date().toISOString()160 });161 return { success: false, reason: 'invalid_credentials' };162 }163164 const isValid = await bcrypt.compare(password, user.passwordHash);165166 if (!isValid) {167 logger.warn({168 message: 'Authentication failed: invalid password',169 username,170 userId: user.id,171 ipAddress: req.ip,172 userAgent: req.headers['user-agent'],173 timestamp: new Date().toISOString()174 });175 return { success: false, reason: 'invalid_credentials' };176 }177178 logger.info({179 message: 'User authenticated successfully',180 username,181 userId: user.id,182 ipAddress: req.ip,183 userAgent: req.headers['user-agent'],184 timestamp: new Date().toISOString()185 });186187 return { success: true, user };188 } catch (error) {189 logger.error({190 message: 'Authentication error',191 username,192 error: {193 name: error.name,194 message: error.message,195 stack: error.stack196 },197 timestamp: new Date().toISOString()198 });199 return { success: false, reason: 'system_error' };200 }201 }202```203204 4. **Authorization Logging:**205 - Log access control decisions206 - Include user, resource, and action207 - Example:208```javascript209 function checkPermission(user, resource, action) {210 const hasPermission = user.permissions.some(p =>211 p.resource === resource && p.actions.includes(action)212 );213214 logger.info({215 message: `Authorization ${hasPermission ? 'granted' : 'denied'}`,216 userId: user.id,217 username: user.username,218 resource,219 action,220 decision: hasPermission ? 'allow' : 'deny',221 timestamp: new Date().toISOString()222 });223224 return hasPermission;225 }226```227228 5. **Comprehensive Error Logging:**229 - Include detailed error information230 - Add context for troubleshooting231 - Example:232```javascript233 // Using a logging library like Winston234 const winston = require('winston');235236 const logger = winston.createLogger({237 level: process.env.LOG_LEVEL || 'info',238 format: winston.format.combine(239 winston.format.timestamp(),240 winston.format.json()241 ),242 defaultMeta: { service: 'user-service' },243 transports: [244 new winston.transports.Console(),245 new winston.transports.File({ filename: 'error.log', level: 'error' }),246 new winston.transports.File({ filename: 'combined.log' })247 ]248 });249250 // Usage251 try {252 // Operation that might fail253 } catch (error) {254 logger.error({255 message: 'Operation failed',256 operationName: 'processData',257 error: {258 name: error.name,259 message: error.message,260 code: error.code,261 stack: error.stack262 },263 context: {264 userId: req.user?.id,265 requestId: req.id,266 path: req.path,267 method: req.method268 }269 });270 }271```272273 6. **Security Event Logging:**274 - Log all security-relevant events275 - Include detailed context276 - Example:277```javascript278 function detectBruteForce(username, ipAddress) {279 const attempts = getLoginAttempts(username, ipAddress);280281 if (attempts > MAX_ATTEMPTS) {282 logger.warn({283 message: 'Possible brute force attack detected',284 username,285 ipAddress,286 attempts,287 threshold: MAX_ATTEMPTS,288 action: 'account_temporarily_locked',289 timestamp: new Date().toISOString()290 });291292 // Implement account lockout or IP blocking293 lockAccount(username, LOCKOUT_DURATION);294 return true;295 }296297 return false;298 }299```300301 7. **Structured Logging Format:**302 - Use JSON for machine-readable logs303 - Maintain consistent field names304 - Example:305```javascript306 // Using a structured logging library like Pino307 const pino = require('pino');308309 const logger = pino({310 level: process.env.LOG_LEVEL || 'info',311 base: { pid: process.pid, hostname: os.hostname() },312 timestamp: pino.stdTimeFunctions.isoTime,313 formatters: {314 level: (label) => {315 return { level: label };316 }317 }318 });319320 // Usage321 logger.info({322 msg: 'User profile updated',323 userId: user.id,324 changes: ['email', 'preferences'],325 source: 'api'326 });327```328329 8. **Request Correlation:**330 - Use correlation IDs across services331 - Track request flow through the system332 - Example:333```javascript334 // Express middleware for adding correlation IDs335 const { v4: uuidv4 } = require('uuid');336337 function correlationMiddleware(req, res, next) {338 // Use existing correlation ID from headers or generate a new one339 const correlationId = req.headers['x-correlation-id'] || uuidv4();340 req.correlationId = correlationId;341342 // Add to response headers343 res.setHeader('x-correlation-id', correlationId);344345 // Add to logger context for this request346 req.logger = logger.child({ correlationId });347348 next();349 }350351 // Usage in route handlers352 app.get('/api/users/:id', (req, res) => {353 req.logger.info({354 msg: 'User profile requested',355 userId: req.params.id,356 path: req.path,357 method: req.method358 });359360 // Process request...361 });362```363364 9. **Transaction Logging:**365 - Log all high-value transactions366 - Include before/after states367 - Example:368```javascript369 async function processPayment(userId, amount, paymentMethod) {370 logger.info({371 message: 'Payment processing started',372 userId,373 amount,374 paymentMethod: {375 type: paymentMethod.type,376 lastFour: paymentMethod.lastFour377 },378 transactionId: generateTransactionId(),379 timestamp: new Date().toISOString()380 });381382 try {383 const result = await paymentGateway.charge({384 amount,385 source: paymentMethod.token386 });387388 logger.info({389 message: 'Payment processed successfully',390 userId,391 amount,392 transactionId: result.transactionId,393 gatewayReference: result.reference,394 status: 'success',395 timestamp: new Date().toISOString()396 });397398 return { success: true, transactionId: result.transactionId };399 } catch (error) {400 logger.error({401 message: 'Payment processing failed',402 userId,403 amount,404 error: {405 name: error.name,406 message: error.message,407 code: error.code408 },409 status: 'failed',410 timestamp: new Date().toISOString()411 });412413 return { success: false, error: error.message };414 }415 }416```417418 10. **Client-Side Error Reporting:**419 - Send client errors to the backend420 - Include browser and user context421 - Example:422```javascript423 // Client-side error tracking424 window.addEventListener('error', function(event) {425 const errorDetails = {426 message: event.message,427 source: event.filename,428 lineno: event.lineno,429 colno: event.colno,430 error: {431 stack: event.error?.stack432 },433 url: window.location.href,434 userAgent: navigator.userAgent,435 timestamp: new Date().toISOString(),436 // Add user context if available437 userId: window.currentUser?.id438 };439440 // Send to backend logging endpoint441 fetch('/api/log/client-error', {442 method: 'POST',443 headers: {444 'Content-Type': 'application/json'445 },446 body: JSON.stringify(errorDetails),447 // Use keepalive to ensure the request completes even if the page is unloading448 keepalive: true449 }).catch(err => {450 // Fallback if the logging endpoint fails451 console.error('Failed to send error report:', err);452 });453 });454```455456 11. **Proper Log Levels:**457 - Use appropriate log levels458 - Configure based on environment459 - Example:460```javascript461 // Using Winston with proper log levels462 const winston = require('winston');463464 const logger = winston.createLogger({465 level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',466 levels: winston.config.npm.levels,467 format: winston.format.combine(468 winston.format.timestamp(),469 winston.format.json()470 ),471 transports: [472 new winston.transports.Console({473 format: winston.format.combine(474 winston.format.colorize(),475 winston.format.simple()476 )477 })478 ]479 });480481 // Usage with appropriate levels482 logger.error('Critical application error'); // Always logged483 logger.warn('Potential issue detected'); // Warning conditions484 logger.info('Normal operational message'); // Normal but significant485 logger.http('HTTP request received'); // HTTP request logging486 logger.verbose('Detailed information'); // Detailed debug information487 logger.debug('Debugging information'); // For developers488 logger.silly('Extremely detailed tracing'); // Most granular489```490491 12. **Monitoring Integration:**492 - Integrate with monitoring services493 - Set up alerts for critical issues494 - Example:495```javascript496 // Using Sentry for error monitoring497 const Sentry = require('@sentry/node');498 const Tracing = require('@sentry/tracing');499 const express = require('express');500501 const app = express();502503 Sentry.init({504 dsn: process.env.SENTRY_DSN,505 integrations: [506 new Sentry.Integrations.Http({ tracing: true }),507 new Tracing.Integrations.Express({ app })508 ],509 tracesSampleRate: 1.0510 });511512 // Use Sentry middleware513 app.use(Sentry.Handlers.requestHandler());514 app.use(Sentry.Handlers.tracingHandler());515516 // Your routes here517518 // Error handler519 app.use(Sentry.Handlers.errorHandler());520 app.use((err, req, res, next) => {521 // Custom error handling522 logger.error({523 message: 'Express error',524 error: {525 name: err.name,526 message: err.message,527 stack: err.stack528 },529 request: {530 path: req.path,531 method: req.method,532 correlationId: req.correlationId533 }534 });535536 res.status(500).json({ error: 'Internal server error' });537 });538```539540 13. **Log Aggregation:**541 - Set up centralized log collection542 - Configure log shipping543 - Example:544```javascript545 // Using Winston with Elasticsearch transport546 const winston = require('winston');547 const { ElasticsearchTransport } = require('winston-elasticsearch');548549 const esTransportOpts = {550 level: 'info',551 clientOpts: {552 node: process.env.ELASTICSEARCH_URL,553 auth: {554 username: process.env.ELASTICSEARCH_USERNAME,555 password: process.env.ELASTICSEARCH_PASSWORD556 }557 },558 indexPrefix: 'app-logs'559 };560561 const logger = winston.createLogger({562 transports: [563 new winston.transports.Console(),564 new ElasticsearchTransport(esTransportOpts)565 ]566 });567```568569```yaml570 # docker-compose.yml example with ELK stack571 version: '3'572 services:573 app:574 build: .575 environment:576 - NODE_ENV=production577 - ELASTICSEARCH_URL=http://elasticsearch:9200578 depends_on:579 - elasticsearch580581 elasticsearch:582 image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0583 environment:584 - discovery.type=single-node585 - ES_JAVA_OPTS=-Xms512m -Xmx512m586 volumes:587 - es_data:/usr/share/elasticsearch/data588589 kibana:590 image: docker.elastic.co/kibana/kibana:7.14.0591 ports:592 - "5601:5601"593 depends_on:594 - elasticsearch595596 logstash:597 image: docker.elastic.co/logstash/logstash:7.14.0598 volumes:599 - ./logstash/pipeline:/usr/share/logstash/pipeline600 depends_on:601 - elasticsearch602603 volumes:604 es_data:605```606607 14. **Health Checks and Monitoring:**608 - Implement health check endpoints609 - Monitor application status610 - Example:611```javascript612 const express = require('express');613 const app = express();614615 // Basic health check endpoint616 app.get('/health', (req, res) => {617 const status = {618 status: 'UP',619 timestamp: new Date().toISOString(),620 uptime: process.uptime(),621 memoryUsage: process.memoryUsage(),622 version: process.env.npm_package_version623 };624625 // Add database health check626 try {627 // Check database connection628 status.database = { status: 'UP' };629 } catch (error) {630 status.database = { status: 'DOWN', error: error.message };631 status.status = 'DEGRADED';632 }633634 // Add external service health checks635 // ...636637 // Log health check results638 logger.debug({639 message: 'Health check performed',640 result: status641 });642643 const statusCode = status.status === 'UP' ? 200 :644 status.status === 'DEGRADED' ? 200 : 503;645646 res.status(statusCode).json(status);647 });648649 // Detailed readiness probe650 app.get('/ready', async (req, res) => {651 const checks = [];652 let isReady = true;653654 // Check database655 try {656 await db.ping();657 checks.push({ component: 'database', status: 'ready' });658 } catch (error) {659 isReady = false;660 checks.push({661 component: 'database',662 status: 'not ready',663 error: error.message664 });665 }666667 // Check cache668 try {669 await cache.ping();670 checks.push({ component: 'cache', status: 'ready' });671 } catch (error) {672 isReady = false;673 checks.push({674 component: 'cache',675 status: 'not ready',676 error: error.message677 });678 }679680 // Log readiness check681 logger.debug({682 message: 'Readiness check performed',683 isReady,684 checks685 });686687 res.status(isReady ? 200 : 503).json({688 status: isReady ? 'ready' : 'not ready',689 checks,690 timestamp: new Date().toISOString()691 });692 });693```694695 15. **Rate Limiting with Logging:**696 - Log rate limit events697 - Track potential abuse698 - Example:699```javascript700 const rateLimit = require('express-rate-limit');701702 // Create rate limiter with logging703 const apiLimiter = rateLimit({704 windowMs: 15 * 60 * 1000, // 15 minutes705 max: 100, // limit each IP to 100 requests per windowMs706 standardHeaders: true,707 legacyHeaders: false,708 handler: (req, res, next, options) => {709 // Log rate limit exceeded710 logger.warn({711 message: 'Rate limit exceeded',712 ip: req.ip,713 path: req.path,714 method: req.method,715 userAgent: req.headers['user-agent'],716 currentLimit: options.max,717 windowMs: options.windowMs,718 correlationId: req.correlationId,719 userId: req.user?.id,720 timestamp: new Date().toISOString()721 });722723 res.status(options.statusCode).json({724 status: 'error',725 message: options.message726 });727 },728 // Called on all requests to track usage729 onLimitReached: (req, res, options) => {730 // This is called when a client hits the rate limit731 logger.warn({732 message: 'Client reached rate limit',733 ip: req.ip,734 path: req.path,735 method: req.method,736 userAgent: req.headers['user-agent'],737 correlationId: req.correlationId,738 userId: req.user?.id,739 timestamp: new Date().toISOString()740 });741742 // Consider additional actions like temporary IP ban743 // or sending alerts for potential attacks744 }745 });746747 // Apply to all API routes748 app.use('/api/', apiLimiter);749```750751 - type: validate752 conditions:753 # Check 1: Structured Logging754 - pattern: "(?:winston|pino|bunyan|loglevel|morgan|log4js)"755 message: "Using a structured logging library."756757 # Check 2: Error Logging758 - pattern: "try\\s*{[^}]*}\\s*catch\\s*\\([^)]*\\)\\s*{[^}]*(?:logger?\\.error|captureException)\\s*\\([^)]*\\)"759 message: "Implementing proper error logging in catch blocks."760761 # Check 3: Sensitive Data Handling762 - pattern: "(?:redact|mask|sanitize|filter)\\s*\\([^)]*(?:password|token|secret|key|credential)"763 message: "Implementing sensitive data redaction in logs."764765 # Check 4: Correlation IDs766 - pattern: "(?:correlationId|requestId|traceId)"767 message: "Using correlation IDs for request tracing."768769 # Check 5: Monitoring Integration770 - pattern: "(?:sentry|newrelic|datadog|appinsights|loggly|splunk|elasticsearch)"771 message: "Integrating with monitoring or log aggregation services."772773metadata:774 priority: high775 version: 1.0776 tags:777 - security778 - javascript779 - nodejs780 - browser781 - logging782 - monitoring783 - owasp784 - language:javascript785 - framework:express786 - framework:react787 - framework:vue788 - framework:angular789 - category:security790 - subcategory:logging791 - standard:owasp-top10792 - risk:a09-security-logging-monitoring-failures793 references:794 - "https://owasp.org/Top10/A09_2021-Security_Logging_and_Monitoring_Failures/"795 - "https://cheatsheetseries.owasp.org/cheatsheets/Logging_Cheat_Sheet.html"796 - "https://owasp.org/www-project-web-security-testing-guide/latest/4-Web_Application_Security_Testing/10-Business_Logic_Testing/08-Test_for_Process_Timing"797 - "https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Logging_Vocabulary_Cheat_Sheet.md"798 - "https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html#security-logging-monitoring"799 - "https://cheatsheetseries.owasp.org/cheatsheets/Application_Logging_Vocabulary_Cheat_Sheet.html"800 - "https://cheatsheetseries.owasp.org/cheatsheets/Transaction_Authorization_Cheat_Sheet.html#monitor-activity"801</rule>802
Also in ivangrynenko/cursorrules
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| ivangrynenko/cursorrules.cursor/rules/accessibility-standards.mdc · 86 | Cursor rules | ui | 44/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/api-standards.mdc · 86 | Cursor rules | api | 44/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/behat-steps.mdc · 86 | Cursor rules | lint-formatstyleperformanceagent-behaviour | 42/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/build-optimization.mdc · 86 | Cursor rules | build | 48/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/confluence-editing-standards.mdc · 86 | Cursor rules | stylearchsecuritydeployment | 60/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/debugging-standards.mdc · 86 | Cursor rules | no sections | 30/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/docker-compose-standards.mdc · 86 | Cursor rules | style | 62/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-broken-access-control.mdc · 86 | Cursor rules | stylesecurity | 52/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-cryptographic-failures.mdc · 86 | Cursor rules | security | 48/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-database-standards.mdc · 86 | Cursor rules | database | 30/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-injection.mdc · 86 | Cursor rules | securitydo-not | 55/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-insecure-design.mdc · 86 | Cursor rules | security | 48/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-integrity-failures.mdc · 86 | Cursor rules | style | 60/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-logging-failures.mdc · 86 | Cursor rules | security | 48/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-security-misconfiguration.mdc · 86 | Cursor rules | security | 48/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/drupal-vulnerable-components.mdc · 86 | Cursor rules | stylesecurity | 67/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/git-commit-standards.mdc · 86 | Cursor rules | git | 44/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/github-actions-standards.mdc · 86 | Cursor rules | no sections | 44/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/improve-cursorrules-efficiency.mdc · 86 | Cursor rules | no sections | 34/100 | 3 days ago | |
| ivangrynenko/cursorrules.cursor/rules/javascript-cryptographic-failures.mdc · 86 | Cursor rules | security | 40/100 | 3 days ago |
Diff against .cursor/rules/accessibility-standards.mdc Diff against .cursor/rules/api-standards.mdc Diff against .cursor/rules/behat-steps.mdc Diff against .cursor/rules/build-optimization.mdc Diff against .cursor/rules/confluence-editing-standards.mdc Diff against .cursor/rules/debugging-standards.mdc Diff against .cursor/rules/docker-compose-standards.mdc Diff against .cursor/rules/drupal-broken-access-control.mdc Diff against .cursor/rules/drupal-cryptographic-failures.mdc Diff against .cursor/rules/drupal-database-standards.mdc Diff against .cursor/rules/drupal-injection.mdc Diff against .cursor/rules/drupal-insecure-design.mdc Diff against .cursor/rules/drupal-integrity-failures.mdc Diff against .cursor/rules/drupal-logging-failures.mdc Diff against .cursor/rules/drupal-security-misconfiguration.mdc Diff against .cursor/rules/drupal-vulnerable-components.mdc Diff against .cursor/rules/git-commit-standards.mdc Diff against .cursor/rules/github-actions-standards.mdc Diff against .cursor/rules/improve-cursorrules-efficiency.mdc Diff against .cursor/rules/javascript-cryptographic-failures.mdc
Similar configs
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45 | Cursor rules | testlint-formatstylearch+5 | 100/100 | 3 days ago | |
| hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126 | Cursor rules | setupbuildtestlint-format+6 | 100/100 | 3 days ago | |
| langflow-ai/langflow.cursor/rules/docs_development.mdc · 153k | Cursor rules | setupbuildtestlint-format+7 | 97/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45 | Cursor rules | teststyletesting-strategysecurity+3 | 97/100 | 3 days ago | |
| skillrecordings/egghead-next.cursor/rules/project-update-user-rules.mdc · 1.4k | Cursor rules | buildtestlint-formatstyle+7 | 96/100 | 3 days ago | |
| nerds-odd-e/doughnut.cursor/rules/cli.mdc · 49 | Cursor rules | setupbuildteststyle+4 | 96/100 | 3 days ago | |
| skillrecordings/egghead-next.cursor/rules/gh-task-plan.mdc · 1.4k | Cursor rules | teststylearchtypes+2 | 96/100 | 3 days ago | |
| skillrecordings/egghead-next.cursor/rules/project-update-rules.mdc · 1.4k | Cursor rules | buildtestlint-formatstyle+7 | 96/100 | 3 days ago |
